第 1 章 · 01 quant-trading 项目全貌与诚实回测哲学 本节摘要:本节是整段旅程的起点。在动任何一行策略代码之前,我们先认清脚下这块地基——quant-trading 项目到底是什么、作者是谁、规模多大、藏了哪些宝贝。更重要的是,作者在 README 开篇就摆出 Renaissance Technologies 的两句名言,然后坦白地告诉你:仓库里所有回测都假设"无摩擦"——无滑点、无手续费、无流动性约束。这一句诚实,决定了你应当如何阅读本书后面所有的"漂亮收益曲线":永远先打一个折,再看。 涉及源码:原项目 (约 31KB), (GPL),全仓约 7537 行 / 26 个 Python 文件。
本节摘要:本节是整段旅程的起点。在动任何一行策略代码之前,我们先认清脚下这块地基——quant-trading 项目到底是什么、作者是谁、规模多大、藏了哪些宝贝。更重要的是,作者在 README 开篇就摆出 Renaissance Technologies 的两句名言,然后坦白地告诉你:仓库里所有回测都假设"无摩擦"——无滑点、无手续费、无流动性约束。这一句诚实,决定了你应当如何阅读本书后面所有的"漂亮收益曲线":永远先打一个折,再看。
涉及源码:原项目
README.md(约 31KB),LICENSE(GPL),全仓约 7537 行 / 26 个 Python 文件。
⚠️ 注意:本节引用的所有策略收益、Sharpe、最大回撤数字,均来自无摩擦假设下的历史回测,不构成任何投资建议。作者本人也反复强调——回测好看,绝不等于实盘能赚。
quant-trading 是 GitHub 用户 je-suis-tm(我更愿意称他"某位意裔量化学者")维护的个人策略仓库,采用 GPL 协议开源。它的体量不大却很扎实——根目录加四个子目录(Oil Money project/Ore Money project/Smart Farmers project/Monte Carlo project),合计 26 个 Python 文件、约 7537 行代码,远不是"toy repo"那种几百行的玩票。
按内容,这 26 个文件可以干净地分成三类:
| 类别 | 数量 | 代表 |
|---|---|---|
| 技术指标策略 | 12 个 | MACD、Awesome Oscillator、Parabolic SAR、Bollinger、RSI、Heikin-Ashi、Dual Thrust、London Breakout、Shooting Star、Pair Trading 等 |
| 期权与波动率 | 2 个 | Options Straddle、VIX Calculator |
| Quantamental 大项目 | 4 个(每个含多脚本) | Oil Money(石油货币)、Ore Money、Smart Farmers(智能农民)、Monte Carlo |
第三类是全书真正的"重头戏"——所谓 quantamental(quant + fundamental),是把宏观基本面与统计/优化方法揉在一起的研究项目,动辄几百行,有的还自带数据清洗与子目录。技术指标那 12 个则短小精悍,平均两百多行,非常适合作为入门精读素材,本书第 2~5 章就主要啃它们。
打开 README,正文第一段不是自我介绍,而是两段引文——
We're right 50.75 percent of the time... but we're 100 percent right 50.75 percent of the time, you can make billions that way.
—— Robert Mercer,Renaissance Technologies 联席 CEO
If you trade a lot, you only need to be right 51 percent of the time, we need a smaller edge on each trade.
—— Elwyn Berlekamp,组合博弈论联合创始人
作者特意注明:这两句话出自 Gregory Zuckerman 的《The Man Who SOLVED THE MARKET》(每一个 quant 的必读书)。把它放在仓库最显眼的位置,等于把整套研究的"价值观"先抛出来——
量化交易的核心不是"每单必胜",而是"持续地、微量地占优"。Renaissance 旗下的 Medallion 基金年化超过 60%(扣费前更高),靠的不是某几次神准预测,而是成千上万次"只比抛硬币好一点点"的下注,叠加严密的资金管理。这正是后面所有动量策略反复出现的底色:MACD、AO、SAR 这些指标单看胜率都不惊艳,但配合纪律化的持仓规则,长期累积出一条向上的曲线。
真正奠定全书阅读姿态的,是 README Intro 段里这一句(中文意译)——
所有脚本都是历史数据回测/前测(基本用 Python,不是 C++,也许不久会换 Julia)。假设所有交易都是无摩擦的:无滑点、无手续费、无流动性约束。最后,所有脚本都包含一个名为
main的全局函数,方便你直接嵌入自己的交易系统(虽然我懒得很,没写 docstring)。
这三条"无"假设,翻译成实盘语言,意味着——
所以当你看到后面 MACD 在某只股票上回测出一条漂亮的资产曲线时,请自动在心里减掉:每笔交易成本约 0.1%~0.3%、滑点再 0.05%~0.2%、极端行情下还要更多。一条回测里年化 20% 的曲线,实盘可能只剩 8%~12%,甚至为负。作者把这点坦白写在 README 第一页,是研究姿态的体现——先把假设说清楚,再谈结论。
读几篇代码注释和 README,你会发现作者绝不是"只会调包的程序员",而是真正受过计量经济学训练的学者。几个标志性的痕迹:
项目里数据不是统一来源,而是按"够用就行"分层——
data/gbpusd.csv(来自 histdata)、data/stoxx50.xlsx。data/henry hub european options.csv(天然气期权,供 Options Straddle 用)、data/cme holidays.csv、data/treasury yield curve rates.csv(国债收益率曲线)、data/bitcoin.csv。记住这条分层:能从 Yahoo 白嫖的就白嫖,买不到的才本地化。这也是个人量化研究者的现实选择。
本节是导论,没有复杂代码可精读。但有四段"代码事实"必须先建立,它们会贯穿全书——
main(),且用 if __name__=='__main__' 守护def main(): ma1=int(input('ma1:')) ma2=int(input('ma2:')) stdate=input('start date in format yyyy-mm-dd:') eddate=input('end date in format yyyy-mm-dd:') ticker=input('ticker:') df=yf.download(ticker,start=stdate,end=eddate) new=signal_generation(df,macd) new=new[slicer:] plot(new, ticker) if __name__ == '__main__': main()
这是 MACD 的入口(节选)。三个要点:① 参数靠交互式 input() 输入,所以脚本"双击即跑";② 数据靠 yf.download 现拉;③ 真正的策略逻辑封在 signal_generation 里,main 只负责编排。这种结构让每个脚本既是独立可运行的回测,又能被嵌入更大的系统。
往后每一章你都会看到这两列,务必现在就记住——
positions:当前持仓状态(0 = 空仓,1 = 满仓),逐根 K 线记录"我现在是拿着还是没拿"。signals:= positions.diff(),即实际下单动作(+1 = 这一根开多,-1 = 这一根平仓/反手,0 = 什么都不做)。为什么要拆成两列?因为回测里你既要知道"某时刻持仓是多少"(算市值),又要知道"今天到底要不要下单"(算交易成本与信号触发)。一列状态 + 一列动作,是最干净的写法。后面第 2 章 MACD、第 2 章 SAR,全仓统一沿用。
signal_generation(df, method) 的回调式结构几乎所有技术指标脚本都长这样:
def signal_generation(df, method): signals = method(df) # 先调指标函数,填充 ma1/ma2/sar 等 signals['positions'] = 0 signals['positions'][ma1:] = np.where(signals['ma1'][ma1:]>=signals['ma2'][ma1:], 1, 0) signals['signals'] = signals['positions'].diff() return signals
把"算指标"这件事抽成 method 参数(可以是 macd、parabolic_sar、awesome_ma),让信号生成框架与具体指标解耦。这是一种轻量的策略模式,后面你会反复受益。
作者自己承认"懒得很,没写 docstring"。但他用一种很可爱的方式补偿——在函数上方写大段散文式注释,把"为什么这么干""这个指标有什么坑""曾经一周交易六天所以默认 12/26"全写进去。读他的代码,像在读一本带批注的笔记本。本书后面"反直觉发现"很多就来自这些注释。
🎯 反直觉发现:Renaissance 的"51% 胜率赚大钱",听起来像鸡汤,但它真正在说的是——单笔盈亏的期望值 × 交易次数,才是收益的来源。技术指标策略胜率常常只有 45%~55%,但配合"截断亏损、让利润奔跑"的持仓规则,依然能累积出正期望。这与你直觉里"必须预测准才能赚"完全相反,也是本书反复要打掉的一个执念。
下一节,我们把这套"诚实哲学"落到工程层面——项目没有 requirements.txt,我们怎么把环境跑起来?