在上次写的线性回归螺纹钢(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小时去套利,相关性还是不够高,还要使用更多的特征才行。

 

 

收藏 打印