Проводя выходные за изучением анализа криптовалют. Я собрал код для загрузки ежедневных цен на биткойн и применения к нему простой торговой стратегии.
Обратите внимание, что уже существуют инструменты для проведения такого анализа, например. Tradeview, но этот способ позволяет более углубленный анализ.
Я не трейдер, и этот пост не является финансовым советом. Это чисто вводная информация. Вывод здесь может быть обманчивым, поскольку мы анализируем период времени с огромным ростом.
Требования:
API-интерфейс cryptocompare возвращает следующие столбцы:
open, цена, по которой открылся период,
high , самая высокая цена, достигнутая за период,
low , самая низкая цена, достигнутая за период,
close, цена, по которой закрылся период,
volumefrom, объема в базовой валюте, в которой идет торговля.
Мы загружаем данные и сохраняем их в файл.
Мы считаем данные из файла, поэтому нам не нужно загружать их снова.
Торговая стратегия
Торговая стратегия - это набор объективных правил, определяющих условия, которые должны быть выполнены для входа и выхода из сделки.
Мы собираемся применить торговую стратегию схождения скользящей средней (MACD), которая является популярным индикатором, используемым в техническом анализе. MACD рассчитывает две скользящие средние различной длины для определения направления и продолжительности тренда. Затем он принимает разницу в значениях между этими двумя скользящими средними (линия MACD) и экспоненциальной скользящей средней (сигнальная линия) этих скользящих средних.
Как мы можем видеть в примере ниже:
- выйти из сделки (продать), когда линия MACD пересекает линию сигнала MACD,
- входите в сделку (покупка), когда линия MACD пересекает сигнальную линию MACD.
Рассчитать торговую стратегию
Мы используем пакет stockstats для расчета MACD.
stockstats добавляет 5 столбцов в набор данных:
close_12_ema - быстрая 12-дневная экспоненциальная скользящая средняя,
close_26_ema - это медленное экспоненциальное скользящее среднее значение за 26 дней,
macd - это линия MACD,
macds - это сигнальная линия,
macdh - это гистограмма MACD.
Визуализация торговой стратегии
Для построения данных мы используем интерактивные диаграммы Боке.
Линейный график показывает дневные цены закрытия со свечами (увеличение). Свеча отображает максимумы, минимумы, цены открытия и закрытия за определенный период.
Ниже линейного графика мы строим стратегию MACD с линией MACD (синяя), сигнальной линией (оранжевая) и гистограммой (фиолетовая).
Обратите внимание, что уже существуют инструменты для проведения такого анализа, например. Tradeview, но этот способ позволяет более углубленный анализ.
Я не трейдер, и этот пост не является финансовым советом. Это чисто вводная информация. Вывод здесь может быть обманчивым, поскольку мы анализируем период времени с огромным ростом.
Требования:
- Python 3
- Блокнот Jupyter
- Библиотека анализа данных Pandas
- Bokeh интерактивная библиотека визуализации
- фондовая статистика / индикаторы расчета помощника
- Получение данных криптовалюты
Код:
from_symbol = 'BTC'
to_symbol = 'USD'
exchange = 'Bitstamp'
datetime_interval = 'day'
open, цена, по которой открылся период,
high , самая высокая цена, достигнутая за период,
low , самая низкая цена, достигнутая за период,
close, цена, по которой закрылся период,
volumefrom, объема в базовой валюте, в которой идет торговля.
Мы загружаем данные и сохраняем их в файл.
Код:
import requests
from datetime import datetime
def get_filename(from_symbol, to_symbol, exchange, datetime_interval, download_date):
return '%s_%s_%s_%s_%s.csv' % (from_symbol, to_symbol, exchange, datetime_interval, download_date)
def download_data(from_symbol, to_symbol, exchange, datetime_interval):
supported_intervals = {'minute', 'hour', 'day'}
assert datetime_interval in supported_intervals,\
'datetime_interval should be one of %s' % supported_intervals
print('Downloading %s trading data for %s %s from %s' %
(datetime_interval, from_symbol, to_symbol, exchange))
base_url = 'https://min-api.cryptocompare.com/data/histo'
url = '%s%s' % (base_url, datetime_interval)
params = {'fsym': from_symbol, 'tsym': to_symbol,
'limit': 2000, 'aggregate': 1,
'e': exchange}
request = requests.get(url, params=params)
data = request.json()
return data
def convert_to_dataframe(data):
df = pd.io.json.json_normalize(data, ['Data'])
df['datetime'] = pd.to_datetime(df.time, unit='s')
df = df[['datetime', 'low', 'high', 'open',
'close', 'volumefrom', 'volumeto']]
return df
def filter_empty_datapoints(df):
indices = df[df.sum(axis=1) == 0].index
print('Filtering %d empty datapoints' % indices.shape[0])
df = df.drop(indices)
return df
data = download_data(from_symbol, to_symbol, exchange, datetime_interval)
df = convert_to_dataframe(data)
df = filter_empty_datapoints(df)
current_datetime = datetime.now().date().isoformat()
filename = get_filename(from_symbol, to_symbol, exchange, datetime_interval, current_datetime)
print('Saving data to %s' % filename)
df.to_csv(filename, index=False)
Код:
import pandas as pd
def read_dataset(filename):
print('Reading data from %s' % filename)
df = pd.read_csv(filename)
# change type from object to datetime
df.datetime = pd.to_datetime(df.datetime)
df = df.set_index('datetime')
df = df.sort_index() # sort by datetime
print(df.shape)
return df
df = read_dataset(filename)
Торговая стратегия - это набор объективных правил, определяющих условия, которые должны быть выполнены для входа и выхода из сделки.
Мы собираемся применить торговую стратегию схождения скользящей средней (MACD), которая является популярным индикатором, используемым в техническом анализе. MACD рассчитывает две скользящие средние различной длины для определения направления и продолжительности тренда. Затем он принимает разницу в значениях между этими двумя скользящими средними (линия MACD) и экспоненциальной скользящей средней (сигнальная линия) этих скользящих средних.
Как мы можем видеть в примере ниже:
- выйти из сделки (продать), когда линия MACD пересекает линию сигнала MACD,
- входите в сделку (покупка), когда линия MACD пересекает сигнальную линию MACD.
Рассчитать торговую стратегию
Мы используем пакет stockstats для расчета MACD.
Код:
from stockstats import StockDataFrame
df = StockDataFrame.retype(df)
df['macd'] = df.get('macd') # calculate MACD
close_12_ema - быстрая 12-дневная экспоненциальная скользящая средняя,
close_26_ema - это медленное экспоненциальное скользящее среднее значение за 26 дней,
macd - это линия MACD,
macds - это сигнальная линия,
macdh - это гистограмма MACD.

Визуализация торговой стратегии
Для построения данных мы используем интерактивные диаграммы Боке.
Линейный график показывает дневные цены закрытия со свечами (увеличение). Свеча отображает максимумы, минимумы, цены открытия и закрытия за определенный период.
Ниже линейного графика мы строим стратегию MACD с линией MACD (синяя), сигнальной линией (оранжевая) и гистограммой (фиолетовая).
Код:
from math import pi
from bokeh.plotting import figure, show, output_notebook, output_file
output_notebook()
datetime_from = '2016-01-01 00:00'
datetime_to = '2017-12-10 00:00'
def get_candlestick_width(datetime_interval):
if datetime_interval == 'minute':
return 30 * 60 * 1000 # half minute in ms
elif datetime_interval == 'hour':
return 0.5 * 60 * 60 * 1000 # half hour in ms
elif datetime_interval == 'day':
return 12 * 60 * 60 * 1000 # half day in ms
df_limit = df[datetime_from: datetime_to].copy()
inc = df_limit.close > df_limit.open
dec = df_limit.open > df_limit.close
title = '%s datapoints from %s to %s for %s and %s from %s with MACD strategy' % (
datetime_interval, datetime_from, datetime_to, from_symbol, to_symbol, exchange)
p = figure(x_axis_type="datetime", plot_width=1000, title=title)
p.line(df_limit.index, df_limit.close, color='black')
# plot macd strategy
p.line(df_limit.index, 0, color='black')
p.line(df_limit.index, df_limit.macd, color='blue')
p.line(df_limit.index, df_limit.macds, color='orange')
p.vbar(x=df_limit.index, bottom=[
0 for _ in df_limit.index], top=df_limit.macdh, width=4, color="purple")
# plot candlesticks
candlestick_width = get_candlestick_width(datetime_interval)
p.segment(df_limit.index, df_limit.high,
df_limit.index, df_limit.low, color="black")
p.vbar(df_limit.index[inc], candlestick_width, df_limit.open[inc],
df_limit.close[inc], fill_color="#D5E1DD", line_color="black")
p.vbar(df_limit.index[dec], candlestick_width, df_limit.open[dec],
df_limit.close[dec], fill_color="#F2583E", line_color="black")
output_file("visualizing_trading_strategy.html", title="visualizing trading strategy")
show(p)

Последнее редактирование модератором: