Py学习  »  Python

15年30倍,年化25.87%,backtrader原生etf轮动策略,附完整python代码

七年实现财富自由 • 2 月前 • 169 次点击  
原创内容第1021篇,专注AGI+,AI量化投资、个人成长与财富自由。
一人企业的商业模式,用户价值是什么?
对于AI量化社群,用户价值就是策略,如何开发或者订阅有效的策略
这是核心关键所在。所以把一个指标做透,把几个策略做好,求精而不求多。
本周重点,原生backtrader策略,带参数自动优化。
 探讨多策略组合的可能性。
个人最喜欢的一个指标: 趋势评分——这个指标看起来比较高级,不是传统技术分析那种加加减减,求平均。比如MACD,就是两个均线平滑。
而TrendScore是趋势拟合,拟合出斜率,而且还使用了R方置信度来修正,是有统计学意义的。
import backtrader as btimport numpy as np

class 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.nan            return
        # 获取窗口数据        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.nan            return
        try:            # 对数转换            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.0                return
            # 计算回归统计量            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.0                return
            # 计算斜率和截距            slope = (n * sum_xy - sum_x * sum_y) / denominator            intercept = (sum_y - slope * sum_x) / n
            # 计算R平方            y_pred = slope * x + intercept            ss_res = np.sum((y - y_pred) ** 2)            ss_tot = np.sum(y ** 2) - (sum_y ** 2) / n
            if abs(ss_tot) <= 1e-9:                r_squared = 0.0            else:                r_squared = 1 - ss_res / ss_tot                r_squared = max(0.0min(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.0            else:                self.lines.trend_score[0] = trend_score
        except (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 defaultdict
class 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量化投资的星辰大海

AI量化实验室 星球,已经运行三年多,1900+会员。

aitrader代码,因子表达式引擎、遗传算法(Deap)因子挖掘引等,支持vnpy,qlib,backtrader和bt引擎,内置多个年化30%+的策略,每周五迭代一次,代码和数据在星球全部开源。


点击 “查看原文”,直接访问策略集合

扩展  •  历史文章   


年化390%,回撤7%,夏普6.32 | A股量化策略配置

年化30.24%,最大回撤19%,综合动量多因子评分策略再升级(python代码+数据)

年化429%,夏普5.51 | 全A股市场回测引擎构建

年化443%,回撤才7%,夏普5.53,3积分可查看策略参数

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/187684