Заранее прошу прощения за то, что это будет действительно длинный пост, но любая помощь будет очень признательна.Это немного помогает в программировании и немного объясняет математику.
Я работаю над моделью торговли криптопарами, использую множественную линейную регрессию, и поскольку я не могу шортить криптографию, я смотрю на сильно отрицательно коррелированные монеты, поэтому я могу делать длинные все 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, который, насколько я могу судить, не имеет никакого смысла?
Может кто-нибудь объяснить, что я здесь делаю неправильно?Или это какой-то странный поворот на самом деле правильно?
Большое спасибо за любую помощь и не стесняйтесь предлагать улучшения для сообщения.