标签:slope 一元 obj strides shape 线性 window np
看通达信公式其中SLOPE用到的挺多,其中有一个买卖线的用到SLOPE(C,21),然后就网上搜索这个函数的意义。
简单的说就是一组点比较接近线性关系,则找到一条直线,使得各点到此直接的距离最短。
如下图所示:
公式这一块的推导看的不明白,不过结果还是比较容易理解的
我们只需要求出b来即可。
验证起来也比较容易,可借助excel
先把, 这些值都算出来,然后通过公式:=(8*D10-(B10*C10))/(E10*8-B10*B10)
即可算出系数b=2.06
同样a也可根据公式:=C10/8-B14*B10/8算出a=4151
然后将a, b代入直线方程中,得出各点的预测值.
意义弄明白了,通达信中的SLOPE明显不是计算一个值,而是一组值。因此需要借助于numpy的polyfit()函数,此函数是用来算拟合的,实际上算出来的就是我们这里的系数b
def _calc_slope(x):
return np.polyfit(range(len(x)), x, 1)[0]
此函数实现请求一组数的斜率,即我们这儿的系数b
通常我们获取的K线是一个比较大的数组,然后计算5根或是8根等K线的斜率,numpy没有像pandas中的rolling函数来作为移动窗口,来计算我们指定的K线的数值,因此需要做一个模拟:
def rolling_window(a, window):
'''
copy from http://stackoverflow.com/questions/6811183/rolling-window-for-1d-arrays-in-numpy
'''
shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
strides = a.strides + (a.strides[-1], )
return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
此函数模拟的是pandas的rolling移动窗口的功能,实际上此返回的是一个二维数组,其中每个子项为指定大小的数组。
这样我们就可以计算一组数的slope了
def slope(series, n):
"""
求斜率
"""
a = rolling_window(series, n)
obj = np.array([_calc_slope(x) for x in a])
new_obj = np.pad(obj, (len(series) - len(obj), 0), 'constant', constant_values=(np.nan, np.nan))
return new_obj
new_obj这一行的代码是将缺失的数据补回nan,保持计算前后数据的总长度不变
标签:slope,一元,obj,strides,shape,线性,window,np 来源: https://blog.csdn.net/luhouxiang/article/details/113816062
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。