15年30倍,年化25.87%,backtrader原生etf轮动策略,附完整python代码
个人最喜欢的一个指标: 趋势评分——这个指标看起来比较高级,不是传统技术分析那种加加减减,求平均。而TrendScore是趋势拟合,拟合出斜率,而且还使用了R方置信度来修正,是有统计学意义的。原创内容第1021篇,专注AGI+,AI量化投资、个人成长与财富自由。所以把一个指标做透,把几个策略做好,求精而不求多。对于AI量化社群,用户价值就是策略,如何开发或者订阅有效的策略。本周重点,原生backt
·
原创内容第1021篇,专注AGI+,AI量化投资、个人成长与财富自由。
一人企业的商业模式,用户价值是什么?
对于AI量化社群,用户价值就是策略,如何开发或者订阅有效的策略。
这是核心关键所在。所以把一个指标做透,把几个策略做好,求精而不求多。
本周重点,原生backtrader策略,带参数自动优化。
探讨多策略组合的可能性。
个人最喜欢的一个指标: 趋势评分——这个指标看起来比较高级,不是传统技术分析那种加加减减,求平均。比如MACD,就是两个均线平滑。
而TrendScore是趋势拟合,拟合出斜率,而且还使用了R方置信度来修正,是有统计学意义的。
import backtrader as btimport numpy as npclass TrendScore(bt.Indicator):"""趋势评分指标:年化收益率 × R平方"""lines = ('trend_score',)params = (('period', 25),)def __init__(self,*args, **kwargs):# 正确调用父类初始化super().__init__(*args, **kwargs)self.addminperiod(self.p.period)def next(self):if len(self.data) < self.p.period:self.lines.trend_score[0] = np.nanreturn# 获取窗口数据window_data = self.data.get(size=self.p.period)# 检查数据有效性if np.any(np.isnan(window_data)) or np.any(np.isinf(window_data)):self.lines.trend_score[0] = np.nanreturntry:# 对数转换y_raw = np.array(window_data)y = np.log(y_raw)x = np.arange(len(y))n = len(x)if n < 2:self.lines.trend_score[0] = 0.0return# 计算回归统计量sum_x = x.sum()sum_y = y.sum()sum_x2 = (x ** 2).sum()sum_xy = (x * y).sum()denominator = n * sum_x2 - sum_x ** 2# 处理零分母if abs(denominator) <= 1e-9:self.lines.trend_score[0] = 0.0return# 计算斜率和截距slope = (n * sum_xy - sum_x * sum_y) / denominatorintercept = (sum_y - slope * sum_x) / n# 计算R平方y_pred = slope * x + interceptss_res = np.sum((y - y_pred) ** 2)ss_tot = np.sum(y ** 2) - (sum_y ** 2) / nif abs(ss_tot) <= 1e-9:r_squared = 0.0else:r_squared = 1 - ss_res / ss_totr_squared = max(0.0, min(r_squared, 1.0)) # 限制在[0,1]范围# 计算年化收益率annualized_return = np.exp(slope * 250) - 1# 综合评分trend_score = annualized_return * r_squared# 处理异常值if np.isinf(trend_score) or np.isnan(trend_score):self.lines.trend_score[0] = 0.0else:self.lines.trend_score[0] = trend_scoreexcept (ValueError, ZeroDivisionError):self.lines.trend_score[0] = 0.0
在backtrader里使用的策略如下:
from backtrader_strategy import RotationStrategyTemplatefrom backtrader_inds import TrendScorefrom backtrader_engine import Enginefrom collections import defaultdictclass StrategyTrendScore(RotationStrategyTemplate):params = (('period', 25),)def __init__(self):super().__init__()self.inds = defaultdict(dict)for data in self.datas:self.inds['sorter'][data] = TrendScore(data.close,self.params.period)e = Engine()symbols = ['518880.SH', # 黄金ETF(大宗商品)'513100.SH', # 纳指100(海外资产)'159915.SZ', # 创业板100(成长股,科技股,中小盘)'510180.SH', # 上证180(价值股,蓝筹股,中大盘)]e.run_strategy(StrategyTrendScore,symbols)e.stats()e.plot()
运行一下:很漂亮的曲线:


代码在如下位置 :

每天“不管”一点点,每天就变强一天天。
代码和数据下载:AI量化实验室——2025量化投资的星辰大海
更多推荐


所有评论(0)