Анализ криптовалюты с помощью Python - MACD.

blacktrader

Наш человек
Член команды
Администратор
Проводя выходные за изучением анализа криптовалют. Я собрал код для загрузки ежедневных цен на биткойн и применения к нему простой торговой стратегии.
Обратите внимание, что уже существуют инструменты для проведения такого анализа, например. Tradeview, но этот способ позволяет более углубленный анализ.

Я не трейдер, и этот пост не является финансовым советом. Это чисто вводная информация. Вывод здесь может быть обманчивым, поскольку мы анализируем период времени с огромным ростом.

Требования:
  • Python 3
  • Блокнот Jupyter
  • Библиотека анализа данных Pandas
  • Bokeh интерактивная библиотека визуализации
  • фондовая статистика / индикаторы расчета помощника
  • Получение данных криптовалюты
Мы ежедневно загружаем данные о btc в долларах США на бирже Bitstamp. Также поддерживаются другие биржи.

Код:
from_symbol = 'BTC'
to_symbol = 'USD'
exchange = 'Bitstamp'
datetime_interval = 'day'
API-интерфейс cryptocompare возвращает следующие столбцы:
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
stockstats добавляет 5 столбцов в набор данных:
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)
 
Последнее редактирование модератором:

Онлайн статистика

Пользователи онлайн
0
Гости онлайн
66
Всего посетителей
66

Статистика форума

Темы
1 646
Сообщения
53 511
Пользователи
9 184
Новый пользователь
BoldikuFFs

Мы в социальных сетях

Вверх Снизу