1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > python计算股票趋势_量化交易之股票选股因子——走势线性回归

python计算股票趋势_量化交易之股票选股因子——走势线性回归

时间:2018-12-28 03:48:28

相关推荐

python计算股票趋势_量化交易之股票选股因子——走势线性回归

Apple iPhone 11 (A2223) 128GB 黑色 移动联通电信4G手机 双卡双待

4999元包邮

去购买 >

前言

“回归”一词是由英国著名统计学家Francils Galton提出来的。1889年,他在研究祖先与后代身高之间的关系时发现,身材较高的父母,他们的孩子也较高,但这些孩子的平均身高并没有他们父母的平均身高高;身材较矮的父母,他们的孩子也较矮,但这些孩子的平均身高却比他们父母的平均身高高。Galton把这种后代的身高向中间值靠近的趋势称为“回归现象”。后来,人们把由一组变量的变化去推测另一组变量的变化方法称为“回归方法”。

将“回归现象”应用于统计套利时的理论依据为:价格将围绕价值上下波动,即股价上涨/下跌只是暂时的,价格会回复到一个相对正常的水平。本文根据股价走势绘制出拟合曲线,并将拟合角度作为选股参数应用于自选股删选中。

回归直线和最小二乘法

以研究人体的脂肪含量与年龄之间的关系为例,我们得到一组样本数据,从散点图上可以看出年龄越大,体内脂肪含量越高,呈现一种正相关的关系,并且点的分布整体上大致在一条直线附近,这条直线即为回归直线。计算得到这条回归直线的方程,即可以清楚地了解年龄与体内脂肪含量的相关性。

假设这条回归直线方程为y=bx+a,将样本的数据点(xi,yi)与直线上横坐标xi的点之间的距离来刻画点(xi,yi)到直线的远近,即|yi-(bxi+a)|(i=1,2,3,...,n)。由于绝对值计算不方便,实际应用中使用公式:Q=(y1-bx1-a)2+(y2-bx2-a)2+(y3-bx3+a)2...(yn-bxn+a)2。通过最小二乘法(method of least square)计算直线斜率b和截距a值使得Q最小,即样本数据的点到回归直线的距离的平方和最小。这样就得到了回归直线方程式。

线性回归实现

导入Statsmodels库。Statsmodels是Python中一个强大的统计分析包,包含了回归分析、时间序列分析、假设检验等等的功能。通过statsmodels.api.OLS()函数实现多项式拟合计算,OLS(ordinary least squares)即为普通最小二乘法的缩写,具体使用例程可参考官网文档/st...。

此处回归模型是最基本的一元模型:Y=β0X0+β1X1,x(array)为回归变量(自变量),y_arr(array)响应变量(因变量),statsmodels.OLS未假设回归模型有常数项,通过sm.add_constant()在x(array)左侧加上一列常量1。statsmodels.regression.linear_model.OLS输出结果是一个类,并没有进行任何运算,需要在 OLS 的模型之上调用拟合函数fit()执行得到β0、β1,即回归直线的截距和斜率。

import statsmodels.api as sm

def calc_regress_deg(self, y_arr):

x= np.arange(0, len(y_arr))

x = sm.add_constant(x)#添加常数列

model = regression.linear_model.OLS(y_arr, x).fit()

rad = model.params[1]#y = kx + b :params[1] = k

deg = np.rad2deg(rad)#弧度转换为角度

intercept = model.params[0]#y = kx + b :params[0] = b

reg_y_fit = x * rad + intercept

return deg, x, reg_y_fit, y_arr

计算走势角度

遍历自选股中的股票分别计算出每个股的收盘价格拟合角度。y_arr为收盘价曲线,reg_y_fit为相同x变量下的拟合曲线,ang为计算得到的拟合角度值。

pick_stocks = {u"浙大网新": "600797.SS",u"高鸿股份": "000851.SZ",u"开山股份": "300257.SZ",u"水晶光电": "002273.SZ"}

def fit_pick(self, symbols,show=True):

for index, stockName in enumerate(symbols.keys()) :

kl_pd = web.DataReader(symbols[stockName], "yahoo", datetime.datetime(,1,1), datetime.date.today())

kl_pd.fillna(method='bfill',inplace=True)#后一个数据填充NAN

ang, x, reg_y_fit, y_arr = self.calc_regress_deg(kl_pd.Close)#计算走势角度

显示效果

分别选用的时间区间为-1-1至今,-6-1至今和-9-1至今,以-9-1至今的回归直线为例分析,股价以回归直线为中心表现为震荡走势,其中水晶光电的下跌角度值更大。由于线性回归作用于股票的整个时间段,因此选择合适的时间段非常重要,选择的标准即为策略因子及整个交易系统的风格。

原文链接:/a/1190000014389316

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。