- 金融科技
- 示例工程
【免费下载链接】ai_quant_trade
Stock AI Trader: 1-stop platform for learning, sim & live trading. Covers: stock basics, strategies, LLMs, factor mining, ML/DL/RL, graph nets, HFT, C++ deploy & JoinQuant code. 股票AI操盘手:一站式学习、模拟、实盘平台。涵盖:股票基础、策略、大模型、因子挖掘、机器学习/深度学习/强化学习、图网络、高频交易、C++部署及聚宽代码。
传统策略虽然看似“昨日黄花”,但其规则清晰、可解释性强、可操作性高,依然是量化交易体系中最易上手、最适合作风控兜底的一环。本指南以仓库a_全网优秀资源/05_交易策略/01_传统策略/01_传统策略.md为核心,结合egs_trade/vanilla下的本地回测实现,系统讲解双均线策略的完整回测链路(数据、择时、账户、费用、风险指标)、A股强势股动量轮动的实战配置,以及 Sequoia、pythondict-quant、掘金策略集锦等经典开源策略的资源清单,帮助读者在本地构建一套可调试、可定制、可验证的传统策略研究环境。
一、为什么本地传统策略平台仍然不可替代
深度学习与机器学习策略往往需要配合规则使用,传统策略则天然具备"规则可解释、逻辑可审计"的优势,适合作为量化研究的基石。虽然聚宽、BigQuant 等在线平台提供了现成的数据获取与回测评估能力,但本地平台在以下方面仍然不可或缺(参见 egs_trade/vanilla/double_ma/文档教程/README.md):
- 方便调试与代码管理:本地可直接断点调试、版本管理,策略逻辑不再是黑盒;
- 本地资源充足:在线平台资源有限,跑机器学习类模型非常吃力;
- 方便定制化:数据源、交易规则、费用模型均可自行改造;
- 隐私管理较好:方便进行实盘落地。
本仓库在 egs_trade/vanilla 目录下提供了两条完整的传统策略实战链路:double_ma(双均线本地回测框架)与momentum_rotation(A股全市场强势股轮动回测)。
二、双均线策略:原理与本地回测框架
2.1 金叉死叉:双均线策略的核心逻辑
双均线策略是一种趋势跟踪类策略,作为基础入门策略,其原理就是通过捕捉金叉死叉信号来判断买点和卖点。均线的本质是用特定时间段收盘价的平均值作为当天的均价,在信号处理中相当于一种滤波手段,能避免信号出现较大波动、过滤较大的跳变。趋势类策略一般适用于市场环境较好的时候。
信号规则为:
- 金叉:短周期均线向上穿过长周期均线(短均线 ≥ 长均线),意味着上涨趋势出现,触发买入;
- 死叉:短周期均线下穿长周期均线(短均线 < 长均线),意味着下跌趋势出现,触发卖出。
仓库源码 egs_trade/vanilla/double_ma/src/rules/timing_ctrl/moving_average.py 将这一择时规则封装为double_ma_timing(ma_short, ma_long, hold)函数:当ma_short >= ma_long且当前未持仓(not hold)时返回'buy';当ma_short < ma_long且已持仓(hold)时返回'sell';其余情况返回空串不交易。这里通过hold状态参数避免重复开仓/平仓,保证"金叉买入、死叉卖出"只在状态切换时执行。
用 pandas 计算双均线非常简洁(见 back_tester.py):
df['ma_short'] = df['close'].rolling(window=self.test_conditions['ma_short']).mean() df['ma_long'] = df['close'].rolling(window=self.test_conditions['ma_long']).mean()ma_short与ma_long的取值在配置文件中定义,默认短均线 10 日、长均线 20 日。均线计算后,窗口起始部分的均值为空值(NaN),源码会将其dropna()剔除,因此配置回测起始日期时需要注意向前预留均线长度所需的历史数据。
2.2 搭建回测环境与依赖安装
运行双均线回测前,需要安装仓库 requirements.txt 中列出的依赖,核心包括:
tushare>=1.2.85 # A股数据接口 pandas>=1.2.4 # 数据处理与均线计算 numpy>=1.22.0 matplotlib>=3.3.4 # 交易图绘制 ffn>=0.3.6 # 风险指标计算 mplfinance>=0.12.9b1 chinese_calendar>=1.7.2 # 交易日历 typeguard>=2.13.0其中 Tushare 数据接口需要注册获取 token(https://tushare.pro/),在个人主页获取。注意:Tushare Pro 大量调用或获取详细信息需要积分/付费,未付费时大盘指数数据无法获取,此时风险指标将跳过 alpha 和 beta 的计算。
2.3 回测配置:conf/double_ma.yaml 全参数解析
回测条件全部通过 YAML 配置文件 conf/double_ma.yaml 声明,包含三大块:
数据条件(data_condition):
| 参数 | 默认值/示例 | 说明 |
|---|---|---|
data_source | tushare | 数据引擎,源码中预留了更多选项(todo) |
skip_download | True | 若数据已下载到本地则跳过重新下载 |
benchmark | 'None' | 基准指数,000001.XSHG上证综指、000300.XSHG沪深300;Tushare 未付费时不可用 |
stock_lst | ['000001.SZ', '600000.SH'] | 待选股票池(当前为人工选股) |
start_time/end_time | 2018-01-01/2019-12-30 | 回测区间 |
time_freq | daily | 数据频率,预留更多选项 |
测试条件(test_condition):
| 参数 | 默认值 | 说明 |
|---|---|---|
base_rate | 0.04 | 无风险利率(可理解为银行存款利率) |
capital | 100000 | 初始可用资金 |
ma_short | 10 | 短均线周期 |
ma_long | 20 | 长均线周期 |
交易费用(order_cost):
| 参数 | 默认值 | 说明 |
|---|---|---|
close_tax | 0.001 | 卖出印花税 |
open_commission | 0.0003 | 买入佣金 |
close_commission | 0.0003 | 卖出佣金 |
min_commission | 5 | 单笔最低佣金 |
slippage_fee | 0.0 | 滑点费率(如0.00246) |
slippage_type | general | 滑点方向:random 随机正负,general 买正卖负 |
trade_lim | 100 | 一手 100 股,买入数量为 100 的整数倍 |
2.4 运行回测与输出物
配置好 token 与 YAML 后,直接运行(也可参考 run.sh):
python back_tester.py --debug_off \ --config conf/double_ma.yaml--debug_off表示关闭调试模式,从命令行读取--config指定的配置文件(调试模式下会自动使用conf/double_ma.yaml并创建data、exp目录,见 back_tester.py)。此外还支持--data_dir(数据存储目录)、--exp_dir(结果导出目录)以及--override_config(追加覆盖 YAML 配置项,可多次使用)。
回测主流程由 back_tester.py 的offline_back_test_ctrl驱动:从索引 1 开始逐日遍历(避免用到当日数据偷看未来),在每个交易日先按"上一交易日"的均线值生成买卖信号列表,先处理卖出列表再处理买入列表(避免现金不足),按等权分配买入资金,最后刷新账户总资产并绘图。
输出物包括:
- 数据文件:Tushare 获取的数据以"日期+股票代码"为文件名存储为 CSV;
- 风险指标 CSV:
exp目录下的risk_indicator.csv; - 交易明细 CSV:
trading_info.csv; - 交易图:每个股票的资金曲线图与 K 线买卖点标注图(SVG 格式)。
仓库当前样例回测结果(2018-01-01 至 2019-12-30,双均线 10/20 日)见 egs_trade/vanilla/double_ma/README.md:
| 风险指标 | 数值 |
|---|---|
| total_returns | 0.097863 |
| annal_returns | 0.051365 |
| sharp_ratio | 0.026636 |
| max_withdraw | -0.152564 |
| sortino_ratio | 0.088889 |
| win_rate | 0.051365 |
| profit_loss_ratio | 0.776881 |
| max_con_losses | 9813.072 |
2.5 账户模型与交易控制
回测使用 src/back_test/account_info.py 中的Account类维护账户状态,核心字段包括:
- 动态变化信息:
cash(可用现金)、total_capital(总资产)、pos_dict(持仓字典,记录持仓股数与当前价); - 交易历史日志:
trade_dict(每只股票的交易明细 DataFrame)、daily_trading_lst(每日交易记录)、pd_gather_trades(聚合交易记录)、funds_chg_lst(每日总资金变化序列)。
get_total_capital()将持仓市值(pos_num * price累加)与现金相加得到总资产,该序列是后续计算收益、回撤等风险指标的基础。买卖下单、费用扣除与股票数量取整(100 股整数倍)由 src/back_test/trading_ctrl.py 的order_value完成,资金分配则由 src/portfolio/capital_allocation.py 的equal_allocation按股票池数量等权分配。
三、回测风险指标:从收益到风险全景评估
回测结束后,src/back_test/risk_indicator.py 的cal_risk_indicator基于ffn库计算并输出以下指标,理解每个指标的公式有助于正确解读回测结果:
- 策略收益(total_returns):账户资金在一段时间内的变化,
(Pend - Pstart) / Pstart * 100%; - 年化收益(annal_returns):若测试周期小于一年则为折算值,公式
((1+P)^(250/n) - 1) * 100%,其中 n 为交易日数、一年按 250 个交易日计(源码中one_year=250); - Beta:衡量策略收益与基准收益的关系,
Beta = Cov(Dp, Dm) / Var(Dm),市场状态良好时越大越好。源码中仅当df_index(基准数据)非空时才计算,未付费 Tushare 时跳过; - Alpha:非系统性风险,代表与市场波动无关的收益,
Alpha = Rp - [Rf + Beta * (Rm - Rf)]; - Sharpe 率(sharp_ratio):每承担一个风险所获得的无风险收益,
(Rp - Rf) / Sigma(p),越大越好; - 最大回撤(max_withdraw):策略最大损失,
max_draw_down = (Px-Py)/Px,Px、Py 为一段时间内资产最高与最低值; - Sortino 率(sortino_ratio):评估策略亏损风险,
(Rp - Rf) / Sigma(d),用下行波动率代替总波动率,越高越好; - 胜率(win_rate):获胜概率,源码采用"当前资金大于上一笔资金且大于初始资金"双重判定(实现细节见源码注释,代码标注了 todo/fixme 说明其统计口径有待确认);
- 盈亏比(profit_loss_ratio):盈利与亏损之比,源码采用最大盈利 / 最大亏损的口径;
- 最大连续亏损(max_con_losses):一段交易时间内连续亏损的最大值。
其中无风险利率 Rf 取配置文件中的base_rate(默认 0.04,即 4% 银行存款利率近似)。
回测与实盘的差异提醒
回测只能尽可能接近实际,但与真实交易仍存在差异(见 文档教程):
- 概率性买入失败:真实交易可能因涨跌停导致无法买入/卖出,回测难以精确模拟;
- 滑点:价格快速波动导致下单与成交价存在差异,回测往往用固定比率模拟(对应
slippage_fee); - 成交价格:回测常以收盘价或平均价作为成交价,与实际有出入。
四、A股强势股动量轮动:传统策略的进阶实战
仓库在 egs_trade/vanilla/momentum_rotation 提供了更接近实盘场景的传统策略样例——A股全市场强势股轮动回测。项目 README 明确声明:这是研究回测示例,不是投资建议,不承诺任何年化收益;策略只做多、不融资、不做空、不接模拟盘或实盘。
4.1 策略思路
- 每月第一个可交易日换仓;
- 使用上一交易日的可见数据打分,下一交易日按开盘价模拟成交;
- 动量分数默认使用 20/60/120 日收益,叠加波动惩罚、成交额过滤、均线趋势过滤;
- 参数搜索默认覆盖
top_n=[5,10,20]、移动止损阈值(0.10/0.15/0.20)和大盘过滤开关; - 总仓位不超过 100%,移动止损卖出后资金留作现金,直到下次换仓。
4.2 配置与运行
核心配置见 conf/momentum_rotation.yaml,关键参数包括:
- 数据:
data.source(tushare/csv)、start_date/end_date、benchmark: 000300.SH; - 样本切分:
split分为 train(2016-01-01 至 2022-12-31)与 test(2023-01-01 至 2026-06-17)两段,用于参数搜索的样本外验证; - 策略参数:
initial_cash、动量回看窗口lookback_windows: [20, 60, 120]与权重momentum_weights: [0.5, 0.3, 0.2]、趋势窗口trend_windows: [20, 60]、波动惩罚volatility_penalty: 0.5、最小成交额min_avg_amount: 50000000、大盘均线窗口market_ma_window: 60、最小上市天数min_list_days: 180、剔除 STexclude_st: true、整手lot_size: 100; - 参数网格:
parameter_grid下的top_n、trailing_stop、market_filter_enabled; - 交易费用:与双均线类似的
order_cost结构,另含slippage_bps: 5(滑点基点)。
运行方式(Tushare Pro 模式读取环境变量TUSHARE_TOKEN):
set TUSHARE_TOKEN=your-token python run_backtest.py --config conf/momentum_rotation.yaml --exp_dir exp/momentum_rotation如需避开stock_basic的低频率限制,可在配置的data下添加stock_list: [000001.SZ, 600000.SH]直接验证指定股票的真实行情链路。离线验证可将data.source改为csv,并提供daily.csv、stock_basic.csv、benchmark.csv三个文件,其中daily.csv至少包含ts_code,trade_date,open,high,low,close,vol,amount字段(仓库unit_test/fixtures/momentum_rotation/提供了离线验证的样例数据)。
4.3 输出物与风险提示
exp_dir下生成:leaderboard.csv(按样本外test_cagr降序排列的参数榜单)、equity_curve.csv(样本外榜首参数的资金曲线)、trades.csv(交易明细)、metrics.csv(总体指标)、equity_curve.png(资金曲线图)。
风险提示:强势股轮动偏收益优先,容易在趋势反转或流动性恶化时出现较大回撤;回测结果受数据质量、复权方式、停牌/涨跌停处理、交易成本和样本切分影响,实盘前必须单独验证数据、交易规则、滑点、容量和风控。
五、经典传统策略开源资源清单
关联文档还汇总了三个具有代表性的传统策略开源项目,可作为策略设计参考:
5.1 Sequoia(海龟交易法则与缠论买点)
Sequoia 是一个集成度较高的传统策略仓库(Github 约 2.4k stars),核心特色:
- 使用akshare数据接口获取行情;
- 使用TA-Lib计算技术因子(仓库 a_全网优秀资源/04_因子/ta_lib 提供了 TA-Lib 的安装与文档资料,egs_alpha/alpha_libs/ta_lib 提供了独立依赖说明);
- 实现了海龟交易法则与缠中说禅牛市买点两类经典规则;
- 支持微信推送交易信号。
5.2 pythondict-quant(量化实战教程源码集)
pythondict-quant(Github 约 849 stars)记录了系列量化投资教程的源代码,教程序列覆盖了从入门到进阶的完整路径,且大多基于 Backtrader 框架实现:
- Backtrader 教程 — 量化投资实战教程(1)(2020/04/12);
- Python 量化投资实战教程(2) — MACD策略(2020/04/20);
- Python 量化投资实战教程(3) — A股回测MACD策略(2020/04/26);
- Python 量化投资实战教程(4) — KDJ 策略(2020/05/06);
- Python 量化投资实战教程(5) — A股回测KDJ策略(2020/05/16);
- Python 量化投资实战教程(6) — 交易平均收益(2020/05/26);
- Python 量化投资实战教程(7) — 孕线真的有用吗?(2020/08/20);
- Python 量化投资实战教程(8) - A股回测"孕线"策略(2020/09/08);
- Python 量化投资实战教程(9) - 自定义MySQL数据流(2020/11/12);
- Python 量化投资实战教程(10) - 可转债薅羊毛策略(2021/03/07);
- Prometheus 实战教程 + Grafana + Python — 实时监控东方财富人气榜股票(2021/06/13);
- Lean — 优秀好用的开源量化交易平台(2021/10/21);
- 量化投资单因子回测神器 — Alphalens(2021/11/23,仓库 a_全网优秀资源/04_因子/01_alphalens.md 亦有专题资料);
- 微软开源!世界首个 AI 量化投资平台 Qlib 使用教程(2021/11/01,仓库 a_全网优秀资源/02_综合框架/01_Qlib.md 与 egs_trade/ms_qlib 提供了更完整的本地实践);
- 什么是强化学习?预测股票的效果如何?
5.3 掘金策略集锦(myquant/strategy)
掘金策略集锦(Github 约 945 stars)是一个持续维护的经典策略库,策略列表逐步增加,支持 fork 后通过 Pull Request 贡献自己实现的策略。覆盖的策略类型包括:
- 趋势/突破类:趋向系统指标 ADX/DMI、区间突破 dual-thrust(未实现)、动态突破 Dynamic Breakout、Hans 123、反转突破 r-breaker、简单海龟策略、双均线策略 dual-ma;
- 指标类:人气指标 ar_ma、布林指标 boll-stock、布林强盗 bollinger_bandit、RSI、KDJ、MACD;
- 组合/选股类:空中花园 skypark、动量选股 Momentum、简单 PE 因子 Factor、Alpha 相关示例、套利策略模板 arbitrage;
- 工程类:仓位管理示例 position management、Python 策略框架 Framework。
六、传统策略在量化体系中的定位
传统策略虽看似"昨日黄花",但其可操作性更强,仍有使用价值;深度学习与机器学习策略往往需要配合规则使用,传统策略恰好提供了这样的规则底座。仓库中与之配套的参考资料还包括:
- 规则选股方法论 ai_notes/02_理论/3_选股/01_规则选股.md:涵盖基本面/技术面选股、趋势跟踪选股(如均线多头排列、RPS 相对强弱选股)、小市值策略等;
- 规则择时方法论 ai_notes/02_理论/4_择时/01_规则择时.md;
- 回测及评估指标理论 ai_notes/02_理论/6_回测及评估指标/风险指标.md;
- 投资组合管理 7 节教学 egs_trade/vanilla/portfolio_optimization,从基金风险收益、数据整理、启发式组合、传统组合构建,到均值方差优化、夏普率优化与带约束的组合优化,是传统策略向组合管理延伸的进阶路径。
整体来看,以double_ma本地回测框架为基础,以momentum_rotation为进阶实战,再配合经典开源策略清单与规则选股方法论,读者即可在本地建立起一套"数据获取 → 择时信号 → 账户撮合 → 风险评估 → 组合优化"的完整传统策略研究闭环。
- 金融科技
- 示例工程
【免费下载链接】ai_quant_trade
Stock AI Trader: 1-stop platform for learning, sim & live trading. Covers: stock basics, strategies, LLMs, factor mining, ML/DL/RL, graph nets, HFT, C++ deploy & JoinQuant code. 股票AI操盘手:一站式学习、模拟、实盘平台。涵盖:股票基础、策略、大模型、因子挖掘、机器学习/深度学习/强化学习、图网络、高频交易、C++部署及聚宽代码。
相关推荐
Zipline 回测框架迁移指南:从聚宽/优矿策略到本地回测的完整路线(ai_quant_trade 视角)
Zipline 回测框架迁移指南:从聚宽/优矿策略到本地回测的完整路线(ai_quant_trade 视角) 本篇技术指南以 zipline 框架笔记 http
金融科技示例工程ai_quant_trade 项目 Backtrader 回测框架选型指南:官方资源、教程体系与 GPL 协议下的落地策略
ai_quant_trade 项目 Backtrader 回测框架选型指南:官方资源、教程体系与 GPL 协议下的落地策略 导读 本文是 ai_quant_tr
金融科技示例工程Dillinger 移动端架构决策树指南:框架、状态、存储与离线策略的系统化选型方法
Dillinger 移动端架构决策树指南:框架、状态、存储与离线策略的系统化选型方法 导读 本指南以仓库内 .agent/skills/mobile desig
前端开发工具
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考