from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
def calculate_R2_with_slope(close_values,K):
n = len(close_values)
if n < K:
return np.nan
# 获取最新的close_values数据
close_values = close_values[-K:]
n = len(close_values)
# 取close_values窗口滑动向前的20天数据
x = np.arange(n).reshape(-1, 1)
model = LinearRegression()
model.fit(x, close_values)
# 获取斜率(回归系数)
slope = model.coef_[0]
#print(f"斜率(回归系数): {slope}")
X_test = np.array(x)
y_test= np.array(close_values)
# 获取拟合度(R-squared值)
y_pred = model.predict(X_test)
r2 = r2_score(y_test, y_pred)
return r2*slope
@calc_by_symbol
def trend_score(se: pd.Series,d):
# 这里使用滑动窗口获取 斜率*拟合度
return se.rolling(window=d).apply(lambda x: calculate_R2_with_slope(x.values, d))
我这里的计算方式是这样的,也回测不出来公开策略的60%多倍收益,只测试出来37倍收益