<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Python Finance - Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</title>
	<atom:link href="https://python.ivan-shamaev.ru/tag/python-finance/feed/" rel="self" type="application/rss+xml" />
	<link>https://python.ivan-shamaev.ru/tag/python-finance/</link>
	<description>Библиотеки обработки данных. Примеры. Строки, списки, файлы, числа, массивы. Язык программирования Python 3 - скачать</description>
	<lastBuildDate>Fri, 06 Dec 2019 21:47:37 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.1</generator>

<image>
	<url>https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/cropped-data_science_python3_logo-32x32.png</url>
	<title>Python Finance - Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</title>
	<link>https://python.ivan-shamaev.ru/tag/python-finance/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Python 3 Tutorial &#8212; Data Wrangling &#8212; Обработка данных по криптовалютам</title>
		<link>https://python.ivan-shamaev.ru/python-data-wrangling-tutorial-for-cryptocurrency/</link>
					<comments>https://python.ivan-shamaev.ru/python-data-wrangling-tutorial-for-cryptocurrency/#respond</comments>
		
		<dc:creator><![CDATA[Шамаев Иван]]></dc:creator>
		<pubDate>Fri, 29 Nov 2019 22:30:33 +0000</pubDate>
				<category><![CDATA[Pandas. Обработка данных]]></category>
		<category><![CDATA[Python Finance]]></category>
		<category><![CDATA[Cryptocurrency Data Wrangling]]></category>
		<category><![CDATA[Data Wrangling]]></category>
		<category><![CDATA[Data Wrangling Tutorial]]></category>
		<category><![CDATA[Python Cryptocurrency]]></category>
		<category><![CDATA[Python Data Wrangling]]></category>
		<category><![CDATA[Python For Finance]]></category>
		<category><![CDATA[Python Tutorial]]></category>
		<category><![CDATA[Обработка данных по криптовалютам]]></category>
		<guid isPermaLink="false">https://python.ivan-shamaev.ru/?p=366</guid>

					<description><![CDATA[<p>Вводная часть по Python 3 Tutorial &#8212; Data Wrangling Биткойн и криптовалюта сейчас в тренде&#8230; но как специалисты по данным, мы эмпиристы, верно? Мы не хотим просто поверить на слово другим&#8230; мы хотим посмотреть на данные из первых рук! В этом уроке будут описаны общие и мощные методы обработки данных в Python. Python 3 Tutorial [&#8230;]</p>
<p>Сообщение <a href="https://python.ivan-shamaev.ru/python-data-wrangling-tutorial-for-cryptocurrency/">Python 3 Tutorial &#8212; Data Wrangling &#8212; Обработка данных по криптовалютам</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-data-wrangling-tutorial-for-cryptocurrency%2F&#038;title=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" data-a2a-url="https://python.ivan-shamaev.ru/python-data-wrangling-tutorial-for-cryptocurrency/" data-a2a-title="Python 3 Tutorial — Data Wrangling — Обработка данных по криптовалютам"></a></p><h2><strong>Вводная часть по Python 3 Tutorial &#8212; Data Wrangling</strong></h2>
<p><strong>Биткойн и криптовалюта сейчас в тренде</strong>&#8230; но как специалисты по данным, мы эмпиристы, верно? Мы не хотим просто поверить на слово другим&#8230; мы хотим посмотреть на данные из первых рук! <strong>В этом уроке будут описаны общие и мощные методы обработки данных в Python.</strong></p>
<blockquote>
<p><span style="color: #993366;"><em>Python 3 Tutorial &#8212; Data Wrangling</em></span></p>
</blockquote>
<p>Вообще говоря, <strong>обработка данных (Data Wrangling)</strong> &#8212; это процесс преобразования, агрегирования, разделения или иного преобразования ваших данных из одного формата в более подходящий.</p>
<p>Например, мы хотим <strong>провести пошаговый анализ очень элементарной торговой стратегии</strong>, которая выглядит следующим образом:</p>
<ol>
<li>В начале каждого месяца мы покупаем криптовалюту, которая имела наибольший прирост цены за последние 7, 14, 21 или 28 дней. Мы хотим оценить каждое из этих временных окон.</li>
<li>Затем мы держим ровно 7 дней и продаем нашу позицию. Обратите внимание: это целенаправленно простая стратегия, которая предназначена только для иллюстративных целей.</li>
</ol>
<p><strong>Как мы будем оценивать эту стратегию?</strong></p>
<p>Это хороший вопрос для демонстрации методов обработки данных, потому что вся тяжелая работа заключается в преобразовании вашего набора данных в правильный формат. Когда у вас есть соответствующая аналитическая базовая таблица (analytical base table, ABT), ответить на вопрос становится просто.</p>
<p><strong>Чем это руководство не является:</strong></p>
<p>Это не руководство по инвестиционным или торговым стратегиям, и не призыв за или против торговли криптовалютами. Потенциальные инвесторы должны самостоятельно формировать свои взгляды, но в этом руководстве будут представлены инструменты для этого.</p>
<p>Опять же, основное внимание в этом руководстве уделяется методам обработки данных и возможности преобразования необработанных наборов данных в форматы, которые помогут вам ответить на интересные вопросы.</p>
<p><strong>Быстрый совет, прежде чем мы начнем:</strong></p>
<p>Этот учебник предназначен для быстрого ознакомления, и он не будет охватывать ни одну тему слишком подробно. Ознакомьтесь дополнительно с <a href="https://python.ivan-shamaev.ru/pandas-series-and-dataframe-objects-build-index/" target="_blank" rel="noopener noreferrer"><strong>Tutorial по библиотеке Pandas</strong></a>.</p>
<h2><strong>Содержание учебника по обработке данных Python &#8212; Data Wrangling Tutorial</strong></h2>
<p><strong>Вот шаги, которые мы пройдем в рамках нашего анализа:</strong></p>
<ol>
<li>Настройка среды.</li>
<li>Импорт библиотек и наборов данных.</li>
<li>Первичное знакомство с данными.</li>
<li>Фильтр нежелательных наблюдений (подмножеств).</li>
<li>Вращение набора данных &#8212; Pivot the dataset.</li>
<li>Сдвиг развернутого набора данных &#8212; Shift the pivoted dataset.</li>
<li>Melt сдвинутого набора данных &#8212; Melt the shifted dataset.</li>
<li>Уменьшение-объединение (Reduce-merge) melted data.</li>
<li>Агрегация данных с помощью group-by.</li>
</ol>
<h3><strong>Шаг 1. Настройка среды программирования Python</strong></h3>
<p><strong>Сначала убедитесь, что на вашем компьютере установлено ПО:</strong></p>
<ul>
<li>Python 2.7+ или Python 3</li>
<li>Pandas</li>
<li>Jupyter Notebook (необязательно, но рекомендуется)</li>
</ul>
<p>Мы настоятельно рекомендуем установить дистрибутив <a href="https://www.anaconda.com/" target="_blank" rel="noopener noreferrer"><strong>Anaconda</strong></a>, который поставляется со всеми этими пакетами. Просто следуйте инструкциям на этой странице загрузки.</p>
<blockquote>
<p><strong>Jupyter Notebook</strong> – это бесплатная интерактивная оболочка для языка программирования <strong>Python</strong>, позволяющая объединить <em><strong>код, изображения, комментарии, формулы и графики/диаграммы</strong></em>.</p>
</blockquote>
<p>После установки Anaconda запустите Jupyter Notebook (Anaconda3):</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_jupyter_notebook_anaconda3.png"><img fetchpriority="high" decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_jupyter_notebook_anaconda3.png" alt="" width="513" height="678" class="aligncenter size-full wp-image-381" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_jupyter_notebook_anaconda3.png 513w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_jupyter_notebook_anaconda3-227x300.png 227w" sizes="(max-width: 513px) 100vw, 513px" /></a></p>
<p>Откроется окно в браузере. В нем создайте новое окно Python3:</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_create_new_notebook_with_python3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_create_new_notebook_with_python3.png" alt="" width="1365" height="425" class="aligncenter size-full wp-image-382" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_create_new_notebook_with_python3.png 1365w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_create_new_notebook_with_python3-300x93.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_create_new_notebook_with_python3-1024x319.png 1024w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_create_new_notebook_with_python3-768x239.png 768w" sizes="(max-width: 1365px) 100vw, 1365px" /></a></p>
<p>Откроется новая вкладка, на ней Вы можете поменять название документа.</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_jupyter_new_doc_name_line_program.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_jupyter_new_doc_name_line_program.png" alt="" width="852" height="337" class="aligncenter size-full wp-image-384" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_jupyter_new_doc_name_line_program.png 852w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_jupyter_new_doc_name_line_program-300x119.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_jupyter_new_doc_name_line_program-768x304.png 768w" sizes="(max-width: 852px) 100vw, 852px" /></a></p>
<h4>Интерфейс Jupyter Notebook</h4>
<p><strong>В Jupyter Notebook</strong> есть два важных термина: <strong>cells (ячейки)</strong> и <strong>kernels (ядра)</strong> являются ключом как к пониманию Jupyter.</p>
<ul>
<li><strong>kernel (Ядро)</strong> – это <strong>«вычислительный движок»</strong>, который выполняет код, содержащийся в документе Notebook.</li>
<li><strong>cell (Ячейка)</strong> – это контейнер для текста, который будет отображаться в Notebook, или код, который будет выполняться ядром записной книжки.</li>
</ul>
<h4><strong>Запуск и прерывание выполнения кода в Jupyter Notebook</strong></h4>
<p><span>Если ваша программа зависла, то можно прервать ее выполнение выбрав на панели меню пункт <strong>Kernel -&gt; Interrupt.</strong></span></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/jupyter_kernel_interrupt.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/jupyter_kernel_interrupt.png" alt="" width="746" height="246" class="aligncenter size-full wp-image-422" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/jupyter_kernel_interrupt.png 746w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/jupyter_kernel_interrupt-300x99.png 300w" sizes="(max-width: 746px) 100vw, 746px" /></a></p>
<p><span>Для добавления новой ячейки используйте <strong>Insert-&gt;Insert Cell Above</strong> и <strong>Insert-&gt;Insert Cell Below</strong>.</span></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/jupyter_insert_cell_above_below.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/jupyter_insert_cell_above_below.png" alt="" width="589" height="182" class="aligncenter size-full wp-image-424" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/jupyter_insert_cell_above_below.png 589w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/jupyter_insert_cell_above_below-300x93.png 300w" sizes="(max-width: 589px) 100vw, 589px" /></a></p>
<p><span>Для запуска ячейки используете команды из меню <strong>Cell</strong>, либо следующие сочетания клавиш:</span></p>
<ul>
<li><span><strong>Ctrl+Enter</strong> – выполнить содержимое ячейки.</span></li>
<li><span><strong>Shift+Enter</strong> – выполнить содержимое ячейки и перейти на ячейку ниже.</span></li>
<li><span><strong>Alt+Enter</strong> – выполнить содержимое ячейки и вставить новую ячейку ниже.</span></li>
</ul>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/jupyter_cell_run_cells_all_above_below_menu_python3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/jupyter_cell_run_cells_all_above_below_menu_python3.png" alt="" width="558" height="309" class="aligncenter size-full wp-image-425" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/jupyter_cell_run_cells_all_above_below_menu_python3.png 558w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/jupyter_cell_run_cells_all_above_below_menu_python3-300x166.png 300w" sizes="(max-width: 558px) 100vw, 558px" /></a></p>
<h3><strong>Шаг 2: Импортируем библиотеки и загружаем набор данных</strong></h3>
<p>Сначала мы импортируем библиотеку Pandas (лучшая библиотека для обработки реляционных наборов данных в табличном формате).<br>Библиотеке Pandas мы дадим alias (псевдоним). Позже мы сможем вызывать библиотеку с помощью pd.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Pandas for managing datasets
import pandas as pd</pre>
<p>Далее, давайте немного подправим параметры отображения чисел. Во-первых, давайте отобразим числа с плавающей точкой с двумя десятичными разрядами, чтобы сделать таблицы менее загруженными. Не волнуйтесь &#8212; это только настройка дисплея, которая не снижает основную точность. Давайте также расширим ограничения на количество отображаемых строк и столбцов.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Display floats with 2 decimal places
pd.options.display.float_format = '{:,.2f}'.format
 
# Expand display limits
pd.options.display.max_rows = 200
pd.options.display.max_columns = 100</pre>
<p>В этом уроке мы будем использовать набор данных о ценах Brave New Coin и распространяемый в Quandl. Полная версия отслеживает индексы цен для 1900+ фиат-крипто трейдинговых пар, но требует премиальной подписки, поэтому мы предоставили небольшую выборку с небольшим количеством криптовалют.</p>
<p>Чтобы использовать набор данных в своей программе скачайте файл <strong><a href="https://drive.google.com/file/d/1zgKTySGWDzrf4OE9Cs22ueS0_ZNg69YJ/view?usp=sharing" target="_blank" rel="noopener noreferrer">BNC2_sample.csv</a></strong>.</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_dataset_crypto.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_dataset_crypto.png" alt="" width="1365" height="505" class="aligncenter size-full wp-image-393" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_dataset_crypto.png 1365w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_dataset_crypto-300x111.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_dataset_crypto-1024x379.png 1024w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_dataset_crypto-768x284.png 768w" sizes="(max-width: 1365px) 100vw, 1365px" /></a></p>
<p>После того, как вы скачали набор данных, разместите его в том же каталоге, что и сохраненный блокнот.</p>
<p>Набор данных можно загрузить как непосредственно в директорию на диске в windows:</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_directory.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_directory.png" alt="" width="835" height="395" class="aligncenter size-full wp-image-395" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_directory.png 835w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_directory-300x142.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_directory-768x363.png 768w" sizes="(max-width: 835px) 100vw, 835px" /></a></p>
<p>Также можно загрузить файл из интерфейса Jupyter:</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_upload_dataset_file_into_jupyter_folder.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_upload_dataset_file_into_jupyter_folder.png" alt="" width="1365" height="584" class="aligncenter size-full wp-image-396" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_upload_dataset_file_into_jupyter_folder.png 1365w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_upload_dataset_file_into_jupyter_folder-300x128.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_upload_dataset_file_into_jupyter_folder-1024x438.png 1024w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_upload_dataset_file_into_jupyter_folder-768x329.png 768w" sizes="(max-width: 1365px) 100vw, 1365px" /></a></p>
<p>Если Вы все правильно сделали, то файл разместится рядом с вашим проектом:</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_zagruzenniy_dataset_v_directoriu.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_zagruzenniy_dataset_v_directoriu.png" alt="" width="1168" height="303" class="aligncenter size-full wp-image-397" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_zagruzenniy_dataset_v_directoriu.png 1168w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_zagruzenniy_dataset_v_directoriu-300x78.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_zagruzenniy_dataset_v_directoriu-1024x266.png 1024w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_zagruzenniy_dataset_v_directoriu-768x199.png 768w" sizes="(max-width: 1168px) 100vw, 1168px" /></a></p>
<p>Далее запускаем следующий код, чтобы прочитать набор данных из csv файла и создать DataFrame (набор данных библиотеки Pandas). Далее выводим примеры записей.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Read BNC2 sample dataset
df = pd.read_csv('BNC2_sample.csv',
                 names=['Code', 'Date', 'Open', 'High', 'Low', 
                        'Close', 'Volume', 'VWAP', 'TWAP'])
 
# Display first 5 observations
df.head()</pre>
<p><strong>Запускаем наш скрипт и получим следующий результат:</strong></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_run_script_python_pandas.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_run_script_python_pandas.png" alt="" width="739" height="438" class="aligncenter size-full wp-image-402" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_run_script_python_pandas.png 739w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_run_script_python_pandas-300x178.png 300w" sizes="(max-width: 739px) 100vw, 739px" /></a></p>
<p>Обратите внимание, что мы используем аргумент <code class="EnlighterJSRAW" data-enlighter-language="python">names =</code> для <code class="EnlighterJSRAW" data-enlighter-language="python">pd.read_csv()</code>, чтобы установить наши собственные имена столбцов, потому что исходный набор данных не содержит заголовка таблицы (наименования столбцов).</p>
<p><strong>Словарь данных (для кода GWA_BTC):</strong></p>
<ul>
<li><strong>Date:</strong> день, в который были рассчитаны значения индекса.</li>
<li><strong>Open:</strong> дневной индекс цен на биткойны в долларах США.</li>
<li><strong>High:</strong> максимальное значение индекса цен на биткойны в долларах США за день на дату.</li>
<li><strong>Low:</strong> самое низкое значение индекса цен на биткойны в долларах США за день на дату.</li>
<li><strong>Close:</strong> дневной индекс цен на биткойны в долларах США.</li>
<li><strong>Volume:</strong> объем торговли биткойнами в этот день.</li>
<li><strong>VWAP:</strong> средневзвешенная цена за биткойн, торгуемая в этот день.</li>
<li><strong>TWAP:</strong> средневзвешенная по времени цена Биткойна, торгуемая в этот день.</li>
</ul>
<h3 id="step-3"><strong>Шаг 3: Понимание данных. Изучение данных</strong></h3>
<p><span>Одна из наиболее распространенных причин для обработки данных &#8212; это когда «слишком много» информации упаковано в одну таблицу, особенно при работе с данными временных рядов.</span></p>
<p><strong><span>Как правило, все наблюдения (записи/транзакции) должны быть эквивалентны по степени&nbsp;</span><span>детализации</span><span>&nbsp;и в </span><span>единицах</span><span> измерения.</span></strong></p>
<p><span>Существуют исключения, но по большей части это правило поможет вам избежать многих головных болей.</span></p>
<ul>
<li><strong><span>Эквивалентность в гранулярности &#8212;&nbsp;</span></strong><span>&nbsp;например, вы можете иметь 10 строк данных по 10 разным криптовалютам.&nbsp;Однако у вас&nbsp;</span><strong><span>не</span></strong><span>&nbsp;должно быть 11-й строки со средними или суммарными значениями из других 10 строк.&nbsp;Эта 11-я строка будет&nbsp;</span><em><span>агрегацией </span></em><span>и, следовательно, не эквивалентна по гранулярности с другими 10.</span></li>
<li><strong><span>Эквивалентность в единицах &#8212; у</span></strong><span>&nbsp;вас может быть 10 строк с ценами в долларах США, собранных на разные даты.&nbsp;Однако у вас&nbsp;</span><strong><span>не</span></strong><span>&nbsp;должно быть еще 10 строк с ценами, указанными в евро.&nbsp;Любые агрегаты, распределения, визуализации или статистика станут бессмысленными.</span></li>
</ul>
<p><strong><span>Наш текущий набор необработанных данных нарушает оба эти правила!</span></strong></p>
<p><span>Данные, хранящиеся в CSV-файлах или базах данных, часто имеют формат «стопки» или «запись».&nbsp;Они используют один столбец&nbsp;</span><span id="crayon-5de292fa5d0bd739628329" class="crayon-syntax crayon-syntax-inline  crayon-theme-classic crayon-theme-classic-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-s"><span>«Код»</span></span></span></span><span>&nbsp;в качестве универсального для метаданных.&nbsp;Например, в примере набора данных у нас есть следующие коды:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Unique codes in the dataset
print( df.Code.unique() )</pre>
<p><strong>Результат выполнения:</strong></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step3_code_unique_in_dataset.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step3_code_unique_in_dataset.png" alt="" width="617" height="176" class="aligncenter size-full wp-image-407" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step3_code_unique_in_dataset.png 617w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step3_code_unique_in_dataset-300x86.png 300w" sizes="(max-width: 617px) 100vw, 617px" /></a></p>
<p><span>Во-первых, посмотрите, что некоторые коды начинаются с&nbsp;</span><strong><span>GWA,</span></strong><span>&nbsp;а другие &#8212; с&nbsp;</span><strong><span>MWA</span></strong><span>?&nbsp;На самом деле это абсолютно разные типы индикаторов согласно&nbsp;</span><strong><a href="https://www.quandl.com/data/BNC2-BNC-Digital-Currency-Indexed-EOD/documentation/introduction" target="_blank" rel="noopener noreferrer">странице документации</a></strong><span>.</span></p>
<ul>
<li><span>MWA означает <strong>«</strong></span><strong>средневзвешенное значение</strong><span><strong>&nbsp;по&nbsp;рынку»</strong>, и они показывают региональные цены.&nbsp;Существует несколько кодов MWA для каждой криптовалюты, по одному на каждую местную фиатную валюту.</span></li>
<li><span>С другой стороны, GWA означает <strong>«</strong></span><strong>средневзвешенное значение по</strong><span><strong>&nbsp;всему миру»</strong>, которое показывает глобально проиндексированные цены. Таким образом, GWA &#8212; это совокупность MWA, а не эквивалентность по гранулярности. (Примечание: в образец набора данных включен только поднабор региональных кодов MWA)</span></li>
</ul>
<p><strong>Например, давайте посмотрим на коды Биткойн в ту же дату:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Example of GWA and MWA relationship
df[df.Code.isin(['GWA_BTC', 'MWA_BTC_JPY', 'MWA_BTC_EUR']) &amp; (df.Date == '2018-01-01')]</pre>
<p>&nbsp;Результат выполнения команды:</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step3_example_GWA_MWA_relationship.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step3_example_GWA_MWA_relationship.png" alt="" width="889" height="187" class="aligncenter size-full wp-image-411" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step3_example_GWA_MWA_relationship.png 889w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step3_example_GWA_MWA_relationship-300x63.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step3_example_GWA_MWA_relationship-768x162.png 768w" sizes="(max-width: 889px) 100vw, 889px" /></a><span>Как видите, у нас есть несколько записей для криптовалюты на данную дату.&nbsp;Чтобы еще больше усложнить ситуацию, региональные данные MWA выражены в местной валюте (то есть в неэквивалентных единицах), поэтому вам также понадобятся исторические обменные курсы.</span></p>
<p><span style="color: #000000;"><strong>Наличие разных уровней детализации и/или разных единиц делает анализ в лучшем случае громоздким, а в худшем &#8212; невозможным.</strong></span></p>
<p><span>К счастью, как только мы обнаружили эту проблему, исправить ее на самом деле тривиально!</span></p>
<h3 id="step-4"><strong>Шаг 4: Отфильтруем нежелательные наблюдения (записи/строки)</strong></h3>
<p><span>Одним из самых простых, но наиболее полезных методов обработки данных является удаление нежелательных наблюдений.</span></p>
<p><span>На предыдущем этапе мы узнали, что коды <strong>GWA</strong> являются агрегированием региональных кодов <strong>MWA</strong>.&nbsp;Поэтому для проведения нашего анализа нам нужно только сохранить глобальные коды GWA:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Number of observations in dataset
print( 'Before:', len(df) )
 
# Get all the GWA codes
gwa_codes = [code for code in df.Code.unique() if 'GWA_' in code]
 
# Only keep GWA observations
df = df[df.Code.isin(gwa_codes)]
 
# Number of observations left
print( 'After:', len(df) )</pre>
<p><strong>Результат работы скрипта Python 3</strong> в Jupyter Notebook:</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step4_keep_only_GWA_observations_check_number_of_observations.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step4_keep_only_GWA_observations_check_number_of_observations.png" alt="" width="590" height="256" class="aligncenter size-full wp-image-414" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step4_keep_only_GWA_observations_check_number_of_observations.png 590w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step4_keep_only_GWA_observations_check_number_of_observations-300x130.png 300w" sizes="(max-width: 590px) 100vw, 590px" /></a></p>
<p><span>Теперь, когда у нас остались только коды GWA, все наши наблюдения эквивалентны по степени детализации и единицах измерения.&nbsp;</span><span>Мы можем продолжать обработку данных.</span></p>
<h3><strong>Шаг 5: Pivot the dataset &#8212; Развернем набор данных</strong></h3>
<p>Далее, чтобы проанализировать нашу стратегию торговли по импульсам, описанную выше, для каждой криптовалюты нам потребуется рассчитать <strong>доходность за предыдущие 7, 14, 21 и 28 дней</strong> для первого дня каждого месяца.</p>
<p>Тем не менее, было бы очень сложно производить этот расчет с текущим <strong>«сложенным» набором данных (&#171;stacked&#187; dataset)</strong>. Это потребует написания вспомогательных функций, циклов и множества условной логики. Вместо этого мы будем использовать более элегантный подход.</p>
<p>Во-первых, мы повернем набор данных, оставив только один ценовой столбец. В этом уроке мы сохраним столбец VWAP (средневзвешенная цена).</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Pivot dataset
pivoted_df = df.pivot(index='Date', columns='Code', values='VWAP')
 
# Display examples from pivoted dataset
pivoted_df.tail()</pre>
<p><strong>Результат:</strong></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step5_pivot_dataset_display_example_from_pivoted_dataset.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step5_pivot_dataset_display_example_from_pivoted_dataset.png" alt="" width="597" height="316" class="aligncenter size-full wp-image-419" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step5_pivot_dataset_display_example_from_pivoted_dataset.png 597w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step5_pivot_dataset_display_example_from_pivoted_dataset-300x159.png 300w" sizes="(max-width: 597px) 100vw, 597px" /></a></p>
<p>Как видите, каждый столбец в нашем сводном наборе данных (pivoted dataset) теперь представляет цену за одну криптовалюту, а каждая строка содержит цены за одну дату. Все объекты теперь выровнены по дате.</p>
<h3><strong>Шаг 6: Сдвиг развернутого набора данных &#8212; Shift the pivoted dataset</strong></h3>
<p>Чтобы легко рассчитать <strong>returns</strong> за предыдущие <strong>7, 14, 21 и 28 дней</strong>, мы можем использовать <strong>метод shift из библиотеки Pandas</strong>.</p>
<p>Эта функция сдвигает индекс dataframe на указанное количество периодов. Например, вот что происходит, когда мы сдвигаем наш pivoted dataset на 1:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">print( pivoted_df.tail(3) )</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_1.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_1.png" alt="" width="585" height="151" class="aligncenter size-full wp-image-429" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_1.png 585w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_1-300x77.png 300w" sizes="(max-width: 585px) 100vw, 585px" /></a></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">print( pivoted_df.tail(3).shift(1) )</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_2.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_2.png" alt="" width="530" height="136" class="aligncenter size-full wp-image-431" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_2.png 530w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_2-300x77.png 300w" sizes="(max-width: 530px) 100vw, 530px" /></a></p>
<p>Обратите внимание, как смещенный набор данных теперь имеет значения за 1 день до этого? Мы можем воспользоваться этим, чтобы рассчитать prior returns для 7, 14, 21, 28 дней.</p>
<p>Например, для расчета доходности за 7 дней этого нам понадобится <code class="EnlighterJSRAW" data-enlighter-language="python">prices_today / prices_7_days_ago - 1.0</code>, что означает:</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_3_calc_return_over_7_days_prior.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_3_calc_return_over_7_days_prior.png" alt="" width="532" height="308" class="aligncenter size-full wp-image-432" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_3_calc_return_over_7_days_prior.png 532w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_3_calc_return_over_7_days_prior-300x174.png 300w" sizes="(max-width: 532px) 100vw, 532px" /></a></p>
<p>Рассчитать <strong>returns</strong> для всех наших периодов так же просто, как написать цикл и сохранить его в словаре:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Calculate returns over each window and store them in dictionary
delta_dict = {}
for offset in [7, 14, 21, 28]:
    delta_dict['delta_{}'.format(offset)] = pivoted_df / pivoted_df.shift(offset) - 1.0

# Display result "delta_dict"
delta_dict</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_4_calc_return_over_each_period.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_4_calc_return_over_each_period.png" alt="" width="806" height="527" class="aligncenter size-full wp-image-433" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_4_calc_return_over_each_period.png 806w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_4_calc_return_over_each_period-300x196.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_4_calc_return_over_each_period-768x502.png 768w" sizes="(max-width: 806px) 100vw, 806px" /></a></p>
<p>Полный список результата (out):</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">{'delta_7': Code        GWA_BTC  GWA_ETH  GWA_LTC  GWA_XLM  GWA_XRP
 Date                                                   
 2014-04-01      nan      nan      nan      nan      nan
 2014-04-02      nan      nan      nan      nan      nan
 2014-04-03      nan      nan      nan      nan      nan
 2014-04-04      nan      nan      nan      nan      nan
 2014-04-05      nan      nan      nan      nan      nan
 ...             ...      ...      ...      ...      ...
 2018-01-19    -0.18    -0.17    -0.18    -0.21    -0.22
 2018-01-20    -0.13    -0.19    -0.18    -0.23    -0.29
 2018-01-21    -0.15    -0.20    -0.22    -0.22    -0.30
 2018-01-22    -0.21    -0.24    -0.24    -0.25    -0.32
 2018-01-23    -0.11    -0.12    -0.13    -0.02    -0.04
 
 [1394 rows x 5 columns],
 'delta_14': Code        GWA_BTC  GWA_ETH  GWA_LTC  GWA_XLM  GWA_XRP
 Date                                                   
 2014-04-01      nan      nan      nan      nan      nan
 2014-04-02      nan      nan      nan      nan      nan
 2014-04-03      nan      nan      nan      nan      nan
 2014-04-04      nan      nan      nan      nan      nan
 2014-04-05      nan      nan      nan      nan      nan
 ...             ...      ...      ...      ...      ...
 2018-01-19    -0.29     0.05    -0.23    -0.27    -0.41
 2018-01-20    -0.26     0.13    -0.29    -0.26    -0.42
 2018-01-21    -0.29    -0.01    -0.32    -0.31    -0.51
 2018-01-22    -0.29    -0.13    -0.30    -0.28    -0.52
 2018-01-23    -0.31    -0.22    -0.32    -0.24    -0.48
 
 [1394 rows x 5 columns],
 'delta_21': Code        GWA_BTC  GWA_ETH  GWA_LTC  GWA_XLM  GWA_XRP
 Date                                                   
 2014-04-01      nan      nan      nan      nan      nan
 2014-04-02      nan      nan      nan      nan      nan
 2014-04-03      nan      nan      nan      nan      nan
 2014-04-04      nan      nan      nan      nan      nan
 2014-04-05      nan      nan      nan      nan      nan
 ...             ...      ...      ...      ...      ...
 2018-01-19    -0.22     0.42    -0.24     0.88     0.02
 2018-01-20    -0.05     0.60    -0.09     0.57    -0.26
 2018-01-21    -0.11     0.51    -0.12     0.47    -0.28
 2018-01-22    -0.19     0.36    -0.19     0.05    -0.35
 2018-01-23    -0.25     0.13    -0.29    -0.10    -0.39
 
 [1394 rows x 5 columns],
 'delta_28': Code        GWA_BTC  GWA_ETH  GWA_LTC  GWA_XLM  GWA_XRP
 Date                                                   
 2014-04-01      nan      nan      nan      nan      nan
 2014-04-02      nan      nan      nan      nan      nan
 2014-04-03      nan      nan      nan      nan      nan
 2014-04-04      nan      nan      nan      nan      nan
 2014-04-05      nan      nan      nan      nan      nan
 ...             ...      ...      ...      ...      ...
 2018-01-19    -0.17     0.57    -0.24     1.30     0.65
 2018-01-20    -0.13     0.60    -0.27     1.23     0.53
 2018-01-21    -0.12     0.65    -0.27     1.22     0.45
 2018-01-22    -0.20     0.38    -0.33     1.09     0.30
 2018-01-23    -0.31     0.29    -0.37     1.16     0.29
 
 [1394 rows x 5 columns]}</pre>
<p><strong>Примечание.</strong> Для расчета returns путем смещения набора данных необходимо выполнить 2 допущения:</p>
<ol>
<li>наблюдения отсортированы ascending by date и</li>
<li>отсутствуют пропущенные даты. Этого шага нет в статье, чтобы сделать этот урок лаконичным, рекомендуется проверить это самостоятельно.</li>
</ol>
<h3><strong>Шаг 7: Сплавка смещенного набора данных &#8212; Melt the shifted dataset</strong></h3>
<p>Теперь, когда мы вычислили возвраты с использованием развернутого набора данных (Pivot dataset), мы собираемся «разворачивать (unpivot)» возвраты. Развернув (Unpivot) или расплавив данные, мы можем позже создать аналитическую базовую таблицу (АБТ &#8212; analytical base table, ABT), где каждая строка содержит всю необходимую информацию для конкретной монеты на определенную дату.</p>
<p>Мы не могли напрямую сместить исходный набор данных, потому что данные для разных монет были сложены друг на друга, поэтому границы могли бы перекрываться. Другими словами, данные BTC попадут в расчеты ETH, данные ETH попадут в расчеты LTC и так далее.</p>
<p><strong>Чтобы расплавить данные, нам требуется:</strong></p>
<ul>
<li><strong>reset_index()</strong>, чтобы мы могли вызывать столбцы по имени;</li>
<li>Вызовите метод <strong>melt()</strong>;</li>
<li>Передайте столбец (столбцы), чтобы сохранить в аргумент <strong>id_vars=</strong>;</li>
<li>Назовите растопленный столбец (melted column), используя аргумент <strong>value_name=</strong>.</li>
</ul>
<p><strong>Вот как это выглядит для одного dataframe:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Melt delta_7 returns
melted_7 = delta_7.reset_index().melt(id_vars=['Date'], value_name='delta_7')
 
# Melted dataframe examples
melted_7.tail()</pre>
<p>Результат:</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step7_melted_dataframe_examples_delta_7_returns.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step7_melted_dataframe_examples_delta_7_returns.png" alt="" width="735" height="300" class="aligncenter size-full wp-image-443" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step7_melted_dataframe_examples_delta_7_returns.png 735w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step7_melted_dataframe_examples_delta_7_returns-300x122.png 300w" sizes="(max-width: 735px) 100vw, 735px" /></a></p>
<p>Чтобы сделать это для всех возвращаемых <strong>DataFrame</strong>, мы можем просто перебрать <strong>delta_dict</strong>, вот так:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Melt all the delta dataframes and store in list
melted_dfs = []
for key, delta_df in delta_dict.items():
    melted_dfs.append( delta_df.reset_index().melt(id_vars=['Date'], value_name=key) )

melted_dfs</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">[            Date     Code  delta_7
 0     2014-04-01  GWA_BTC      nan
 1     2014-04-02  GWA_BTC      nan
 2     2014-04-03  GWA_BTC      nan
 3     2014-04-04  GWA_BTC      nan
 4     2014-04-05  GWA_BTC      nan
 ...          ...      ...      ...
 6965  2018-01-19  GWA_XRP    -0.22
 6966  2018-01-20  GWA_XRP    -0.29
 6967  2018-01-21  GWA_XRP    -0.30
 6968  2018-01-22  GWA_XRP    -0.32
 6969  2018-01-23  GWA_XRP    -0.04
 
 [6970 rows x 3 columns],             Date     Code  delta_14
 0     2014-04-01  GWA_BTC       nan
 1     2014-04-02  GWA_BTC       nan
 2     2014-04-03  GWA_BTC       nan
 3     2014-04-04  GWA_BTC       nan
 4     2014-04-05  GWA_BTC       nan
 ...          ...      ...       ...
 6965  2018-01-19  GWA_XRP     -0.41
 6966  2018-01-20  GWA_XRP     -0.42
 6967  2018-01-21  GWA_XRP     -0.51
 6968  2018-01-22  GWA_XRP     -0.52
 6969  2018-01-23  GWA_XRP     -0.48
 
 [6970 rows x 3 columns],             Date     Code  delta_21
 0     2014-04-01  GWA_BTC       nan
 1     2014-04-02  GWA_BTC       nan
 2     2014-04-03  GWA_BTC       nan
 3     2014-04-04  GWA_BTC       nan
 4     2014-04-05  GWA_BTC       nan
 ...          ...      ...       ...
 6965  2018-01-19  GWA_XRP      0.02
 6966  2018-01-20  GWA_XRP     -0.26
 6967  2018-01-21  GWA_XRP     -0.28
 6968  2018-01-22  GWA_XRP     -0.35
 6969  2018-01-23  GWA_XRP     -0.39
 
 [6970 rows x 3 columns],             Date     Code  delta_28
 0     2014-04-01  GWA_BTC       nan
 1     2014-04-02  GWA_BTC       nan
 2     2014-04-03  GWA_BTC       nan
 3     2014-04-04  GWA_BTC       nan
 4     2014-04-05  GWA_BTC       nan
 ...          ...      ...       ...
 6965  2018-01-19  GWA_XRP      0.65
 6966  2018-01-20  GWA_XRP      0.53
 6967  2018-01-21  GWA_XRP      0.45
 6968  2018-01-22  GWA_XRP      0.30
 6969  2018-01-23  GWA_XRP      0.29
 
 [6970 rows x 3 columns]]</pre>
<p>Наконец, мы можем создать другой расплавленный фрейм данных, который содержит прогнозные 7-дневные возвраты. Это будет нашей <strong>«целевой переменной» для оценки нашей торговой стратегии</strong>.</p>
<p>Просто сдвиньте сводный набор данных на &#8212; 7, чтобы получить «будущие» цены, например:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Calculate 7-day returns after the date
return_df = pivoted_df.shift(-7) / pivoted_df - 1.0
 
# Melt the return dataset and append to list
melted_dfs.append( return_df.reset_index().melt(id_vars=['Date'], value_name='return_7') )</pre>
<p>Теперь у нас есть 5 расплавленных фреймов данных, сохраненных в списке <strong>melted_dfs</strong>, по одному для каждого из ретроспективных <strong>7, 14, 21 и 28-дневных возвратов</strong> и один для <strong>прогнозных 7-дневных возвратов</strong>.</p>
<h3><strong>Шаг 8: Уменьшить-объединить расплавленные данные &#8212; Reduce-merge the melted data</strong></h3>
<p>Все, что осталось сделать &#8212; это объединить наши расплавленные DataFrames в единую аналитическую базовую таблицу. Нам понадобятся два инструмента.</p>
<p>Первый инструмент &#8212; это функция слияния Pandas, которая работает как JOIN в SQL. Например, для того, чтобы объединить первые два расплавленных DataFrames:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null"># Merge two dataframes
pd.merge(melted_dfs[0], melted_dfs[1], on=['Date', 'Code']).tail()</pre>
<p><strong>Результат:</strong></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_merge_two_dataframes_delta7_delta14.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_merge_two_dataframes_delta7_delta14.png" alt="" width="640" height="249" class="aligncenter size-full wp-image-444" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_merge_two_dataframes_delta7_delta14.png 640w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_merge_two_dataframes_delta7_delta14-300x117.png 300w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>
<p>Посмотрите, теперь у нас delta_7 и delta_14 в одной строке! Это начало нашей аналитической базовой таблицы. Все, что нам нужно сделать сейчас &#8212; это объединить все наши расплавленные DataFrames с базовым DataFrame других функций, которые нам могут понадобиться.</p>
<p>Самый элегантный способ сделать это &#8212; использовать встроенную функцию уменьшения Python. Сначала нам нужно её импортировать:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">from functools import reduce</pre>
<p>Далее, прежде чем использовать эту функцию, давайте создадим список <strong>feature_dfs</strong>, который содержит базовые элементы из исходного набора данных плюс расплавленные наборы данных.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Grab features from original dataset
base_df = df[['Date', 'Code', 'Volume', 'VWAP']]
 
# Create a list with all the feature dataframes
feature_dfs = [base_df] + melted_dfs</pre>
<p>Теперь мы готовы использовать функцию <strong>Reduce</strong>.</p>
<p><strong>Reduce</strong> применяет функцию двух аргументов кумулятивно к объектам в последовательности (например, список). <br>Например,</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">reduce(lambda x,y: x+y, [1,2,3,4,5])</pre>
<p>вычисляет</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">((((1+2)+3)+4)+5)</pre>
<p>Таким образом, мы можем уменьшить-объединить все функции следующим образом:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Reduce-merge features into analytical base table
abt = reduce(lambda left,right: pd.merge(left,right,on=['Date', 'Code']), feature_dfs)
 
# Display examples from the ABT
abt.tail(10)</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_reduce_merge_features_into_analytical_base_table.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_reduce_merge_features_into_analytical_base_table.png" alt="" width="862" height="428" class="aligncenter size-full wp-image-448" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_reduce_merge_features_into_analytical_base_table.png 862w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_reduce_merge_features_into_analytical_base_table-300x149.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_reduce_merge_features_into_analytical_base_table-768x381.png 768w" sizes="(max-width: 862px) 100vw, 862px" /></a></p>
<p>Словарь данных для нашей&nbsp;<em><strong><span>аналитической базовой таблицы (ABT):</span></strong></em></p>
<ul>
<li><strong><span>Date (Дата):</span></strong><span>&nbsp;&nbsp;день, в который были рассчитаны значения индекса.</span></li>
<li><strong><span>Code (Код):</span></strong><span>&nbsp; пара, какая криптовалюта.</span></li>
<li><strong><span>VWAP:</span></strong><span>&nbsp; средневзвешенная цена за день торгов на дату .</span></li>
<li><strong><span>delta_7:</span></strong><span>&nbsp;&nbsp;возврат за предыдущие 7 дней (1.0 = 100% возврат).</span></li>
<li><strong><span>delta_14:</span></strong><span>&nbsp;&nbsp;возврат за предыдущие 14 дней (1.0 = 100% возврат).</span></li>
<li><strong><span>delta_21:</span></strong><span>&nbsp;&nbsp;возврат за предыдущие 21 день (1.0 = 100% возврат).</span></li>
<li><strong><span>delta_28:</span></strong><span>&nbsp;&nbsp;возврат за предыдущие 28 дней (1.0 = 100% возврат).</span></li>
<li><strong><span>return_7:</span></strong><span>&nbsp; будущий возврат в течение следующих 7 дней (1.0 = 100% возврат).</span></li>
</ul>
<p>Кстати, обратите внимание, что последние 7 наблюдений не имеют значений для функции return_7? Это ожидаемо, так как мы не можем рассчитать «будущие 7-дневные доходы» за последние 7 дней набора данных.</p>
<p>Технически, с этой ABT, мы уже можем ответить на нашу первоначальную цель. Например, если мы хотим выбрать монету, которая имела наибольший импульс 1 сентября 2017 года, мы могли бы просто отобразить строки для этой даты и посмотреть на 7, 14, 21 и 28-дневный возврат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Data from Sept 1st, 2017
abt[abt.Date == '2017-09-01']</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_print_returns_ABT.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_print_returns_ABT.png" alt="" width="863" height="249" class="aligncenter size-full wp-image-450" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_print_returns_ABT.png 863w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_print_returns_ABT-300x87.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_print_returns_ABT-768x222.png 768w" sizes="(max-width: 863px) 100vw, 863px" /></a></p>
<p><span>И если вы хотите программно выбрать криптовалюту (пару для торгов) с наибольшим импульсом (например, за предыдущие 28 дней), вы должны написать:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">max_momentum_id = abt[abt.Date == '2017-09-01'].delta_28.idxmax()
abt.loc[max_momentum_id, ['Code','return_7']]</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_max_momentum_dataframe_loc.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_max_momentum_dataframe_loc.png" alt="" width="598" height="116" class="aligncenter size-full wp-image-452" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_max_momentum_dataframe_loc.png 598w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_max_momentum_dataframe_loc-300x58.png 300w" sizes="(max-width: 598px) 100vw, 598px" /></a></p>
<p><span>Тем не менее, поскольку мы заинтересованы в торговле только в первый день каждого месяца, мы можем упростить ситуацию для себя&#8230;</span></p>
<h3><strong>Шаг 9: (Необязательно) Агрегация через Group By &#8212; Aggregate with group-by</strong></h3>
<p>В качестве последнего шага, если мы хотим сохранить только первые дни каждого месяца. Для этого мы можем использовать группирование с последующей агрегацией.</p>
<p>Сначала создайте новую функцию &#8216;month&#8217; из первых 7 символов строк Date.<br>Затем сгруппируйте наблюдения по «Коду» и «месяцу». Pandas создадут «ячейки» данных, которые разделяют наблюдения по коду и месяцу.<br>Наконец, в каждой группе просто возьмите .first() и сбросьте индекс.<br>Примечание. Мы предполагаем, что ваш фрейм данных по-прежнему правильно отсортирован по дате.</p>
<p>Вот как все это выглядит вместе:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Create 'month' feature
abt['month'] = abt.Date.apply(lambda x: x[:7])
 
# Group by 'Code' and 'month' and keep first date
gb_df = abt.groupby(['Code', 'month']).first().reset_index()
 
# Display examples
gb_df.tail()</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step9_display_example_group_by_keep_first_date.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step9_display_example_group_by_keep_first_date.png" alt="" width="906" height="351" class="aligncenter size-full wp-image-455" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step9_display_example_group_by_keep_first_date.png 906w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step9_display_example_group_by_keep_first_date-300x116.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step9_display_example_group_by_keep_first_date-768x298.png 768w" sizes="(max-width: 906px) 100vw, 906px" /></a></p>
<p><strong>Как видите, теперь у нас есть правильная Аналитическая базовая таблица АБТ с:</strong></p>
<ul>
<li>Только соответствующие данные с 1-го числа каждого месяца.</li>
<li>Импульсные характеристики рассчитаны за предыдущие 7, 14, 21 и 28 дней.</li>
<li>Прогноз будущих возвратов (future returns) через 7 дней.</li>
</ul>
<p>Другими словами, у нас есть именно то, что нам нужно, чтобы оценить простую торговую стратегию, которую мы предложили в начале статьи!</p>


<h2 class="wp-block-heading" id="complete"><strong>Полный код от начала до конца</strong></h2>



<p>Вот весь основной код в одном месте, в одном скрипте.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># 2. Import libraries and dataset
import pandas as pd
pd.options.display.float_format = '{:,.2f}'.format
pd.options.display.max_rows = 200
pd.options.display.max_columns = 100
 
df = pd.read_csv('BNC2_sample.csv',
                 names=['Code', 'Date', 'Open', 'High', 'Low', 
                        'Close', 'Volume', 'VWAP', 'TWAP'])
 
# 4. Filter unwanted observations
gwa_codes = [code for code in df.Code.unique() if 'GWA_' in code]
df = df[df.Code.isin(gwa_codes)]
 
# 5. Pivot the dataset
pivoted_df = df.pivot(index='Date', columns='Code', values='VWAP')
 
# 6. Shift the pivoted dataset
delta_dict = {}
for offset in [7, 14, 21, 28]:
    delta_dict['delta_{}'.format(offset)] = pivoted_df / pivoted_df.shift(offset) - 1
    
# 7. Melt the shifted dataset
melted_dfs = []
for key, delta_df in delta_dict.items():
    melted_dfs.append( delta_df.reset_index().melt(id_vars=['Date'], value_name=key) )
 
return_df = pivoted_df.shift(-7) / pivoted_df - 1.0
melted_dfs.append( return_df.reset_index().melt(id_vars=['Date'], value_name='return_7') )
 
# 8. Reduce-merge the melted data
from functools import reduce
 
base_df = df[['Date', 'Code', 'Volume', 'VWAP']]
feature_dfs = [base_df] + melted_dfs
 
abt = reduce(lambda left,right: pd.merge(left,right,on=['Date', 'Code']), feature_dfs)
 
# 9. Aggregate with group-by.
abt['month'] = abt.Date.apply(lambda x: x[:7])
gb_df = abt.groupby(['Code', 'month']).first().reset_index()</pre>



<figure class="wp-block-image size-large"><img decoding="async" width="788" height="367" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/12/step_final_return.png" alt="" class="wp-image-459" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/12/step_final_return.png 788w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/12/step_final_return-300x140.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/12/step_final_return-768x358.png 768w" sizes="(max-width: 788px) 100vw, 788px" /></figure>



<div class="wp-block-file"><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/12/Notebook.html"><strong>Пример Jupyter Notebook Python 3</strong></a><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/12/Notebook.html" class="wp-block-file__button" download><strong>Скачать</strong></a></div>
<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-data-wrangling-tutorial-for-cryptocurrency%2F&#038;title=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" data-a2a-url="https://python.ivan-shamaev.ru/python-data-wrangling-tutorial-for-cryptocurrency/" data-a2a-title="Python 3 Tutorial — Data Wrangling — Обработка данных по криптовалютам"></a></p><p>Сообщение <a href="https://python.ivan-shamaev.ru/python-data-wrangling-tutorial-for-cryptocurrency/">Python 3 Tutorial &#8212; Data Wrangling &#8212; Обработка данных по криптовалютам</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://python.ivan-shamaev.ru/python-data-wrangling-tutorial-for-cryptocurrency/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Python для Финансов: Алгоритмический трейдинг / торговля. Binance</title>
		<link>https://python.ivan-shamaev.ru/python-for-finance-algorithmic-trading/</link>
					<comments>https://python.ivan-shamaev.ru/python-for-finance-algorithmic-trading/#respond</comments>
		
		<dc:creator><![CDATA[Шамаев Иван]]></dc:creator>
		<pubDate>Tue, 12 Nov 2019 23:08:01 +0000</pubDate>
				<category><![CDATA[Python Finance]]></category>
		<category><![CDATA[Python For Finance]]></category>
		<category><![CDATA[Python для Финансов]]></category>
		<category><![CDATA[Алгоритмический трейдинг]]></category>
		<guid isPermaLink="false">https://python.ivan-shamaev.ru/?p=335</guid>

					<description><![CDATA[<p>Это руководство по Python for Finance познакомит Вас с алгоритмическим трейдингом или алгоритмической торговлей на площадке Binance. Технология стала активом в финансах: финансовые институты теперь превращаются в технологические компании, а не просто заняты только финансовым аспектом: помимо того, что технологии обеспечивают инновации быстротой и могут помочь получить конкурентное преимущество, скорость и частоту финансовых транзакций вместе [&#8230;]</p>
<p>Сообщение <a href="https://python.ivan-shamaev.ru/python-for-finance-algorithmic-trading/">Python для Финансов: Алгоритмический трейдинг / торговля. Binance</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-for-finance-algorithmic-trading%2F&amp;linkname=Python%20%D0%B4%D0%BB%D1%8F%20%D0%A4%D0%B8%D0%BD%D0%B0%D0%BD%D1%81%D0%BE%D0%B2%3A%20%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9%20%D1%82%D1%80%D0%B5%D0%B9%D0%B4%D0%B8%D0%BD%D0%B3%20%2F%20%D1%82%D0%BE%D1%80%D0%B3%D0%BE%D0%B2%D0%BB%D1%8F.%20Binance" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-for-finance-algorithmic-trading%2F&amp;linkname=Python%20%D0%B4%D0%BB%D1%8F%20%D0%A4%D0%B8%D0%BD%D0%B0%D0%BD%D1%81%D0%BE%D0%B2%3A%20%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9%20%D1%82%D1%80%D0%B5%D0%B9%D0%B4%D0%B8%D0%BD%D0%B3%20%2F%20%D1%82%D0%BE%D1%80%D0%B3%D0%BE%D0%B2%D0%BB%D1%8F.%20Binance" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-for-finance-algorithmic-trading%2F&amp;linkname=Python%20%D0%B4%D0%BB%D1%8F%20%D0%A4%D0%B8%D0%BD%D0%B0%D0%BD%D1%81%D0%BE%D0%B2%3A%20%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9%20%D1%82%D1%80%D0%B5%D0%B9%D0%B4%D0%B8%D0%BD%D0%B3%20%2F%20%D1%82%D0%BE%D1%80%D0%B3%D0%BE%D0%B2%D0%BB%D1%8F.%20Binance" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-for-finance-algorithmic-trading%2F&amp;linkname=Python%20%D0%B4%D0%BB%D1%8F%20%D0%A4%D0%B8%D0%BD%D0%B0%D0%BD%D1%81%D0%BE%D0%B2%3A%20%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9%20%D1%82%D1%80%D0%B5%D0%B9%D0%B4%D0%B8%D0%BD%D0%B3%20%2F%20%D1%82%D0%BE%D1%80%D0%B3%D0%BE%D0%B2%D0%BB%D1%8F.%20Binance" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-for-finance-algorithmic-trading%2F&amp;linkname=Python%20%D0%B4%D0%BB%D1%8F%20%D0%A4%D0%B8%D0%BD%D0%B0%D0%BD%D1%81%D0%BE%D0%B2%3A%20%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9%20%D1%82%D1%80%D0%B5%D0%B9%D0%B4%D0%B8%D0%BD%D0%B3%20%2F%20%D1%82%D0%BE%D1%80%D0%B3%D0%BE%D0%B2%D0%BB%D1%8F.%20Binance" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-for-finance-algorithmic-trading%2F&amp;linkname=Python%20%D0%B4%D0%BB%D1%8F%20%D0%A4%D0%B8%D0%BD%D0%B0%D0%BD%D1%81%D0%BE%D0%B2%3A%20%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9%20%D1%82%D1%80%D0%B5%D0%B9%D0%B4%D0%B8%D0%BD%D0%B3%20%2F%20%D1%82%D0%BE%D1%80%D0%B3%D0%BE%D0%B2%D0%BB%D1%8F.%20Binance" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-for-finance-algorithmic-trading%2F&amp;linkname=Python%20%D0%B4%D0%BB%D1%8F%20%D0%A4%D0%B8%D0%BD%D0%B0%D0%BD%D1%81%D0%BE%D0%B2%3A%20%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9%20%D1%82%D1%80%D0%B5%D0%B9%D0%B4%D0%B8%D0%BD%D0%B3%20%2F%20%D1%82%D0%BE%D1%80%D0%B3%D0%BE%D0%B2%D0%BB%D1%8F.%20Binance" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-for-finance-algorithmic-trading%2F&#038;title=Python%20%D0%B4%D0%BB%D1%8F%20%D0%A4%D0%B8%D0%BD%D0%B0%D0%BD%D1%81%D0%BE%D0%B2%3A%20%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9%20%D1%82%D1%80%D0%B5%D0%B9%D0%B4%D0%B8%D0%BD%D0%B3%20%2F%20%D1%82%D0%BE%D1%80%D0%B3%D0%BE%D0%B2%D0%BB%D1%8F.%20Binance" data-a2a-url="https://python.ivan-shamaev.ru/python-for-finance-algorithmic-trading/" data-a2a-title="Python для Финансов: Алгоритмический трейдинг / торговля. Binance"></a></p><blockquote>
<p><span>Это руководство по <strong>Python for Finance</strong> познакомит Вас с <strong>алгоритмическим трейдингом</strong> или <strong>алгоритмической торговлей</strong> на площадке Binance.</span></p>
</blockquote>
<p><span>Технология стала активом в финансах: финансовые институты теперь превращаются в технологические компании, а не просто заняты только финансовым аспектом: помимо того, что технологии обеспечивают инновации быстротой и могут помочь получить конкурентное преимущество, скорость и частоту финансовых транзакций вместе с большими объемами данных делает то, что внимание финансовых учреждений к технологиям с годами возросло, и что технологии действительно стали основным фактором, способствующим финансам.</span></p>
<p><span>Среди самых популярных языков программирования для финансов вы найдете R и Python, а также такие языки, как C ++, C # и Java. Из этого руководства вы узнаете, как начать работу с Python для финансов. Учебник будет охватывать следующее:</span></p>
<ul>
<li><span>В </span><a href="https://www.datacamp.com/community/tutorials/finance-python-trading#basics"><span>основах</span></a><span> , что вам нужно , чтобы начать работу: для тех , кто являются новыми для финансирования, вы будете первым узнать больше о запасах и торговых стратегиях, в какое время данные серий являются и то , что вам нужно настроить свое рабочее место.</span></li>
<li><span>Введение в данные временных рядов и некоторые из наиболее </span><a href="https://www.datacamp.com/community/tutorials/finance-python-trading#financialanalyses"><span>распространенных финансовых анализов</span></a><span> , таких как движущиеся окна, расчет волатильности,… с пакетом Python Pandas.</span></li>
<li><span>Разработка </span><a href="https://www.datacamp.com/community/tutorials/finance-python-trading#tradingstrategy"><span>простой импульсной стратегии</span></a><span> : сначала вы пройдете процесс разработки шаг за шагом и начнете с формулировки и кодирования простой алгоритмической торговой стратегии.</span></li>
<li><span>Далее вы </span><a href="https://www.datacamp.com/community/tutorials/finance-python-trading#backtesting"><span>протестируете</span></a><span> сформулированную торговую стратегию с Pandas, zipline и Quantopian.</span></li>
<li><span>После этого вы увидите, как можно </span><a href="https://www.datacamp.com/community/tutorials/finance-python-trading#improving"><span>оптимизировать</span></a><span> свою стратегию, чтобы она работала лучше, и в конечном итоге вы </span><a href="https://www.datacamp.com/community/tutorials/finance-python-trading#evaluating"><span>оцените</span></a><span> ее эффективность и надежность.</span></li>
</ul>
<p><span>Загрузите блокнот Jupyter этого руководства </span><a href="https://github.com/datacamp/datacamp-community-tutorials"><span>здесь</span></a><span>.</span></p>
<h2 id="basics"><span>Начало работы с Python для финансов</span></h2>
<p><span>Прежде чем вы начнете заниматься торговыми стратегиями, неплохо бы сначала ознакомиться с основами. Эта первая часть руководства будет посвящена объяснению основ Python, которые вам необходимы для начала работы. Это не означает, однако, что вы начнете с нуля: вы должны были, по крайней мере, пройти бесплатный вводный курс DataCamp « </span><a href="https://www.datacamp.com/courses/intro-to-python-for-data-science"><span>Введение в Python for Data Science»</span></a><span> , в котором вы узнали, как работать со списками, пакетами и NumPy Python. Кроме того, желательно знать основы Pandas, популярного пакета для обработки данных Python, но это не является обязательным требованием.</span></p>
<p><span>Тогда я бы посоветовал вам пройти курс DataCamp </span><a href="https://www.datacamp.com/courses/intro-to-python-for-finance"><span>Intro to Python for Finance,</span></a><span> чтобы изучить основы финансов в Python. Если вы хотите применить свои новые навыки «Python for Data Science» к реальным финансовым данным, подумайте о прохождении курса « </span><a href="https://www.datacamp.com/courses/importing-managing-financial-data-in-python"><span>Импорт и управление финансовыми данными в Python»</span></a><span> .</span></p>
<h3><span>Акции и торговля</span></h3>
<p><span>Когда компания хочет расти и предпринимать новые проекты или расширяться, она может выпускать акции для привлечения капитала. Акция представляет собой долю в собственности компании и выпускается в обмен на деньги. Акции покупаются и продаются: покупатели и продавцы обменивают существующие ранее выпущенные акции. Цена, по которой продаются акции, может изменяться независимо от успеха компании: цены вместо этого отражают спрос и предложение. Это означает, что всякий раз, когда акция считается «желательной» из-за успеха, популярности,… цена акции будет расти.</span></p>
<p><strong><span>Обратите внимание,</span></strong><span> что акции &#8212; это не то же самое, что облигации, когда компании привлекают деньги за счет заимствований, либо в виде займа в банке, либо путем выпуска долговых обязательств.</span></p>
<p><span>Как вы только что прочитали, покупка и продажа или торговля очень важны, когда вы говорите об акциях, но определенно не ограничены этим: торговля &#8212; это акт покупки или продажи </span><em><span>актива</span></em><span> , который может быть финансовым обеспечением, таким как акции, облигация или материальный продукт, такой как золото или нефть.</span></p>
<p><span>Торговля акциями &#8212; это процесс, при котором наличные деньги, выплачиваемые за акции, конвертируются в долю в собственности компании, которая может быть конвертирована обратно в наличные путем продажи, и все это, мы надеемся, с прибылью. Теперь, чтобы получить прибыльный доход, вы либо открываете длинную, либо короткую позицию на рынках: вы либо по долям, полагая, что цена акций будет расти, чтобы продавать по более высокой цене в будущем, либо вы продаете свои акции, ожидая, что вы сможете купить это обратно по более низкой цене и получить прибыль. Когда вы следуете фиксированному плану открывать длинные или короткие позиции на рынках, у вас есть торговая стратегия.</span></p>
<p><span>Разработка торговой стратегии проходит через несколько этапов, например, когда вы, например, строите модели машинного обучения: вы формулируете стратегию и указываете ее в форме, которую вы можете проверить на своем компьютере, вы проводите предварительное тестирование. или тестирование на истории, вы оптимизируете свою стратегию и, наконец, вы оцениваете производительность и надежность вашей стратегии.</span></p>
<p><span>Торговые стратегии обычно проверяются с помощью тестирования на истории: вы реконструируете по историческим данным сделки, которые произошли бы в прошлом, используя правила, которые были определены в разработанной вами стратегии. Таким образом, вы можете получить представление об эффективности вашей стратегии и использовать ее в качестве отправной точки для оптимизации и улучшения вашей стратегии перед ее применением на реальных рынках. Конечно, все это в значительной степени зависит от лежащей в основе теории или убеждения, что любая стратегия, которая сработала хорошо в прошлом, вероятно, также сработает хорошо в будущем, и что любая стратегия, которая работала плохо в прошлом, вероятно, также подойдет плохо в будущем.</span></p>
<h3><span>Данные временного ряда</span></h3>
<p><span>Временной ряд представляет собой последовательность числовых точек данных, взятых в последовательных одинаково разнесенных точках во времени. При инвестировании временной ряд отслеживает движение выбранных точек данных, например цены акций, в течение определенного периода времени с точками данных, записанными через равные промежутки времени. Если вы все еще сомневаетесь в том, как это будет выглядеть, посмотрите на следующий пример:</span></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/google_plot_01.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/google_plot_01.png" alt="" width="550" height="366" class="aligncenter size-full wp-image-339" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/google_plot_01.png 550w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/google_plot_01-300x200.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/google_plot_01-360x240.png 360w" sizes="(max-width: 550px) 100vw, 550px" /></a></p>
<p><span>Вы видите, что даты расположены на оси X, а цена указана на оси Y. </span><span>«Последовательные равные интервалы времени» в этом случае означают, что дни, показанные на оси х, разделены на 14 дней: обратите внимание на разницу между 3/7/2005 и следующей точкой, 31.03.2005, и 05.05.2005 и 19.04.2005.</span></p>
<p><span>Однако при работе с данными о запасах вы часто будете видеть не только два столбца, которые содержат наблюдения периода и цены, но в большинстве случаев у вас будет пять столбцов, содержащих наблюдения периода и открытия , максимум, минимум и цены закрытия этого периода. Это означает, что, если ваш период установлен на дневном уровне, данные наблюдений за этот день дадут вам представление о цене открытия и закрытия для этого дня и экстремальных движениях максимума и минимума для конкретной акции в течение этого дня.</span></p>
<p><span>На данный момент у вас есть базовое представление об основных понятиях, которые вам необходимо знать, чтобы пройти этот урок. Эти понятия скоро вернутся, и вы узнаете о них позже в этом уроке.</span></p>
<h3><span>Настройка рабочего пространства</span></h3>
<p><span>Подготовка рабочего пространства к работе &#8212; это простая задача: просто убедитесь, что в вашей системе работает Python и интегрированная среда разработки (IDE). Тем не менее, есть несколько способов, с помощью которых вы можете начать, которые могут быть немного проще, когда вы только начинаете.</span></p>
<p><span>Возьмите, например, </span><a href="https://anaconda.org/"><span>Anaconda</span></a><span> , высокопроизводительный дистрибутив Python и R, который включает в себя более 100 самых популярных пакетов Python, R и Scala для науки о данных. Кроме того, установка Anaconda предоставит вам доступ к более чем 720 пакетам, которые можно легко установить с помощью conda, нашего известного менеджера пакетов, зависимостей и среды, который включен в Anaconda. И, кроме всего прочего, вы получите Jupyter Notebook и Spyder IDE вместе с ним.</span></p>
<p><span>Это звучит как хорошая сделка, верно?</span></p>
<p><span>Вы можете установить Anaconda </span><a href="https://www.continuum.io/downloads"><span>отсюда</span></a><span> и не забудьте проверить, как настроить ноутбук Jupyter, в </span><a href="https://www.datacamp.com/community/tutorials/tutorial-jupyter-notebook"><span>учебнике</span></a><span> DataCamp&#8217;s <a href="https://www.datacamp.com/community/tutorials/tutorial-jupyter-notebook">Jupyter Notebook: полное руководство</a> .</span></p>
<p><span>Конечно, Anaconda &#8212; не единственный вариант: вы также можете проверить </span><a href="https://www.enthought.com/products/canopy/"><span>дистрибутив Canopy Python</span></a><span> (который не <a href="https://www.enthought.com/products/canopy/">распространяется</a> бесплатно) или попробовать </span><a href="http://quant-platform.com/"><span>Quant Platform</span></a><span> .</span></p>
<p><span>Последний предлагает вам несколько дополнительных преимуществ по сравнению, например, с использованием Jupyter или Spyder IDE, поскольку он предоставляет вам все, что вам нужно для финансовой аналитики в вашем браузере! С помощью Quant Platform вы получите доступ к графическому инжинирингу на основе графического интерфейса, финансовой аналитике на основе Python и своей собственной библиотеке аналитики на основе Python. Более того, у вас также будет доступ к форуму, где вы можете обсудить решения или вопросы со сверстниками!</span></p>
<h3><span>Основы Python для финансов: Pandas</span></h3>
<p><span>Когда вы используете Python для финансов, вы часто сталкиваетесь с использованием пакета манипулирования данными, Pandas. Но и другие пакеты, такие как NumPy, SciPy, Matplotlib,… будут проходить, как только вы начнете копать глубже.</span></p>
<p><span>А сейчас давайте сосредоточимся на Pandas и используем его для анализа данных временных рядов. В этом разделе объясняется, как вы можете импортировать данные, исследовать и манипулировать ими с помощью Pandas. Вдобавок ко всему этому вы узнаете, как выполнять общий финансовый анализ данных, которые вы импортировали.</span></p>
<h4><span>Импорт финансовых данных в Python</span></h4>
<p><span></span><code class="lang-python">pandas-datareader</code><span>Пакет позволяет для чтения в данных из таких источников, как Google, Всемирный банк, &#8230; Если вы хотите иметь обновленный список источников данных, которые доступны с этой функцией, перейдите к </span><a href="https://pandas-datareader.readthedocs.io/en/latest/remote_data.html"><span>документации</span></a><span> . Раньше вы могли получить доступ к данным из Yahoo! Финансирование напрямую, но с тех пор оно устарело. Чтобы получить доступ к Yahoo! Финансовые данные, посмотрите это </span><a href="https://www.youtube.com/watch?v=eSpH6fPd5Yw"><span>видео Мэтта Макарти,</span></a><span> которое показывает обходной путь. Для этого урока вы будете использовать пакет для чтения данных из Yahoo! Финансы. Обязательно сначала установите пакет, установив последнюю версию выпуска через pip с помощью </span><code class="lang-python">pip install pandas-datareader</code><span>.</span></p>
<p><strong><span>Совет</span></strong><span> : если вы хотите установить последнюю версию для разработчиков или у вас возникли какие-либо проблемы, вы можете прочитать инструкции по установке </span><a href="https://github.com/pydata/pandas-datareader/"><span>здесь</span></a><span> .</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas_datareader as pdr
import datetime 
aapl = pdr.get_data_yahoo('AAPL', 
                          start=datetime.datetime(2006, 10, 1), 
                          end=datetime.datetime(2012, 1, 1))</pre>
<div>
<div class="jsx-undefined social__top desktopOnly">
<div class="jsx-undefined voteAndSocial">
<div class="jsx-undefined"><a href="https://www.datacamp.com/community/tutorials/finance-python-trading#comments" class="jsx-3293774837 CommentCounter"><span class="jsx-3293774837 count"><span>102</span></span></a>
<p></p>
<div class="jsx-1972554161 Upvote">
<div class="jsx-1972554161">
<div class="jsx-1972554161 normal"><span class="jsx-1972554161 icon"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 12 12"><path d="M1 10L6 0l5 10z"></path></svg></span><span class="jsx-1972554161 count"><span>502</span></span></div>
<div class="jsx-1972554161 voted"><span class="jsx-1972554161 icon"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewbox="0 0 12 12"><path d="M1 10L6 0l5 10z"></path></svg></span><span class="jsx-1972554161 count"><span>502</span></span></div>
</div>
</div>
</div>
<div class="jsx-494086174 Social vertical">
<div class="jsx-494086174 icons"><a href="https://www.facebook.com/sharer.php?u=https://www.datacamp.com/community/tutorials/finance-python-trading" target="_blank" rel="noopener noreferrer" class="jsx-494086174 icon"><svg height="12" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 11.73 22.58"><path d="M7.61 22.58v-10.3h3.46l.52-4h-4V5.7c0-1.16.32-2 2-2h2.13V.16A28.47 28.47 0 0 0 8.63 0C5.56 0 3.47 1.87 3.47 5.31v3H0v4h3.47v10.3h4.14z"></path></svg></a><a href="https://twitter.com/intent/tweet?url=https://www.datacamp.com/community/tutorials/finance-python-trading" target="_blank" rel="noopener noreferrer" class="jsx-494086174 icon centerIcon"><svg height="10" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20.42 16.67"><path d="M10 5.18c0-.28-.06-.53-.07-.78a4 4 0 0 1 .73-2.57A4.08 4.08 0 0 1 13.93 0 4 4 0 0 1 17 1.15a.43.43 0 0 0 .46.12 8.68 8.68 0 0 0 2.2-.84l.2-.1a4.36 4.36 0 0 1-1.75 2.28A9 9 0 0 0 20.42 2l-.21.3a3.83 3.83 0 0 1-.23.3A8.45 8.45 0 0 1 18.5 4a.28.28 0 0 0-.13.27A12 12 0 0 1 17 10.18a11.8 11.8 0 0 1-3.37 4.11 11.17 11.17 0 0 1-4.39 2.06 12.53 12.53 0 0 1-4.44.22 11.87 11.87 0 0 1-4.74-1.73L0 14.79a8.6 8.6 0 0 0 6.16-1.74 4.28 4.28 0 0 1-3.91-2.91h.95a6.18 6.18 0 0 0 .89-.12A4.2 4.2 0 0 1 .8 5.88a4 4 0 0 0 1.81.49 4.23 4.23 0 0 1-1.78-3A4.07 4.07 0 0 1 1.38.79 12.06 12.06 0 0 0 10 5.18z" id="iOjKBC.tif"></path></svg></a><a href="https://www.linkedin.com/cws/share?url=https://www.datacamp.com/community/tutorials/finance-python-trading" target="_blank" rel="noopener noreferrer" class="jsx-494086174 icon"><svg height="10" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 16.99 17"><path d="M3.85 17H.34V5.67h3.51zM2.07 4.18a2.09 2.09 0 1 1 2.08-2.09 2.08 2.08 0 0 1-2.08 2.09zM17 17h-3.5v-5.95c0-1.63-.62-2.54-1.91-2.54s-2.14.95-2.14 2.54V17H6.09V5.67h3.36v1.52a4 4 0 0 1 3.42-1.87c2.4 0 4.12 1.47 4.12 4.5V17z"></path></svg></a></div>
</div>
</div>
</div>
</div>
<div class="jsx-1464850800 preface">
<div class="jsx-1464850800 author">
<div class="jsx-566588255 Author">
<div class="jsx-3208234818 Avatar"></div>
<div class="jsx-566588255 info">
<div class="jsx-566588255 name"><span>Карлин Виллемс</span></div>
<div class="jsx-566588255 date"><span>23 января 2019 г.</span></div>
</div>
</div>
</div>
<div class="jsx-1464850800 tags">
<div class="jsx-2792531181 TagLine">
<div class="jsx-1764811326 Tag mustRead"><span class="jsx-1764811326 title"><span>ДОЛЖНЫ ПРОЧИТАТЬ</span></span></div>
<div class="jsx-1764811326 Tag"><span class="jsx-1764811326 title"><span>ПИТОН</span></span></div>
<p><a class="jsx-1022557955 more"><span>+ </span><span>1</span></a></p>
</div>
</div>
<h1 class="jsx-1464850800 pageTitle"><span>Python для финансов: алгоритмический трейдинг</span></h1>
<div class="jsx-1464850800 description pageDescription"><span>Это руководство по Python for Finance знакомит вас с алгоритмической торговлей и многим другим.</span></div>
</div>
<div class="markdown">
<div class="container-fluid main-container">
<p><span>Технология стала активом в финансах: финансовые институты теперь превращаются в технологические компании, а не просто заняты только финансовым аспектом: помимо того, что технологии обеспечивают инновации быстротой и могут помочь получить конкурентное преимущество, скорость и частоту финансовых транзакций вместе с большими объемами данных делает то, что внимание финансовых учреждений к технологиям с годами возросло, и что технологии действительно стали основным фактором, способствующим финансам.</span></p>
<p><span>Среди самых популярных языков программирования для финансов вы найдете R и Python, а также такие языки, как C ++, C # и Java. Из этого руководства вы узнаете, как начать работу с Python для финансов. Учебник будет охватывать следующее:</span></p>
<nav>
<ul>
<li><span>В </span><a href="https://www.datacamp.com/community/tutorials/finance-python-trading#basics"><span>основах</span></a><span> , что вам нужно , чтобы начать работу: для тех , кто являются новыми для финансирования, вы будете первым узнать больше о запасах и торговых стратегиях, в какое время данные серий являются и то , что вам нужно настроить свое рабочее место.</span></li>
<li><span>Введение в данные временных рядов и некоторые из наиболее </span><a href="https://www.datacamp.com/community/tutorials/finance-python-trading#financialanalyses"><span>распространенных финансовых анализов</span></a><span> , таких как движущиеся окна, расчет волатильности,… с пакетом Python Pandas.</span></li>
<li><span>Разработка </span><a href="https://www.datacamp.com/community/tutorials/finance-python-trading#tradingstrategy"><span>простой импульсной стратегии</span></a><span> : сначала вы пройдете процесс разработки шаг за шагом и начнете с формулировки и кодирования простой алгоритмической торговой стратегии.</span></li>
<li><span>Далее вы </span><a href="https://www.datacamp.com/community/tutorials/finance-python-trading#backtesting"><span>протестируете</span></a><span> сформулированную торговую стратегию с Pandas, zipline и Quantopian.</span></li>
<li><span>После этого вы увидите, как можно </span><a href="https://www.datacamp.com/community/tutorials/finance-python-trading#improving"><span>оптимизировать</span></a><span> свою стратегию, чтобы она работала лучше, и в конечном итоге вы </span><a href="https://www.datacamp.com/community/tutorials/finance-python-trading#evaluating"><span>оцените</span></a><span> ее эффективность и надежность.</span></li>
</ul>
</nav>
<div id="scoped-content">
<p><span>Загрузите блокнот Jupyter этого руководства </span><a href="https://github.com/datacamp/datacamp-community-tutorials"><span>здесь</span></a><span> .</span></p>
<p><img decoding="async" alt="Учебник по Python для финансов" src="http://res.cloudinary.com/dyd911kmh/image/upload/f_auto,q_auto:best/v1508152857/Python-For-Finance_ubjzcp.png" /></p>
<h2 id="basics"><span>Начало работы с Python для финансов</span></h2>
<p><span>Прежде чем вы начнете заниматься торговыми стратегиями, неплохо бы сначала ознакомиться с основами. Эта первая часть руководства будет посвящена объяснению основ Python, которые вам необходимы для начала работы. Это не означает, однако, что вы начнете с нуля: вы должны были, по крайней мере, пройти бесплатный вводный курс DataCamp « </span><a href="https://www.datacamp.com/courses/intro-to-python-for-data-science"><span>Введение в Python for Data Science»</span></a><span> , в котором вы узнали, как работать со списками, пакетами и NumPy Python. Кроме того, желательно знать основы Pandas, популярного пакета для обработки данных Python, но это не является обязательным требованием.</span></p>
<p><span>Тогда я бы посоветовал вам пройти курс DataCamp </span><a href="https://www.datacamp.com/courses/intro-to-python-for-finance"><span>Intro to Python for Finance,</span></a><span> чтобы изучить основы финансов в Python. Если вы хотите применить свои новые навыки «Python for Data Science» к реальным финансовым данным, подумайте о прохождении курса « </span><a href="https://www.datacamp.com/courses/importing-managing-financial-data-in-python"><span>Импорт и управление финансовыми данными в Python»</span></a><span> .</span></p>
<div class="section level3" id="stocks-trading">
<h3><span>Акции и торговля</span></h3>
<p><span>Когда компания хочет расти и предпринимать новые проекты или расширяться, она может выпускать акции для привлечения капитала. Акция представляет собой долю в собственности компании и выпускается в обмен на деньги. Акции покупаются и продаются: покупатели и продавцы обменивают существующие ранее выпущенные акции. Цена, по которой продаются акции, может изменяться независимо от успеха компании: цены вместо этого отражают спрос и предложение. Это означает, что всякий раз, когда акция считается «желательной» из-за успеха, популярности,… цена акции будет расти.</span></p>
<p><strong><span>Обратите внимание,</span></strong><span> что акции &#8212; это не то же самое, что облигации, когда компании привлекают деньги за счет заимствований, либо в виде займа в банке, либо путем выпуска долговых обязательств.</span></p>
<p><span>Как вы только что прочитали, покупка и продажа или торговля очень важны, когда вы говорите об акциях, но определенно не ограничены этим: торговля &#8212; это акт покупки или продажи </span><em><span>актива</span></em><span> , который может быть финансовым обеспечением, таким как акции, облигация или материальный продукт, такой как золото или нефть.</span></p>
<p><span>Торговля акциями &#8212; это процесс, при котором наличные деньги, выплачиваемые за акции, конвертируются в долю в собственности компании, которая может быть конвертирована обратно в наличные путем продажи, и все это, мы надеемся, с прибылью. Теперь, чтобы получить прибыльный доход, вы либо открываете длинную, либо короткую позицию на рынках: вы либо по долям, полагая, что цена акций будет расти, чтобы продавать по более высокой цене в будущем, либо вы продаете свои акции, ожидая, что вы сможете купить это обратно по более низкой цене и получить прибыль. Когда вы следуете фиксированному плану открывать длинные или короткие позиции на рынках, у вас есть торговая стратегия.</span></p>
<p><span>Разработка торговой стратегии проходит через несколько этапов, например, когда вы, например, строите модели машинного обучения: вы формулируете стратегию и указываете ее в форме, которую вы можете проверить на своем компьютере, вы проводите предварительное тестирование. или тестирование на истории, вы оптимизируете свою стратегию и, наконец, вы оцениваете производительность и надежность вашей стратегии.</span></p>
<p><span>Торговые стратегии обычно проверяются с помощью тестирования на истории: вы реконструируете по историческим данным сделки, которые произошли бы в прошлом, используя правила, которые были определены в разработанной вами стратегии. Таким образом, вы можете получить представление об эффективности вашей стратегии и использовать ее в качестве отправной точки для оптимизации и улучшения вашей стратегии перед ее применением на реальных рынках. Конечно, все это в значительной степени зависит от лежащей в основе теории или убеждения, что любая стратегия, которая сработала хорошо в прошлом, вероятно, также сработает хорошо в будущем, и что любая стратегия, которая работала плохо в прошлом, вероятно, также подойдет плохо в будущем.</span></p>
</div>
<div class="section level3" id="time-series-data">
<h3><span>Данные временного ряда</span></h3>
<p><span>Временной ряд представляет собой последовательность числовых точек данных, взятых в последовательных одинаково разнесенных точках во времени. При инвестировании временной ряд отслеживает движение выбранных точек данных, например цены акций, в течение определенного периода времени с точками данных, записанными через равные промежутки времени. Если вы все еще сомневаетесь в том, как это будет выглядеть, посмотрите на следующий пример:</span></p>
<p><img decoding="async" src="https://s3.amazonaws.com/assets.datacamp.com/blog_assets/Python+Algorithmic+Trading/google_plot_01.png" /></p>
<p><span>Вы видите, что даты расположены на оси X, а цена указана на оси Y. «Последовательные равные интервалы времени» в этом случае означают, что дни, показанные на оси х, разделены на 14 дней: обратите внимание на разницу между 3/7/2005 и следующей точкой, 31.03.2005, и 05.05.2005 и 19.04.2005.</span></p>
<p><span>Однако при работе с данными о запасах вы часто будете видеть не только два столбца, которые содержат наблюдения периода и цены, но в большинстве случаев у вас будет пять столбцов, содержащих наблюдения периода и открытия , максимум, минимум и цены закрытия этого периода. Это означает, что, если ваш период установлен на дневном уровне, данные наблюдений за этот день дадут вам представление о цене открытия и закрытия для этого дня и экстремальных движениях максимума и минимума для конкретной акции в течение этого дня.</span></p>
<p><span>На данный момент у вас есть базовое представление об основных понятиях, которые вам необходимо знать, чтобы пройти этот урок. Эти понятия скоро вернутся, и вы узнаете о них позже в этом уроке.</span></p>
</div>
<div class="section level3" id="setting-up-the-workspace">
<h3><span>Настройка рабочего пространства</span></h3>
<p><span>Подготовка рабочего пространства к работе &#8212; это простая задача: просто убедитесь, что в вашей системе работает Python и интегрированная среда разработки (IDE). Тем не менее, есть несколько способов, с помощью которых вы можете начать, которые могут быть немного проще, когда вы только начинаете.</span></p>
<p><span>Возьмите, например, </span><a href="https://anaconda.org/"><span>Anaconda</span></a><span> , высокопроизводительный дистрибутив Python и R, который включает в себя более 100 самых популярных пакетов Python, R и Scala для науки о данных. Кроме того, установка Anaconda предоставит вам доступ к более чем 720 пакетам, которые можно легко установить с помощью conda, нашего известного менеджера пакетов, зависимостей и среды, который включен в Anaconda. И, кроме всего прочего, вы получите Jupyter Notebook и Spyder IDE вместе с ним.</span></p>
<p><span>Это звучит как хорошая сделка, верно?</span></p>
<p><span>Вы можете установить Anaconda </span><a href="https://www.continuum.io/downloads"><span>отсюда</span></a><span> и не забудьте проверить, как настроить ноутбук Jupyter, в </span><a href="https://www.datacamp.com/community/tutorials/tutorial-jupyter-notebook"><span>учебнике</span></a><span> DataCamp&#8217;s <a href="https://www.datacamp.com/community/tutorials/tutorial-jupyter-notebook">Jupyter Notebook: полное руководство</a> .</span></p>
<p><span>Конечно, Anaconda &#8212; не единственный вариант: вы также можете проверить </span><a href="https://www.enthought.com/products/canopy/"><span>дистрибутив Canopy Python</span></a><span> (который не <a href="https://www.enthought.com/products/canopy/">распространяется</a> бесплатно) или попробовать </span><a href="http://quant-platform.com/"><span>Quant Platform</span></a><span> .</span></p>
<p><span>Последний предлагает вам несколько дополнительных преимуществ по сравнению, например, с использованием Jupyter или Spyder IDE, поскольку он предоставляет вам все, что вам нужно для финансовой аналитики в вашем браузере! С помощью Quant Platform вы получите доступ к графическому инжинирингу на основе графического интерфейса, финансовой аналитике на основе Python и своей собственной библиотеке аналитики на основе Python. Более того, у вас также будет доступ к форуму, где вы можете обсудить решения или вопросы со сверстниками!</span></p>
</div>
<div class="section level3" id="python-basics-for-finance-pandas">
<h3><span>Основы Python для финансов: панды</span></h3>
<p><span>Когда вы используете Python для финансов, вы часто сталкиваетесь с использованием пакета манипулирования данными, Pandas. Но и другие пакеты, такие как NumPy, SciPy, Matplotlib,… будут проходить, как только вы начнете копать глубже.</span></p>
<p><span>А сейчас давайте сосредоточимся на Pandas и используем его для анализа данных временных рядов. В этом разделе объясняется, как вы можете импортировать данные, исследовать и манипулировать ими с помощью Pandas. Вдобавок ко всему этому вы узнаете, как выполнять общий финансовый анализ данных, которые вы импортировали.</span></p>
<div class="section level4" id="importing-financial-data-into-python">
<h4><span>Импорт финансовых данных в Python</span></h4>
<p><span></span><code class="lang-python">pandas-datareader</code><span>Пакет позволяет для чтения в данных из таких источников, как Google, Всемирный банк, &#8230; Если вы хотите иметь обновленный список источников данных, которые доступны с этой функцией, перейдите к </span><a href="https://pandas-datareader.readthedocs.io/en/latest/remote_data.html"><span>документации</span></a><span> . Раньше вы могли получить доступ к данным из Yahoo! Финансирование напрямую, но с тех пор оно устарело. Чтобы получить доступ к Yahoo! Финансовые данные, посмотрите это </span><a href="https://www.youtube.com/watch?v=eSpH6fPd5Yw"><span>видео Мэтта Макарти,</span></a><span> которое показывает обходной путь. Для этого урока вы будете использовать пакет для чтения данных из Yahoo! Финансы. Обязательно сначала установите пакет, установив последнюю версию выпуска через pip с помощью </span><code class="lang-python">pip install pandas-datareader</code><span>.</span></p>
<p><strong><span>Совет</span></strong><span> : если вы хотите установить последнюю версию для разработчиков или у вас возникли какие-либо проблемы, вы можете прочитать инструкции по установке </span><a href="https://github.com/pydata/pandas-datareader/"><span>здесь</span></a><span> .</span></p>
<pre><code class="lang-python hljs"><span class="hljs-keyword">import</span> pandas_datareader <span class="hljs-keyword">as</span> pdr
<span class="hljs-keyword">import</span> datetime <span></span>
aapl = pdr.get_data_yahoo(<span class="hljs-string">'AAPL'</span>, <span></span>
                          start=datetime.datetime(<span class="hljs-number">2006</span>, <span class="hljs-number">10</span>, <span class="hljs-number">1</span>), <span></span>
                          end=datetime.datetime(<span class="hljs-number">2012</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>))</code></pre>
<p><strong><span>Обратите внимание,</span></strong><span> что конечная точка API Yahoo недавно изменилась и что, если вы хотите уже начать работать с библиотекой самостоятельно, вам необходимо установить временное исправление, пока патч не будет объединен с основной веткой, чтобы начать извлечение данных. из Yahoo! Финансы с </span><code class="lang-python">pandas-datareader</code><span>. Убедитесь в том , чтобы читать по этому вопросу </span><a href="https://github.com/pydata/pandas-datareader/issues/315"><span>здесь</span></a><span> , прежде чем начать свой собственный!</span></p>
<p><span>Не беспокойтесь, однако, для этого урока данные были загружены для вас, чтобы вы не столкнулись с какими-либо проблемами при изучении финансов в Python с помощью Pandas.</span></p>
<p><span>Тем не менее, разумно учитывать, что, несмотря на то, что он </span><code class="lang-python">pandas-datareader</code><span>предлагает множество опций для извлечения данных в Python, это не единственный пакет, который вы можете использовать для извлечения финансовых данных: вы также можете использовать библиотеки, такие как Quandl, для Например, чтобы получить данные из Google Finance:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import quandl 
aapl = quandl.get("WIKI/AAPL", start_date="2006-10-01", end_date="2012-01-01")</pre>
<p><span>Для получения дополнительной информации о том, как вы можете использовать Quandl для получения финансовых данных непосредственно в Python, перейдите на </span><a href="https://www.quandl.com/tools/python"><span>эту страницу</span></a><span> .</span></p>
<p><span>Наконец, если вы уже какое-то время работали в сфере финансов, вы, вероятно, знаете, что чаще всего вы используете Excel также для манипулирования своими данными. В таких случаях вы должны знать, что вы можете интегрировать Python с Excel.</span></p>
<p><span>Ознакомьтесь с Руководством по </span><a href="https://www.datacamp.com/community/tutorials/python-excel-tutorial"><span>Python Excel для</span></a><span> DataCamp <a href="https://www.datacamp.com/community/tutorials/python-excel-tutorial">: Подробное руководство</a> для получения дополнительной информации.</span></p>
<h4><span>Работа с данными временного ряда</span></h4>
<p><span>Первое, что вы хотите сделать, когда у вас наконец появятся данные в вашем рабочем пространстве, &#8212; это испачкать руки. Однако теперь, когда вы работаете с данными временных рядов, это может показаться не таким простым, поскольку ваш индекс теперь содержит значения DateTime.</span></p>
<p><span>Не беспокойтесь, хотя! Давайте начнем пошагово и сначала исследуем данные с некоторыми функциями, которые вы, возможно, уже знаете, если у вас есть опыт программирования на R или вы ранее работали с Pandas.</span></p>
<p><span>В любом случае, вы увидите, что это довольно просто!</span></p>
<p><span>Как вы видели в фрагменте кода выше, вы использовали </span><code class="lang-python">pandas_datareader</code><span>для импорта данных в вашу рабочую область. Результирующий объект </span><code class="lang-python">aapl</code><span>представляет собой DataFrame, который представляет собой двумерную помеченную структуру данных со столбцами потенциально разных типов. Теперь, одна из первых вещей , которые вы , вероятно , когда у вас есть регулярные DataFrame на руках, запустив </span><code class="lang-python">head()</code><span>и </span><code class="lang-python">tail()</code><span>функцию загляните на первый и последнюю строку вашего DataFrame. К счастью, это не меняется, когда вы работаете с данными временных рядов!</span></p>
<p><strong><span>Совет</span></strong><span> : также обязательно используйте </span><code class="lang-python">describe()</code><span>функцию, чтобы получить некоторую полезную сводную статистику о ваших данных.</span></p>
<p><span>Как вы видели во введении, эти данные содержат четыре столбца с ценами открытия и закрытия за день и экстремальными максимальными и минимальными движениями цены акций Apple за каждый день. Кроме того, вы также получаете два дополнительных столбца: </span><code class="lang-python">Volume</code><span>и </span><code class="lang-python">Adj Close</code><span>.</span></p>
<p><span>Первый столбец используется для регистрации количества акций, которые были проданы в течение одного дня. Последний, с другой стороны, является скорректированной ценой закрытия: это цена закрытия дня, которая была слегка адаптирована для включения любых действий, которые произошли в любое время до открытия следующего дня. Вы можете использовать этот столбец для изучения исторических результатов или когда вы выполняете подробный анализ исторических результатов.</span></p>
<p><span>Обратите внимание, как метки индекса или строки содержат даты, и как ваши столбцы или метки столбцов содержат числовые значения.</span></p>
<p><strong><span>Подсказка</span></strong><span> : если вы сейчас хотите сохранить эти данные в CSV-файл с помощью </span><code class="lang-python">to_csv()</code><span>функции </span><code class="lang-python">pandas</code><span>и использовать эту </span><code class="lang-python">read_csv()</code><span>функцию для чтения данных обратно в Python. Это очень удобно в тех случаях, когда, например, конечная точка API Yahoo изменилась, и у вас больше нет доступа к вашим данным <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd
aapl.to_csv('data/aapl_ohlc.csv')
df = pd.read_csv('data/aapl_ohlc.csv', header=0, index_col='Date', parse_dates=True)</pre>
<p><span>Теперь, когда вы кратко проверили первые строки своих данных и взглянули на некоторую сводную статистику, пришло время немного углубиться.</span></p>
<p><span>Один из способов сделать это &#8212; проверить индекс и столбцы и выбрать, например, последние десять строк конкретного столбца. Последнее называется подмножеством, потому что вы берете небольшое подмножество ваших данных. Результатом поднабора является Series, который представляет собой одномерный помеченный массив, который может содержать любой тип.</span></p>
<p><strong><span>Помните,</span></strong><span> что структура DataFrame была двумерным помеченным массивом со столбцами, которые потенциально могут содержать различные типы данных.</span></p>
<p>Проверьте все это в упражнении. Во- первых, использовать indexи columnsатрибуты , чтобы посмотреть на индекс и столбцов ваших данных. Затем установите Close подколонку, выбрав только последние 10 наблюдений для DataFrame. Используйте квадратные скобки, []чтобы выделить последние десять значений. Возможно, вы уже знаете этот способ поднабора из других языков программирования, таких как R. В заключение, присвойте последний переменной, tsа затем проверьте, какой это тип ts, используя type() функцию:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Inspect the index 
aapl.index

# Inspect the columns
aapl.columns

# Select only the last 10 observations of `Close`
ts = aapl['Close'][-10:]

# Check the type of `ts` 
type(ts)</pre>
<p><span>Квадратные скобки могут быть полезны для подмножества ваших данных, но они, возможно, не самый идиоматичный способ сделать что-то с Pandas. Вот почему вы должны также взглянуть на </span><code class="lang-python">loc()</code><span>и </span><code class="lang-python">iloc()</code><span>функциях: вы используете бывший для индексации на основе меток , а второй для позиционной индексации.</span></p>
<p><span>На практике это означает , что вы можете передать метку строки меток, таких , как </span><code class="lang-python">2007</code><span>и </span><code class="lang-python">2006-11-01</code><span>, к </span><code class="lang-python">loc()</code><span>функции, в то время как вы передаете целые числа , такие , как </span><code class="lang-python">22</code><span>и </span><code class="lang-python">43</code><span>в </span><code class="lang-python">iloc()</code><span>функции.</span></p>
<p>Пример:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Inspect the first rows of November-December 2006
print(aapl.loc[pd.Timestamp('2006-11-01'):pd.Timestamp('2006-12-31')].head())

# Inspect the first rows of 2007 
print(aapl.loc['2007'].head())

# Inspect November 2006
print(aapl.iloc[22:43])

# Inspect the 'Open' and 'Close' values at 2006-11-01 and 2006-12-01
print(aapl.iloc[[22,43], [0, 3])</pre>
<p><strong><span>Совет</span></strong><span> : если вы внимательно посмотрите на результаты поднабора, вы заметите, что в данных отсутствуют определенные дни; Если вы посмотрите более внимательно на шаблон, вы увидите, что обычно два или три дня не хватает; Эти дни традиционно являются выходными или праздничными днями и не являются частью ваших данных. Это не о чем беспокоиться: это совершенно нормально, и вам не нужно заполнять эти пропущенные дни.</span></p>
<p><span>Помимо индексации, вы можете также изучить некоторые другие методы, чтобы лучше узнать ваши данные. Вы никогда не знаете, что еще появится. Давайте попробуем сэмплировать около 20 строк из набора данных, а затем повторим выборку данных, чтобы </span><code class="lang-python">aapl</code><span>теперь на месячном уровне вместо ежедневного. Вы можете использовать </span><code class="lang-python">sample()</code><span>и </span><code class="lang-python">resample()</code><span>функцию , чтобы сделать это:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Sample 20 rows
sample = aapl.sample(20)

# Print `sample`
print(sample)

# Resample to monthly level 
monthly_aapl = aapl.resample('M').mean()

# Print `monthly_aapl`
print(monthly_aapl)</pre>
<p><span>Очень просто, не правда ли?</span></p>
<p><span>Эта </span><code class="lang-python">resample()</code><span>функция часто используется, потому что она обеспечивает сложный контроль и большую гибкость при преобразовании частоты ваших временных рядов: помимо указания новых временных интервалов и определения того, как вы хотите обрабатывать пропущенные данные, у вас также есть возможность указать, как вы хотите выполнить повторную выборку. ваши данные, как вы можете видеть в примере кода выше. Это резко отличается от </span><code class="lang-python">asfreq()</code><span>метода, в котором у вас есть только первые два варианта.</span></p>
<p><strong><span>Совет</span></strong><span> : попробуйте сами в консоли IPython вышеупомянутого блока DataCamp Light. Пройдите, </span><code class="lang-python">aapl.asfreq("M", method="bfill")</code><span>чтобы увидеть, что происходит!</span></p>
<p><span>Наконец, прежде чем перейти к следующему уровню исследования данных и начать с визуализации ваших данных и выполнения некоторых общих финансовых анализов ваших данных, вы уже можете начать рассчитывать разницу между ценами открытия и закрытия в день. Вы можете быстро выполнить эту арифметическую операцию с помощью панд; Просто вычтите значения в </span><code class="lang-python">Open</code><span>столбце ваших </span><code class="lang-python">aapl</code><span>данных из значений в </span><code class="lang-python">Close</code><span>столбце этих же данных. Или, другими словами, вычесть </span><code class="lang-python">aapl.Close</code><span>из </span><code class="lang-python">aapl.Open</code><span>. Вы сохраняете результат в новом столбце с </span><code class="lang-python">aapl</code><span>именем DataFrame </span><code class="lang-python">diff</code><span>, а затем удаляете его снова с помощью </span><code class="lang-python">del</code><span>:</span></p>
<p><span>Конечно, знание абсолютной прибыли может уже помочь вам понять, делаете ли вы хорошие инвестиции, но в качестве количественного показателя вы можете быть более заинтересованы в более относительных средствах измерения стоимости ваших акций, например, как стоимость определенной акции выросла или упала. Один из способов сделать это &#8212; рассчитать ежедневное процентное изменение.</span></p>
<p><span>Это хорошо знать на данный момент, но пока не беспокойтесь об этом; Вы углубитесь в это немного позже!</span></p>
<p><span>Этот раздел познакомил вас с некоторыми способами сначала изучить ваши данные, прежде чем приступить к выполнению некоторых предыдущих анализов. Тем не менее, вы все еще можете пойти гораздо дальше в этом; Если хотите узнать больше, рассмотрите возможность нашего </span><a href="https://www.datacamp.com/community/tutorials/exploratory-data-analysis-python"><span>анализа данных Python</span></a><span> .</span></p>
<h4><span>Визуализация данных временного ряда</span></h4>
<p><span>Рядом с изучения данных с помощью </span><code class="lang-python">head()</code><span>, </span><code class="lang-python">tail()</code><span>, индексации, &#8230; Вы также можете визуализировать ваши данные временных рядов. Благодаря интеграции Pandas с Matplotlib эта задача становится легкой; Просто используйте </span><code class="lang-python">plot()</code><span>функцию и передайте ей соответствующие аргументы. Кроме того, вы также можете добавить </span><code class="lang-python">grid</code><span>аргумент, чтобы указать, что график также должен иметь сетку на заднем плане.</span></p>
<h2 id="financialanalyses"><span>Общий финансовый анализ</span></h2>
<p><span>Теперь, когда у вас есть представление о ваших данных, о том, что представляют собой данные временных рядов, и как вы можете их использовать </span><code class="lang-python">pandas</code><span>для быстрого изучения ваших данных, пришло время углубиться в некоторые из общих финансовых анализов, которые вы можете сделать, чтобы вы могли реально начать работать к разработке торговой стратегии.</span></p>
<p><span>В оставшейся части этого раздела вы узнаете больше о возвратах, перемещающихся окнах, расчете волатильности и Регулярной регрессии наименьших квадратов (OLS).</span></p>
<h4><span>Возвращает</span></h4>
<p><span>Простое </span><strong><span>ежедневное изменение в процентах</span></strong><span> не учитывает дивиденды и другие факторы и представляет собой величину процентного изменения стоимости акции за один день торговли. Вы обнаружите, что ежедневное процентное изменение легко рассчитывается, так как </span><code class="lang-python">pct_change()</code><span>в пакет Pandas включена функция, облегчающая вашу жизнь:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Import `numpy` as `np`
import numpy as np

# Assign `Adj Close` to `daily_close`
daily_close = aapl[['Adj Close']]

# Daily returns
daily_pct_change = daily_close.pct_change()

# Replace NA values with 0
daily_pct_change.fillna(0, inplace=True)

# Inspect daily returns
print(daily_pct_change)

# Daily log returns
daily_log_returns = np.log(daily_close.pct_change()+1)

# Print daily log returns
print(daily_log_returns)</pre>
<p><span>Обратите внимание, что вы рассчитываете возврат журналов, чтобы лучше понять рост ваших доходов с течением времени.</span></p>
<p><span>Зная, как рассчитать ежедневное процентное изменение, приятно, но что, когда вы хотите узнать ежемесячную или квартальную доходность? В таких случаях вы можете воспользоваться тем </span><code class="lang-python">resample()</code><span>, что вы уже видели в первой части этого урока.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Resample `aapl` to business months, take last observation as value 
monthly = aapl.resample('BM').apply(lambda x: x[-1])

# Calculate the monthly percentage change
monthly.pct_change()

# Resample `aapl` to quarters, take the mean as value per quarter
quarter = aapl.resample("4M").mean()

# Calculate the quarterly percentage change
quarter.pct_change()</pre>
<p><span>Использование </span><code class="lang-python">pct_change()</code><span>довольно удобно, но также затеняет, как именно рассчитываются ежедневные проценты. Вот почему вы можете использовать </span><code class="lang-python">shift()</code><span>функцию Pandas вместо использования </span><code class="lang-python">pct_change()</code><span>. Затем вы делите </span><code class="lang-python">daily_close</code><span>значения на </span><code class="lang-python">daily_close.shift(1) -1</code><span>. Однако, используя эту функцию, вы останетесь со </span><code class="lang-python">NA</code><span>значениями в начале результирующего кадра данных.</span></p>
<p><strong><span>Совет</span></strong><span> : сравните результат следующего кода с результатом, который вы получили в первом блоке DataCamp Light, чтобы четко увидеть разницу между этими двумя методами расчета ежедневного процентного изменения.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null"># Daily returns
daily_pct_change = daily_close / daily_close.shift(1) - 1

# Print `daily_pct_change`
print(daily_pct_change)</pre>
<p><strong><span>Совет</span></strong><span> : рассчитайте дневной доход с помощью функции Pandas </span><code class="lang-python">shift()</code><span>. Попробуйте это в консоли IPython этого блока DataCamp Light! (Для тех, кто не может найти </span><em><span>решение</span></em><span> , попробуйте эту строку кода:) </span><code class="lang-python">daily_log_returns_shift = np.log(daily_close / daily_close.shift(1))</code><span>.</span></p>
<p><span>Для справки, расчет ежедневного процентного изменения основан на следующей формуле: <span class="math inline"><span class="MathJax" id="MathJax-Element-1-Frame" data-mathml="&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;msub&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mstyle displaystyle=&quot;true&quot; scriptlevel=&quot;0&quot;&gt;&lt;mfrac&gt;&lt;mrow class=&quot;MJX-TeXAtom-ORD&quot;&gt;&lt;msub&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;msub&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mrow class=&quot;MJX-TeXAtom-ORD&quot;&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;&amp;#x2212;&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;/mfrac&gt;&lt;/mstyle&gt;&lt;mo&gt;&amp;#x2212;&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/math&gt;" role="presentation" style="box-sizing: border-box; display: inline; font-style: normal; font-weight: normal; line-height: normal; font-size: 20px; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; overflow-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; position: relative;" tabindex="0"><nobr aria-hidden="true"><span class="math" id="MathJax-Span-1"><span class="mrow" id="MathJax-Span-2"><span class="msubsup" id="MathJax-Span-3"><span class="mi" id="MathJax-Span-4">r</span></span></span></span></nobr></span></span></span><span class="math inline"><span class="MathJax" id="MathJax-Element-1-Frame" data-mathml="&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;msub&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mstyle displaystyle=&quot;true&quot; scriptlevel=&quot;0&quot;&gt;&lt;mfrac&gt;&lt;mrow class=&quot;MJX-TeXAtom-ORD&quot;&gt;&lt;msub&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;msub&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mrow class=&quot;MJX-TeXAtom-ORD&quot;&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;&amp;#x2212;&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;/mfrac&gt;&lt;/mstyle&gt;&lt;mo&gt;&amp;#x2212;&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/math&gt;" role="presentation" style="box-sizing: border-box; display: inline; font-style: normal; font-weight: normal; line-height: normal; font-size: 20px; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; overflow-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; position: relative;" tabindex="0"><nobr aria-hidden="true"><span class="math" id="MathJax-Span-1"><span><span class="mrow" id="MathJax-Span-2"><span class="msubsup" id="MathJax-Span-3"><span class="mi" id="MathJax-Span-4"></span><span class="mi" id="MathJax-Span-5">T</span></span><span class="mo" id="MathJax-Span-6">= </span><span class="mstyle" id="MathJax-Span-7"><span class="mrow" id="MathJax-Span-8"><span class="mfrac" id="MathJax-Span-9"><span class="texatom" id="MathJax-Span-10"><span class="mrow" id="MathJax-Span-11"><span class="msubsup" id="MathJax-Span-12"><span class="mi" id="MathJax-Span-13">р</span><span class="mi" id="MathJax-Span-14">T</span></span></span></span><span class="msubsup" id="MathJax-Span-15"><span class="mi" id="MathJax-Span-16">п</span><span class="texatom" id="MathJax-Span-17"><span class="mrow" id="MathJax-Span-18"><span class="mi" id="MathJax-Span-19">т </span><span class="mo" id="MathJax-Span-20">&#8212; </span><span class="mn" id="MathJax-Span-21">1</span></span></span></span></span></span></span><span class="mo" id="MathJax-Span-22">&#8212; </span><span class="mn" id="MathJax-Span-23">1</span></span></span><span></span></span></nobr><span class="MJX_Assistive_MathML" role="presentation"><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi><span>р</span></mi><mi><span>T</span></mi></msub><mo><span>знак равно</span></mo><mstyle displaystyle="true" scriptlevel="0"><mfrac><mrow class="MJX-TeXAtom-ORD"><msub><mi><span>п</span></mi><mi><span>T</span></mi></msub></mrow><msub><mi><span>п</span></mi><mrow class="MJX-TeXAtom-ORD"><mi><span>T</span></mi><mo><span>&#8212;</span></mo><mn><span>1</span></mn></mrow></msub></mfrac></mstyle><mo><span>&#8212;</span></mo><mn><span>1</span></mn></math></span></span></span><span>где </span><em><span>p</span></em><span> &#8212; цена, </span><em><span>t</span></em><span> &#8212; время (в данном случае день), а </span><em><span>r</span></em><span> &#8212; доход.</span></p>
<p><span>Кроме того, вы можете построить график распределения </span><code class="lang-python">daily_pct_change</code><span>:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null"># Import matplotlib
import matplotlib.pyplot as plt

# Plot the distribution of `daily_pct_c`
daily_pct_change.hist(bins=50)

# Show the plot
plt.show()

# Pull up summary statistics
print(daily_pct_change.describe())</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/python_for_finance_content_finance_plot2.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/python_for_finance_content_finance_plot2.png" alt="" width="381" height="264" class="aligncenter size-full wp-image-356" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/python_for_finance_content_finance_plot2.png 381w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/python_for_finance_content_finance_plot2-300x208.png 300w" sizes="(max-width: 381px) 100vw, 381px" /></a></p>
<p><span>Распределение выглядит очень симметрично и нормально распределено: центр ежедневных изменений вокруг корзины 0,00. Обратите внимание, как вы можете и должны использовать результаты</span><code class="lang-python">describe()</code><span> функции, примененной </span><code class="lang-python">daily_pct_c</code><span>, чтобы правильно интерпретировать результаты гистограммы. Вы увидите, что среднее значение очень близко к бину 0,00, а стандартное отклонение составляет 0,02. Кроме того, взгляните на процентили, чтобы узнать, сколько ваших точек данных упадут ниже -0,010672, 0,001677 и 0,014306.</span></p>
<p><span></span><strong><span>Кумулятивная суточная норма прибыли</span></strong><span> полезно для определения стоимости инвестиций через регулярные промежутки времени. Вы можете рассчитать совокупную дневную норму прибыли, используя значения ежедневного изменения в процентах, добавляя </span><code class="lang-python">1</code><span>к ним и вычисляя совокупный продукт с полученными значениями:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Calculate the cumulative daily returns
cum_daily_return = (1 + daily_pct_change).cumprod()

# Print `cum_daily_return`
print(cum_daily_return)</pre>
<p><span>Обратите внимание, что вы можете использовать снова использовать Matplotlib для быстрого построения </span><code class="lang-python">cum_daily_return</code><span>; Просто добавьте </span><code class="lang-python">plot()</code><span>к нему функцию и, при необходимости, определите </span><code class="lang-python">figsize</code><span>размер или размер рисунка:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null"># Import matplotlib
import matplotlib.pyplot as plt 

# Plot the cumulative daily returns
cum_daily_return.plot(figsize=(12,8))

# Show the plot
plt.show()</pre>
</div>
</div>
</div>
</div>
</div>


<p></p>
<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-for-finance-algorithmic-trading%2F&amp;linkname=Python%20%D0%B4%D0%BB%D1%8F%20%D0%A4%D0%B8%D0%BD%D0%B0%D0%BD%D1%81%D0%BE%D0%B2%3A%20%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9%20%D1%82%D1%80%D0%B5%D0%B9%D0%B4%D0%B8%D0%BD%D0%B3%20%2F%20%D1%82%D0%BE%D1%80%D0%B3%D0%BE%D0%B2%D0%BB%D1%8F.%20Binance" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-for-finance-algorithmic-trading%2F&amp;linkname=Python%20%D0%B4%D0%BB%D1%8F%20%D0%A4%D0%B8%D0%BD%D0%B0%D0%BD%D1%81%D0%BE%D0%B2%3A%20%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9%20%D1%82%D1%80%D0%B5%D0%B9%D0%B4%D0%B8%D0%BD%D0%B3%20%2F%20%D1%82%D0%BE%D1%80%D0%B3%D0%BE%D0%B2%D0%BB%D1%8F.%20Binance" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-for-finance-algorithmic-trading%2F&amp;linkname=Python%20%D0%B4%D0%BB%D1%8F%20%D0%A4%D0%B8%D0%BD%D0%B0%D0%BD%D1%81%D0%BE%D0%B2%3A%20%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9%20%D1%82%D1%80%D0%B5%D0%B9%D0%B4%D0%B8%D0%BD%D0%B3%20%2F%20%D1%82%D0%BE%D1%80%D0%B3%D0%BE%D0%B2%D0%BB%D1%8F.%20Binance" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-for-finance-algorithmic-trading%2F&amp;linkname=Python%20%D0%B4%D0%BB%D1%8F%20%D0%A4%D0%B8%D0%BD%D0%B0%D0%BD%D1%81%D0%BE%D0%B2%3A%20%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9%20%D1%82%D1%80%D0%B5%D0%B9%D0%B4%D0%B8%D0%BD%D0%B3%20%2F%20%D1%82%D0%BE%D1%80%D0%B3%D0%BE%D0%B2%D0%BB%D1%8F.%20Binance" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-for-finance-algorithmic-trading%2F&amp;linkname=Python%20%D0%B4%D0%BB%D1%8F%20%D0%A4%D0%B8%D0%BD%D0%B0%D0%BD%D1%81%D0%BE%D0%B2%3A%20%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9%20%D1%82%D1%80%D0%B5%D0%B9%D0%B4%D0%B8%D0%BD%D0%B3%20%2F%20%D1%82%D0%BE%D1%80%D0%B3%D0%BE%D0%B2%D0%BB%D1%8F.%20Binance" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-for-finance-algorithmic-trading%2F&amp;linkname=Python%20%D0%B4%D0%BB%D1%8F%20%D0%A4%D0%B8%D0%BD%D0%B0%D0%BD%D1%81%D0%BE%D0%B2%3A%20%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9%20%D1%82%D1%80%D0%B5%D0%B9%D0%B4%D0%B8%D0%BD%D0%B3%20%2F%20%D1%82%D0%BE%D1%80%D0%B3%D0%BE%D0%B2%D0%BB%D1%8F.%20Binance" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-for-finance-algorithmic-trading%2F&amp;linkname=Python%20%D0%B4%D0%BB%D1%8F%20%D0%A4%D0%B8%D0%BD%D0%B0%D0%BD%D1%81%D0%BE%D0%B2%3A%20%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9%20%D1%82%D1%80%D0%B5%D0%B9%D0%B4%D0%B8%D0%BD%D0%B3%20%2F%20%D1%82%D0%BE%D1%80%D0%B3%D0%BE%D0%B2%D0%BB%D1%8F.%20Binance" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-for-finance-algorithmic-trading%2F&#038;title=Python%20%D0%B4%D0%BB%D1%8F%20%D0%A4%D0%B8%D0%BD%D0%B0%D0%BD%D1%81%D0%BE%D0%B2%3A%20%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9%20%D1%82%D1%80%D0%B5%D0%B9%D0%B4%D0%B8%D0%BD%D0%B3%20%2F%20%D1%82%D0%BE%D1%80%D0%B3%D0%BE%D0%B2%D0%BB%D1%8F.%20Binance" data-a2a-url="https://python.ivan-shamaev.ru/python-for-finance-algorithmic-trading/" data-a2a-title="Python для Финансов: Алгоритмический трейдинг / торговля. Binance"></a></p><p>Сообщение <a href="https://python.ivan-shamaev.ru/python-for-finance-algorithmic-trading/">Python для Финансов: Алгоритмический трейдинг / торговля. Binance</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://python.ivan-shamaev.ru/python-for-finance-algorithmic-trading/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
