线性回归螺纹钢(2)——各周期与铁矿石的相关性

本文通过聚宽平台回测了螺纹钢与铁矿石在不同时间周期下的线性相关性,发现4小时周期下两者波动率线性相关性最强,但相关性仍不算高,表明长期走势各自独立。短周期内,相关性虽存在,但不足以支撑稳定套利策略。

在上次写的线性回归螺纹钢(1)中,我提到了,要是用不同的时间周期去回测三个品种和螺纹钢走势的相关性,那会有什么结果?今天回测了一下铁矿石和螺纹钢在不同时间周期的线性相关性,补充一下上次的结论。


还是使用聚宽平台,时间周期选择了两组,一组是日线——d,一组是分钟——m:

time1=['1d','2d','3d','4d','5d','6d','7d','8d','9d','10d']
            time1=['3m','10m','10m','15m','30m','60m','120m','240m']

想看看这两个时间周期之下,两个品种的波动率线性相关程度。

波动率我用的是(收盘价-前收盘价)/前收盘价,这个结果是有正负号的,代表方向,代码如下:

# 导入函数库
from jqdata import *
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

## 初始化函数,设定基准等等
def initialize(context):
    # 设定沪深300作为基准
   
    set_option('use_real_price', True)
 
    set_order_cost(OrderCost(open_commission=0.000023, close_commission=0.000023,close_today_commission=0.0023), type='index_futures')
    # 设定保证金比例
    set_option('futures_margin_rate', 0.15)
    run_daily(find,'every_bar')

def find(context):
    time1=['1d','2d','3d','4d','5d','6d','7d','8d','9d','10d']
    # time1=['3m','10m','10m','15m','30m','60m','120m','240m']
    # 时间单位必须统一,不能h/m混着写
    lrg=LinearRegression()
    
    for i in time1:
        close=get_price('RB9999.XSGE', start_date='2018-08-01', end_date='2018-10-31', frequency=i, fields=['close'])
        preclose=close.shift(-1)
        tksclose=get_price('I9999.XDCE', start_date='2018-08-01', end_date='2018-10-31', frequency=i, fields=['close'])
        tkspreclose=tksclose.shift(-1)
        lwval=(close-preclose)/preclose
        tksval=(tksclose-tkspreclose)/tkspreclose
        df=pd.concat([lwval,tksval],axis=1)
        df.columns=['lw','tk']
        df=df.dropna()
        x=df['tk']
        y=df['lw']
        # 因为x只有一列,所以转换x的形状,不然不能线性回归,最少要一行一列才行
        size=x.size
        x=x.reshape(size,1)
        xtrain,xtest,ytrain,ytest=train_test_split(x,y,random_state=1)
        
        lrg.fit(xtrain,ytrain)
        
        # print(tksval)
        print(i,lrg.score(x,y))
        
      

结论:

1.从日线来看r2分别是:

('1d', 0.35458999058508112)

 ('2d', 0.31546814075046092)

('3d', 0.26994514217911858)

  ('4d', 0.00015490100106330118)

 ('5d', 0.10652471757813575)

  ('6d', 0.1025735696079132)

  ('7d', 0.40812991095205065)

  ('8d', 0.0017125520187549759)

 ('9d', -0.071466242759331999)

  ('10d', 0.046215210652286398)

其中,1d,7d表现最好,这两个数据很有意思,更有意思是4d表现最差,8,9,10也不怎么样,可见做螺纹和铁矿石的话,其实长期来看走势相关性并不大,还是各走各的。

短周期,1,2,3还都差强人意,7d的突然变好很耐人寻味,应该不是7天是一周和1d重合了这么简单,要是这样为什么2和8,3和9没有这种规律呢?

 

2.分钟结果:

('3m', 0.18987742325127832)

 ('10m', 0.19381961722754526)

('10m', 0.19381961722754526)

 ('15m', 0.18850620224707715)

 ('30m', 0.21614674280625279)

 ('60m', 0.19894972199818906)

 ('120m', 0.48498012833507825)

 ('240m', 0.66914919403832673)

这个结论超级明显,周期越长越好,4小时最好,但是按照4小时下单的话,一天的机会成本可有点高了。

单从r2来看,4小时的确是最优选择,不过0.66还不算很高。

 

注意事项:

1.聚宽平台上面的回测给出的时间选项field在传参数的时候时间周期必须一致,必须m/h两个时间单位拆开写,不然就报错。

2.在使用线性回归.fit()的时候,由于这次x就一个铁矿石,是n*1的向量,结果.fit()竟然不能用,必须变成n*n的矩阵才能用,所以不得不转换形状,加了一个.reshape(size,1),这个地方用size而不是直接传入一个固定值,是因为不同时间周期的k线数量不同,不好传一个固定值,所以,索性直接把当前时间周期下的k线数目找到——size,然后把原来的向量变换形式就可以了,这个地方的报错最搞笑,提示的是:

‘ValueError: Found input variables with inconsistent numbers of samples: xxx’——找到样本数不一致的输入变量xxx

让人误以为输入的x,y长度不同或者里面有空值,实在是坑。

3.从二者的波动率来看,相关性在4小时最强,时间越长越差,可见套利交易,还是短线交易为主,长期来看,他们俩没有必然联系。就算使用4小时去套利,相关性还是不够高,还要使用更多的特征才行。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值