线性OLS Python及其在现实世界中的使用

时间:2019-02-28 13:49:31

标签: python pandas linear-regression

对于很长的帖子,我感到非常抱歉,但是任何帮助将不胜感激。它对编程有一点帮助,并且可以解释其背后的数学原理。

我正在研究一种加密货币对交易模型,使用多元线性回归,并且由于我不能做空加密货币,我正在研究高度负相关的硬币,因此我可以将每笔“交易”中的所有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 variable)线有多远以及进行此交易的比率的百分比。

因此,例如,如果我确定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.81 corr)呈负相关,但LTC(-0.8 corr)却根本不相关。这向我暗示,如果我购买了CDT,实际上我将不得不出售它,据我所知,这毫无意义?

有人可以在这里解释我做错了什么吗?还是通过一些奇怪的扭曲实际上是正确的吗?

非常感谢您的帮助,并随时提出改进建议。

0 个答案:

没有答案