把 TA-Lib 指标装进 Qbot:自定义因子扩展与回测验收的完整流程
【免费下载链接】Qbot[🔥updating ...] AI 自动量化交易机器人(完全本地部署) AI-powered Quantitative Investment Research Platform. 📃 online docs: https://ufund-me.github.io/Qbot ✨ :news: qbot-mini: https://github.com/Charmve/iQuant项目地址: https://gitcode.com/GitHub_Trending/qbot/Qbot
在 Qbot 量化平台中,用自己的 TA-Lib 指标做自定义因子扩展并不复杂:从因子基类的扩展点入手,实现get_score与get_signal两个方法,接上信号引擎,再按验收标准跑回测,就能把私有指标变成可交易的策略。
内置指标够用吗:先看懂扩展点在哪一层
Qbot 已经内置了 MACD、RSI、KDJ、布林带等常用指标,日常策略足够用。但当你想加一个"带自己规则的 RSI"或"自定义周期组合的 MACD"时,硬改平台代码并不现实。
正确的做法是走继承。因子基类位于 pytrader/strategies/base.py,Strategy类的onbar方法在每根 K 线收盘时被调用一次:它把当前 K 线数据和账户状态打包进 context,交给你的策略逻辑,拿到目标权重后就地调仓。也就是说,指标只是输入,基类真正关心的是"这轮 K 线之后,每个标的该持有多少权重"。
对写指标的人来说,扩展点收敛为两个方法:
get_score(df):接收 K 线 DataFrame,返回因子数值,例如MACD(df.close, fastperiod=12, slowperiod=26, signalperiod=9)中的 12/26/9 就是快线、慢线与信号线的默认周期;get_signal(df):把因子数值翻译成 1(买入)、0(观望)、-1(卖出)三态信号。
pytrader/backtest_strategies/MACD.py 是最短范例:get_score调一次 MACD,get_singal比较快慢线差值正负给出方向,整个策略不到 30 行。写新指标前,先把这个文件读懂。
任务二:用 TA-Lib 写出自己的指标
以 RSI(相对强弱指标,衡量一段时间内涨多还是跌多)为例。TA-Lib 一行就能算出 14 期 RSI,信号层只需要一条超买超卖规则:
def get_score(self, df: DataFrame): return ta.RSI(df.close, timeperiod=14) def get_signal(self, df: DataFrame): rsi = self.get_score(df) return np.where(rsi < 30, 1, np.where(rsi > 70, 0, -1))RSI 低于 30 视为超卖、给买入信号;高于 70 视为超买、给卖出信号;中间地带观望。这就是"超买超卖"策略的全部规则,改成别的形式(例如 RSI 与价格的顶底背离,参考 pytrader/strategies/rsi_departure_strategy.py)都是同一套结构。
依赖方面不需要从零编译:dev/目录下预编译了覆盖 cp38/cp39、Linux/Windows 多平台的 TA-Lib wheel 包(如dev/TA_Lib-0.4.28-cp38-cp38-linux_x86_64.whl),直接pip install本地 whl 即可,省去找 C 库的折腾。
任务三:接进信号引擎,指标才变成持仓
算出信号还不等于交易。信号引擎在 pytrader/strategies/signal_strategy.py 的SelectBySignal类里,它干三件事:
- 从当根 K 线数据表中筛出
to_buy列命中的标的为买入池、to_sell列命中的为卖出池; - 对保留的标的等权分配仓位,即
context["weights"] = {code: 1/n for code in to_selected}; - 若没有任何标的留下,权重置空,引擎随即清仓观望。
所以你的自定义指标必须把 1/0/-1 信号落到数据表的to_buy、to_sell两列上,引擎才能识别。参数调优建议放在 docs/notebook/01-strategy.ipynb 的交互环境里做:改一个周期参数(如 RSI 的 14→21)就能重跑一遍,观察信号密度如何变化,比直接在策略文件里改快得多。
任务四:回测达到什么标准才算通过
回测入口在qbot/engine/backtest/,其中macd_bt.py是现成的指标回测脚本,跑完后对照下面几条自查,任何一条不满足都先别急着上实盘:
- 信号密度合理:1/0/-1 三类信号都有出现,但买卖点不密到每天换仓,说明指标有区分度而非噪声;
- 参数不敏感:把关键参数(RSI 周期、超买超卖阈值、MACD 的 12/26/9)小幅挪动,收益曲线不应剧烈翻转,否则大概率过拟合;
- 样本外检查:留出一段时间不训练、只验证,样本外表现与样本内差距过大说明指标只"记住了"历史;
- 曲线形态正常:回撤、夏普比、分年度收益可解释,与基准的对比见 docs/statics/imgs/backtest_sample.png 这类输出。
主引擎级别的验收可参考 tests/test_backtest.py,它演示了加载策略、设置 1 分钟 K 线粒度并启动引擎的完整链路。
可选进阶:因子组合与模型增强,以及网格落地场景
单一指标跑通后,常见两个方向。
多因子加权:pytrader/strategies/multi_factor.py 展示了组合方式——g.factors = ["market_cap", "roe"]声明因子,g.weights = [[1], [-1]]标注方向(1 表示因子值越小越好,-1 表示越大越好),引擎按方向加权排序选前 N 只持仓。你的自定义 TA-Lib 指标完全可以作为新因子加进这个列表。
模型增强:docs/03-智能策略/model_zoo.md 收录了 LSTM、随机森林等预训练模型与基准结果,可作为"AI 打分"因子与技术指标因子并行融合。
另一个值得注意的落地场景是网格交易:docs/03-智能策略/网格交易.md 中,策略围绕价格中枢 p、网格宽度 w 与单次数量 v 自动加减仓,单一方向波动超过 4 个 w 后停止响应。如果你的自定义指标是波动率类(能判断当前处于震荡还是趋势段),用它来决定网格的开启与停用,就是"指标计算→信号生成→组合执行"链路的完整闭环。
附录:动手清单与关键路径
- 读懂 pytrader/strategies/base.py 的
onbar与algo_processor,确认每根 K 线的调用时机 - 仿写 pytrader/backtest_strategies/MACD.py,实现自己的
get_score/get_signal - 安装
dev/下对应平台的 TA-Lib whl,本地验证指标数值 - 把信号写入
to_buy/to_sell列,经SelectBySignal跑出权重 - 用 docs/notebook/01-strategy.ipynb 调参,按四条验收标准跑 tests/test_backtest.py 级别的回测
【免费下载链接】Qbot[🔥updating ...] AI 自动量化交易机器人(完全本地部署) AI-powered Quantitative Investment Research Platform. 📃 online docs: https://ufund-me.github.io/Qbot ✨ :news: qbot-mini: https://github.com/Charmve/iQuant项目地址: https://gitcode.com/GitHub_Trending/qbot/Qbot
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考