阅读 424

Python量化交易进阶讲堂-线性回归拟合股价沉浮

在《Python实战-构建基于股票的量化交易系统》小册子中,我们 对浙大网新这只股票进行了线性回归分析,得到了回归直线,如下所示:

由于线性回归作用于股票收盘价的整个周期,因此选择合适的时间段非常重要。比如以高鸿股份为例,以下是它从2018一整年的走势图,如下所示:

从图中可以看到2018年4月10月是单边下降趋势,而从10月份开始转为上升趋势。那么我们分别对这两段周期做线性回归后发现,单边下降通道的拟合直线角度为-0.97度,而上升通道拟合直线角度为1.5度,股价的拟合直线角度从-0.97度至1.5度的转变过程,其实也是由跌转涨的过程。

在制定量化交易策略时有一种方式是寻找现象中的特征,根据特征去生成交易条件。那么这里给大家一个衍生的策略思路,既然线性回归作用于股票收盘价的整个周期,前后两段完全相反的周期会彼此作用,最终影响拟合的角度值,我们可以设定窗口期用移动窗口的方式拟合股票的走势。部分代码如下:(可以在小册交流群中获取)

def fit_price(self, symbols, cycle=30, show=True):
    for index, stockName in enumerate(symbols.keys()):
        #kl_pd = getdata #参考fit_pick()方法,此处略
        kl_pd.fillna(method='bfill', inplace=True) 
        for kl_index in np.arange(0, kl_pd.shape[0]):
            if kl_index >= cycle:
                kl_pd.loc[kl_pd.index[kl_index], "ang"], x, reg_y_fit, y_arr = self.calc_regress_deg(kl_pd.Close[kl_index-cycle:kl_index])                  print(kl_pd.index[kl_index],kl_pd.iloc[kl_index, kl_pd.columns.get_loc("ang")])
        if show:
            kl_pd.fillna(method='bfill', inplace=True)
            plt.plot(np.arange(0, len(kl_pd.index)), kl_pd.ang)

    plt.title('compare ang')
    plt.legend(symbols.keys(), loc='best')
    plt.show()

复制代码

执行该代码examp_trade.fit_price(pick_stocks)生成浙大网新、高鸿股份、开山股份、水晶光电四只股票的收盘价移动线性回归曲线图,可以发现角度曲线的拐点预示开始反转为新一轮的走势。如下所示:

把移动线性回归拟合曲线增加到显示界面中,箭头所指示的位置作为买卖点目前来看是有一定的盈利特征的,不过此处只是为了扩展大家的思路达到教学目的而设定的策略,大家可以在这个基础上展开更多股票和周期的回测以验证策略的可靠性。如下所示:

关于完整代码可以加入小册交流群获取。更多的量化交易内容欢迎大家订阅小册阅读!!