Линейный OLS Python и его использование в реальном мире - PullRequest
0 голосов
/ 28 февраля 2019

Заранее прошу прощения за то, что это будет действительно длинный пост, но любая помощь будет очень признательна.Это немного помогает в программировании и немного объясняет математику.

Я работаю над моделью торговли криптопарами, использую множественную линейную регрессию, и поскольку я не могу шортить криптографию, я смотрю на сильно отрицательно коррелированные монеты, поэтому я могу делать длинные все 3 за «сделку»и в теории все еще остается нейтральным рынком.

Итак, во-первых, это код, который я запускаю для получения данных:

import requests
import json
import numpy as np
import pandas as pd
import statsmodels.api as sm
import datetime as dt

def get_bars(symbol, interval):
   url = 'https://api.binance.com/api/v1/klines?symbol=' + symbol + '&interval=' + interval + '&limit=1000'
   data = json.loads(requests.get(url).text)
   df = pd.DataFrame(data)
   df.columns = ['open_time',
                 'o', 'h', 'l', 'c', 'v',
                 'close_time', 'qav', 'num_trades',
                 'taker_base_vol', 'taker_quote_vol', 'ignore']
   df.index = [dt.datetime.fromtimestamp(x/1000.0) for x in df.close_time]
   return df

coin_a = get_bars('CDTBTC', '1h')
coin_a = pd.DataFrame(coin_a['c'])
coin_a.reset_index(inplace=True)
coin_a.columns = ['Date', 'CDTBTC']
coin_a['CDTBTC'] = pd.to_numeric(coin_a['CDTBTC'], errors='coerce')

coin_b = get_bars('BNBBTC', '1h')
coin_b = pd.DataFrame(coin_b['c'])
coin_b.reset_index(inplace=True)
coin_b.columns = ['Date', 'BNBBTC']
coin_b['BNBBTC'] = pd.to_numeric(coin_b['BNBBTC'], errors='coerce')

coin_c = get_bars('LTCBTC', '1h')
coin_c = pd.DataFrame(coin_c['c'])
coin_c.reset_index(inplace=True)
coin_c.columns = ['Date', 'LTCBTC']
coin_c['LTCBTC'] = pd.to_numeric(coin_c['LTCBTC'], errors='coerce')

df = pd.merge(coin_a, coin_b, on='Date', how='left')
df = df.merge(coin_c, on='Date', how='left')

Я просто использую эти три монетыв качестве примера, насколько я знаю, существует отрицательная корреляция между CDT и BNB и LTC.

Затем я хочу провести ее через модель линейной регрессии, и пусть эта модель возвращает процент от того, насколько далеко от линииCDT (переменная y) лучше всего подходит и в каком соотношении выставлять эту сделку.

Так, например, если я решу, что CDT достаточно вне линии, и я хочу войти в эту сделку, я не буду покупать100 CDT, 100 BNB и 100 LTC, так как все они продаются по разным ценам и с разной волатильностью, поэтому я хочу знать, если я куплю 100 CDT, сколько BNB и LTC мне нужно купить.

Так что я ттогда я думаю, что мне нужно сделать следующее:

X = df[['BNBBTC', 'LTCBTC']]
y = df['CDTBTC']
model = sm.OLS(y, X).fit()

Затем я бы вычислил в процентном выражении, насколько парная текущая цена CDT была от линии наилучшего соответствия, выполнив это:

out_of_line = ((df['CDTBTC'].iloc[-1] - model.predict(X).iloc[-1]) / df['CDTBTC'].iloc[-1] ) *100
print(out_of_line)

Что дает мне: -10.706244772347414 говорит мне, что CDT почти на 11% недооценен, в зависимости от того, где в настоящее время торгуют две другие монеты.

Давайте представим, что я думал, что это приемлемый уровень для входа в сделку.Поскольку я знаю, что переменные X имеют отрицательную корреляцию, я ожидаю купить все три монеты в некотором соотношении.Однако, когда я возвращаю уклоны, которые, как мне показалось, дали бы мне следующие соотношения, я получаю:

BNBBTC   -0.000933
LTCBTC    0.000387

Соотношение BNB потенциально выглядит мне правильным, поскольку оно отрицательно коррелирует с CDT (-0,81corr), но LTC (-0.8 corr) не совсем.Это наводит меня на мысль, что на самом деле мне пришлось бы продать его, если бы я купил CDT, который, насколько я могу судить, не имеет никакого смысла?

Может кто-нибудь объяснить, что я здесь делаю неправильно?Или это какой-то странный поворот на самом деле правильно?

Большое спасибо за любую помощь и не стесняйтесь предлагать улучшения для сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...