关于trend_score和ROC的计算问题
-
trend_score
根据该描述是如果要计算20日 trend_score 是不是就是20天的斜率值*拟合度R2的计算结果
我使用from sklearn.linear_model import LinearRegression直接计算R2
ROC是根据公式进行计算的:
ROC = (当前收盘价 - N周期前收盘价) / N周期前收盘价 * 100
最后回测出来的结果和平台展示的收益信息有一些不同,我最多只能跑到40多倍的收益,平台上显示是接近60倍的收益
而且最后买入的持仓也和平台上的显示不一致,这块有哪位大神能帮忙解答下?
平台显示策略:
我自己回测最后买的是沪深300和平台上买入创业版ETF不太一致:
收益回测出来大概是49倍左右:
-
这个因子有计算解释么?
-
我感觉是python包计算差异, 算法差异
-
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_scoredef 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倍收益
-
我这里修改了一下,拟合直线的斜率改成了暴力两点 斜率
获取斜率(回归系数)
slope = model.coef_[0]
暴力首尾两点斜率
slope=(close_values[n-1]-close_values[0])/close_values[0]这样计算出来总收益为50.57812057000028