Awesome Systematic Trading 完全指南:一份以“实测复现”为核心的量化交易资源导航

原创2026-10-01 09:47:421,232 阅读
文章标签:文档教程金融科技

Awesome Systematic Trading 完全指南:一份以“实测复现”为核心的量化交易资源导航

本篇技术指南围绕 GitHub 精选项目 awesome-systematic-trading 的主文档 README.md 展开:它不只是一份链接清单,而是一套“论文 → 复现代码 → 实测业绩”三位一体的系统性交易资源体系,覆盖 111 个库与包、61 个精选策略复现、55 本书籍与 22 个视频,并配备 3 个自动化维护脚本。读完本文,你将理解该仓库的策略筛选逻辑(t 统计量、波动率过滤、活跃窗口计量)、QuantConnect 复现代码的典型实现模式,以及如何用脚本让清单持续保鲜。

项目是什么:一份以“可验证”为核心的量化资源清单

仓库的定位用一句话概括:collecting a list of resources papers, softwares, books, articles for finding, developing, and running systematic trading (quantitative trading) strategies,即面向系统性交易(量化交易)策略的发现、开发与运行,聚合论文、软件、书籍与文章。与常见的“awesome 列表”不同,它的差异化在于两个核心设计:

  • 策略必须有实测业绩:每个入选策略都来自已发表论文,且被实际编码并在自身完整历史数据上运行,附上实测的夏普比率;
  • 清单自带“体检”机制:通过 scripts/ 下的脚本自动检查失效链接、修正条目计数、从数据目录重新生成策略表格,避免清单“悄悄过期”。

主文档开篇给出了内容地图:111 个库和包、来自论文的策略(带实测夏普比率)、55 本书籍、22 个视频,以及博客与课程。仓库同时提供中文版与日文版两个翻译,且多语言版本与英文版共享同一套策略表格生成逻辑(详见下文脚本章节)。

复现记录:4,843 篇论文的实测成绩单

README 的开篇给出了整个项目最有信息量的部分——论文复现的统计记录。仓库已编码并运行了 4,843 篇论文(在其自身完整历史上)。在挑选一个策略落地之前,有四个数字值得仔细解读:

指标 数值 含义
复现夏普比率中位数 0.37 接近一半的策略在自身样本上与“零收益”无法区分
通过显著性检验的比例 48% 的复现 t 统计量 > 1.96 即已发表文献中有超过一半在其自身样本上统计上不显著
测试窗口中位数 34 年 策略大致需要 (1.96 / Sharpe)² 年才能证明自己;夏普 0.4 的策略约需 24 年
对标普 500 的贝塔中位数 +0.17 剔除指数敞口后,信息比率中位数降至 0.21,说明相当一部分“超额收益”来自指数暴露而非技巧
发表后衰减 无可测量的衰减 在 2,838 篇“发表前后均有记录”的论文中,控制市场时期后,未发现可测量的发表后收益衰减(误差在每年 0.2 个百分点以内)

这组数据传递的核心理念是:纸面上的夏普比率没有 t 统计量佐证就“几乎什么也没说”——这也是策略表格坚持同时展示 Sharpe 与 t 值的原因。方法细节与注意事项记录在论文复现项目的 wiki 上,仓库内不做重复展开。

策略目录:筛选逻辑与资产品类结构

README.md 的 # Strategies 一节是全文最具技术含量的部分。它并非手写维护,而是由 scripts/build_strategies_table.py 从复现目录自动重新生成,因此“数字会随目录变化而移动,永远不会静默过时”。

当前展示的是 1,687 个通过门槛的复现中最强的 61 个,每个资产品类最多 12 个。入选门槛在脚本中定义得清清楚楚:

  • t 统计量 > 1.96(table["t"] > 1.96);
  • 测试窗口 ≥ 10 年(MIN_YEARS = 10);
  • 年化波动率在 1%~100% 之间(MIN_VOLATILITY = 0.01、MAX_VOLATILITY = 1.00)——波动率为 0(净值纹丝不动)或过高(月月翻倍)的“退化序列”直接剔除;
  • 标题与资产品类归属必须非空。

夏普比率在每个策略自身的活跃窗口上计量(active_window() 会裁掉净值序列前段和后段因对齐补零而产生的平坦区),而非统一日历区间,且未扣除交易成本。

资产品类划分由 scripts/paper_meta.json 中每条记录的 markets 字段驱动(asset_bucket() 函数实现):单一市场归入对应类,多市场归入 Multi-asset。当前七大类的领头羊(源自 README 表格,括号内为 夏普/t 统计量/波动率/测试年数):

  • Equities 股票:A Study Of Differences In Returns Between Large And Small Companies In Europe(1.89 / 11.4 / 6.4% / 37 年)
  • Bonds 债券:Statistical and Economic Benefits of Whitening Residuals in Bond Yields(0.90 / 5.0 / 18.6% / 30 年)
  • Commodities 大宗商品:How to Improve Commodity Momentum Using Intra-Market Correlation(0.65 / 2.8 / 8.7% / 19 年)
  • Currencies 外汇:Good Carry, Bad Carry(1.74 / 10.6 / 4.6% / 37 年)
  • Cryptocurrencies 加密货币:How to Design a Simple Multi-Timeframe Trend Strategy on Bitcoin(3.39 / 16.2 / 46.3% / 23 年)
  • Derivatives 衍生品:Media Tone Goes Viral: Global Evidence from the Currency Market(1.06 / 6.5 / 1.3% / 38 年)
  • Multi-asset 多资产:Optimal Annuity Risk Management(1.62 / 9.9 / 5.4% / 38 年)

注意这些数字的计量口径:每类资产样本长短不一(加密货币类只有 16~35 年历史),夏普比率基于各自活跃窗口,直接横向比较需谨慎。README 同时指出,这些论文的更早一批 QuantConnect 实现被保存在 static/strategies 目录(共 61 个 .py 文件)。

从论文到代码:QuantConnect 复现示例剖析

static/strategies 下的实现统一遵循“论文注释 + QC 差异说明 + 策略代码”的结构,值得作为研究论文复现的模板。下面以两个代表性策略说明其实现模式。

横截面动量:momentum-factor-effect-in-stocks.py

源文件 momentum-factor-effect-in-stocks.py 复现的是经典的股票横截面动量(UMD)策略:

  • 投资域:NYSE、AMEX、NASDAQ 股票,QC 实现中简化为按成交额(DollarVolume)排序取前 500 只(self.coarse_count = 500);
  • 动量定义:过去 12 个月收益,跳过最近一个月(“to avoid microstructure and liquidity biases”,即规避微观结构与流动性偏差);
  • 组合构建:按动量表现分为 5 组(self.quantile = 5,即五分组),做多最高组、做空最低组,权重为等权 ±1/组内数量:
    sorted_by_perf = sorted(perf.items(), key = lambda x:x[1], reverse=True)
    quantile = int(len(sorted_by_perf) / self.quantile)
    long  = [x[0] for x in sorted_by_perf[:quantile]]
    short = [x[0] for x in sorted_by_perf[-quantile:]]
    for symbol in long:  self.weight[symbol] =  1 / len(long)
    for symbol in short: self.weight[symbol] = -1 / len(short)
    
  • 再平衡:每月月初(DateRules.MonthStart)触发选股,OnData 中先清仓不在目标权重中的标的,再按权重 SetHoldings;
  • 成本与杠杆:自定义 CustomFeeModel 设置单边费率 0.005%(fee = price * qty * 0.00005),并给标的设置 10 倍杠杆。

时序动量:time-series-momentum-effect.py

源文件 time-series-momentum-effect.py 复现 Moskowitz-Ooi-Pedersen 式的跨资产时序动量:

  • 投资域:24 个商品期货、12 组外汇对(9 种基础货币)、9 个发达市场股指期货、13 个发达市场国债期货,代码中以 QuantpediaFutures 连续合约的形式导入(如 CME_ES1(E-mini S&P 500)、CME_CL1(原油)、EUREX_FGBL1(Euro-Bund)等);
  • 信号:每月判断每类资产过去 12 个月超额收益的正负,为正做多、为负做空(long = [... if x[1][0] > 0],short = [... if x[1][0] < 0]);
  • 仓位与风控:原始论文用 GARCH 估计事前波动率,QC 实现改为简单历史波动率(脚本头部明确标注了这一实现差异);同时设置了波动率目标与杠杆上限:
    self.targeted_volatility = 0.10   # 组合年化波动率目标 10%
    self.vol_target_period   = 60    # 用过去 60 个交易日估计波动率
    self.leverage_cap        = 4     # 杠杆上限 4 倍
    
  • 数据卫生:通过 GetLastData() 与当前日期的间隔检查(< 5 天)剔除掉已经失联的合约数据,再计算收益与 3 个月波动率。

这两份文件是“论文 → 代码”的绝佳范本:源码头部即注明原始论文/策略页面、投资域定义、关键参数,并显式声明与原论文的偏差(如以历史波动率替代 GARCH、以市值/流动性筛选替代全市场),这种透明度正是复现研究可信度的基础。

自动化维护脚本:表格、链接与计数器的保鲜机制

README 能保持数字准确、链接不失效,靠的是 scripts/ 下的三套工具。它们既服务文档维护,也展示了“awesome 列表工程化”的思路。

build_strategies_table.py:策略表格生成器

scripts/build_strategies_table.py 是核心生成器,完整流程为:

  1. 读取环境变量 HF_ACCESS_TOKEN(必需),通过 Hugging Face Hub API 拉取 paperswithbacktest/Strategies-NAV 数据集中的全部 .parquet 文件;
  2. 对每条净值序列调用 active_window() 裁掉补零平坦段,再用 measure() 计算指标:
    years = len(returns) / 252.0
    sharpe = returns.mean() / returns.std() * np.sqrt(252)
    t = sharpe * np.sqrt(years)
    volatility = returns.std() * np.sqrt(252)
    
    注意 t 值 = 夏普 × √测试年数,这正是“夏普 0.4 需要约 24 年才能让 t 达到 1.96”这一经验法则的来源;
  3. 从 scripts/paper_meta.json 读取每篇论文的 title 与 markets 元数据(该文件目前收录了上千条论文记录),完成标题清洗(全大写标题转 Title Case)与资产品类归类;
  4. 应用筛选(t>1.96、年限≥10、波动率 1%~100%、title/bucket 非空),按资产类取 nlargest(TOP_N=12, "sharpe");
  5. 用正则替换将结果写回 README 中 <!-- STRATEGIES:START --> 与 <!-- STRATEGIES:END --> 标记之间的区域。

脚本还内置了 LOCALES 字典,为英文、日文、中文三个 README 提供不同的表头、资产类名与口径说明文案(如中文口径为“夏普比率 / t 统计量 / 波动率 / 测试年数”),实现“一次度量、三语同步”。

check_links.py:GitHub 链接体检

scripts/check_links.py 解决 awesome 列表的“衰败”问题:仓库被归档、账号消失后清单仍在推荐。它逐个请求 GitHub API(api.github.com/repos/{repo}),将结果分类为:

  • missing:HTTP 404/451,仓库已消失;
  • archived:仓库被官方归档;
  • dormant since YYYY-MM:超过 730 天(DORMANT_AFTER)未推送新提交;
  • ok:健康。

用法上,GITHUB_TOKEN=... python scripts/check_links.py 仅输出报告;追加 --annotate 会在 README 对应条目标注 no longer available、archived 或 dormant since ... 标签(你可以在 README.md 的库表中看到大量这类标注)。脚本在存在“缺失或已归档”仓库时以退出码 1 结束,便于接入 CI 自动开 issue。

update_counts.py:计数器校准器

scripts/update_counts.py 解决另一个维护痛点:README 顶部“111 libraries / 55 books / 22 videos”这类计数一度靠人工维护,容易与表格实际行数脱节。脚本按文件、按小节边界(如 # Libraries and packages 到 # Strategies)统计 | [ 开头的表格行数,再回写所有相关计数字符串。--check 模式只校验不修改,发现陈旧计数时退出码为 1。由于三个语言版本的条目数可能不同步,脚本还会打印跨语言差异,供翻译补齐参考。

库与包清单:111 个工具的完整分类图谱

README.md 的 # Libraries and packages 一节按“功能 + 语言 + 人气(star 数降序)”组织 111 个库,构成一套可直接套用的工具选型地图:

大类 子类 代表性条目(名称,语言)
回测与实盘 事件驱动框架 vnpy、zipline、backtrader、QuantConnect Lean、Rqalpha、backtesting.py、nautilus_trader、HFTBacktest、PandoraTrader(C++)、gobacktest(Go)、FlashFunk(Rust)
向量化框架 vectorbt(NumPy/pandas + Numba 加速)、bt、pysystemtrade、QTradeX、ml-quant-trading
加密货币 Freqtrade、Jesse、OctoBot、Hummingbot、Kelp(Go)
交易机器人 — Blackbird(比特币套利)、ThetaGang(IBKR)、czsc(缠论分析)、R2 套利机器人(TS)、PyTrendFollow 等
分析 指标 ta-lib、pandas-ta、finta(Pandas 实现)、ta-rust、wickra
指标计算 quantstats、ffn
优化 skfolio、PyPortfolioOpt、Riskfolio-Lib、empyrial、Deepdow
定价 tf-quant-finance(Google)、FinancePy、PyQL(QuantLib 封装)
风险 pyfolio
券商 API — ccxt(100+ 交易所)、Ib_insync、PENDAX
数据源 通用 OpenBB Terminal、TuShare(A 股)、yfinance、AkShare、pandas-datareader、Fincept Terminal
加密货币 Cryptofeed(WebSocket 行情)、Crypto Lake(高频订单簿)
数据科学 — TensorFlow、PyTorch、Keras、scikit-learn、pandas、numpy、scipy、PyMC、cvxpy
数据库 — Marketstore(时序 DataFrame 服务器)、tectonicdb(订单簿 tick 库)、ArcticDB(Man Group)
图计算 — Ray、Dask、JaneStreet Incremental(OCaml)、Man MDF、Tributary
机器学习 — QLib(微软)、FinRL(深度强化学习)、MlFinLab、TradingGym
时间序列 — Facebook Prophet、statsmodels、tsfresh、pmdarima
可视化 — D-Tale(Man Group)、mplfinance、btplotting

这条清单对选型很有指导意义:事件驱动框架(如 vnpy、zipline)适合逻辑复杂、需要精细事件处理的策略;向量化框架(vectorbt)适合大规模参数扫描;而诸如 zipline dormant since 2024-02、backtrader dormant since 2024-08、Kelp archived 这类标注,提醒读者在选型时避开已停止维护的项目——这正是 check_links.py 自动标注的成果。

学习资源:书籍、视频、博客与课程

围绕“从入门到实战”的路径,README 还整理了 55 本书、22 个视频、若干博客与课程:

  • 书籍按定位分为:Beginner 入门(如《The Little Book of Common Sense Investing》《Algorithmic Trading and DMA》)、Coding 编码(《Python for Finance》《Python for Algorithmic Trading》《Trading Evolved》)、Machine Learning(《Advances in Financial Machine Learning》《Machine Learning for Algorithmic Trading》)、High Frequency Trading(《Inside the Black Box》《Market Microstructure in Practice》)、Crypto(《The Bitcoin Standard》《Mastering Bitcoin》)、Biography 与 General 大类;
  • 视频以机器学习在交易中的应用为主,覆盖 Krish Naik、Sentdex、QuantInsti、Chat with Traders 系列等;
  • 博客收录了 RobotWealth、QuantStart、Blackarbs、AAA Quants 等量化社区常青树;课程则以 NYU 机器学习金融系列(Coursera)、Udacity AI for Trading、CFTE 的 AI in Finance 等为主。

多语言版本与参与方式

仓库的主文档采用“英文为主、翻译同步”的结构:中文读者可阅读 README_zh.md,日文读者可阅读 README_ja.md。翻译版本同样由自动化机制兜底——策略表格由 build_strategies_table.py 的 LOCALES 配置同时写回三个文件,计数校准由 update_counts.py 按文件独立统计并报告跨语言差距,避免“英文更新、翻译滞后”导致的数字错位。

如需在本地查看完整内容,可通过 git clone https://gitcode.com/GitHub_Trending/aw/awesome-systematic-trading 拉取仓库,然后依次执行只读检查类命令:

python scripts/update_counts.py --check   # 校验三个 README 的计数是否与表格一致
# 生成策略表格需访问 HF 数据集,需要 HF_ACCESS_TOKEN 环境变量
# 链接体检需要 GITHUB_TOKEN 环境变量

需要说明的是,仓库为只读环境,上述脚本中 update_counts.py 与 check_links.py --annotate 会改写 README,建议仅在本地克隆或 fork 中运行;在源仓库上则以 issue 提交建议的方式参与贡献即可。

小结

awesome-systematic-trading 的价值不在于“链接多”,而在于把三个通常割裂的环节——论文、可运行代码、实测业绩——串成一条可审计的流水线:README 顶部用 4,843 篇论文的复现统计告诉你“论文里写的超额收益有多大概率是噪声”,策略表格用 t 统计量与活跃窗口口径筛出 61 个最硬的复现,static/strategies 提供可直接研读的 QuantConnect 实现,而三个脚本保证这一切在目录更新时不会腐烂。对想做系统性交易的开发者而言,它既是一份工具选型地图,也是一套“论文复现方法论”的活教材:先看 t 值再信夏普,先剔除指数暴露再谈 alpha,先读源码注释再改参数——这就是这份清单想教会你的第一课。

登录后查看全文
awesome-systematic-trading