一元线性回归slope

看通达信公式其中SLOPE用到的挺多,其中有一个买卖线的用到SLOPE(C,21),然后就网上搜索这个函数的意义。

简单的说就是一组点比较接近线性关系,则找到一条直线,使得各点到此直接的距离最短。

如下图所示:

一元线性回归slope

公式这一块的推导看的不明白,不过结果还是比较容易理解的

一元线性回归slope

我们只需要求出b来即可。

验证起来也比较容易,可借助excel

一元线性回归slope

先把一元线性回归slope, 一元线性回归slope一元线性回归slope这些值都算出来,然后通过公式:=(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,保持计算前后数据的总长度不变

 

上一篇:简单 slope-trick


下一篇:Xcode - Apple Mach-O Linker warning