原创内容第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
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.0, min(r_squared, 1.0))
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
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', '513100.SH', '159915.SZ', '510180.SH', ]e.run_strategy(StrategyTrendScore,symbols)e.stats()e.plot()
代码和数据下载:AI量化实验室——2025量化投资的星辰大海AI量化实验室 星球,已经运行三年多,1900+会员。
aitrader代码,因子表达式引擎、遗传算法(Deap)因子挖掘引擎等,支持vnpy,qlib,backtrader和bt引擎,内置多个年化30%+的策略,每周五迭代一次,代码和数据在星球全部开源。
点击 “查看原文”,直接访问策略集合。