看通达信公式其中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://*.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,保持计算前后数据的总长度不变