【Quant102】如何计算 N 日斜率
一元线性回归的斜率公式是:
由于斜率具有平移不变性,x
通常取 0 到窗口大小减一。
def slope(df, close_col='close', slope_col='slope', window=5, inplace=True):
if not inplace: df = df.copy()
x = np.arange(window, dtype='f')
x -= x.mean()
x_sq_sum = (x ** 2).sum()
df[slope_col] = df[close_col].rolling(window) \
.apply(lambda y: ((y - y.mean()) * x).sum() / x_sq_sum)
return df
向量化版本使用sliding_window_view
代替rolling.apply
。
sliding_window_view
创建给定数组的一个滑动窗口视图。其中每个元素被替换为该元素在给定轴上的给定大小的滑动窗口。如果原数组的形状为[d0, ..., d(n-1)]
,新数组的形状为[d0, ..., di - window + 1, ..., d(n-1), window]
,其中i
为滑动窗口所在的轴,window
为窗口大小。新数组的元素[idx0, ..., idx(i), ..., idx(n-1), j]
映射到原数组的[idx0, ..., idx(i)+j, ..., idx(n-1)]
。
from numpy.lib.stride_tricks import sliding_window_view
def slope(df, close_col='close', slope_col='slope', window=5, inplace=True):
if not inplace: df = df.copy()
x = np.arange(window, dtype='f')
x -= x.mean()
x /= (x ** 2).sum()
y = sliding_window_view(df[close_col], window, -1)
slope = ((y - y.mean(-1, keepdims=True)) * x).sum(-1)
df[slope_col] = np.concatenate([np.full(window - 1, np.nan), slope])
return df
测试:
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
df = pd.DataFrame({'close': np.random.randint(-1000, 1000, [100])})
slope(df)
df.slope = df.slope.shift(-2)
df.plot()
plt.show()
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库