用Python从零构建动量算法交易系统:Massive、SnapTrade与Alpaca实战

用Python+Django从零搭建动量算法纸面交易系统,串联行情数据、策略计算与模拟下单全流程。
这门课程由 Nick McCollum 制作,带领学习者用 Python 和 Django 从零构建一套完整的动量投资纸面交易系统,全程不涉及真实资金。系统以「12 减 1 动量」策略为核心——计算股票过去 12 个月但剔除最近 30 天的价格涨跌幅,买入动量最高的股票。三个外部服务分工明确:Massive 提供批量行情数据、SnapTrade 通过 OAuth 安全连接券商、Alpaca 执行模拟交易。工程层面,项目基于 Django 双 App 架构进行数据建模,用枚举约束订单状态、字段命名预留扩展空间,并围绕 Massive 每分钟 5 次请求的速率限制设计了缓存与限流机制。课程不仅展示了完整的从信号生成到 Alpaca 成交的闭环流水线,还保留了真实的踩坑与纠错过程,是量化交易工程实现的扎实实操教材。
想亲手搭建一套完整的算法交易系统,但又不想冒着真金白银的风险?由 Nick McCollum 制作、Katie Charbonneau 协助的这门 Python 实战课程给出了一条清晰路径:用 Python 从零构建一个动量投资(Momentum Investing)纸面交易系统,把市场数据、策略计算与券商执行串成一条完整流水线。
整套系统的核心逻辑是——从 Massive 拉取股票行情数据,在一个由 50 只股票构成的投资标的池中计算 12 个月动量得分,自动生成交易信号,再通过 SnapTrade 把订单路由到 Alpaca 的模拟(Paper Trading)账户执行。整个过程不涉及任何真实资金,适合任何想学习量化交易工程实现的开发者跟着做。
三个关键服务:数据、券商连接与执行
这个项目依赖三个外部服务,每一个都承担着明确的角色。
Massive 负责提供股票行情数据。它的免费层有严格的速率限制——每分钟只能发 5 个请求。这个限制直接影响了系统架构设计:课程中专门为此构建了带缓存和限流逻辑的客户端,并利用 Massive 的 grouped daily(分组日线)接口,一次请求就能拿到某个交易日所有美股的 OHLCV 数据,从而把针对 50 只股票的大批量数据获取压缩成寥寥两次 API 调用。
SnapTrade 承担安全的券商连接与下单执行。它通过 OAuth 流程把应用与券商账户打通,并为每个订单分配订单 ID。课程还特意把订单 ID 字段命名为 external_order_id 而非 alpaca_order_id,这样同一套数据模型未来也能扩展到 Interactive Brokers 等其他券商。
Alpaca 则是实际的股票券商,提供纸面交易账户。注意它的官网是 alpaca.markets 而非 alpaca.com。新开的纸面账户自带 10 万美元虚拟资金,用户可以在不动用真实资金的前提下完整走一遍下单到成交的流程。

OAuth(开放授权)是一种业界标准的授权协议,允许第三方应用在不获取用户账户密码的前提下,获得对目标服务的有限访问权限。SnapTrade 采用 OAuth 流程将交易应用与券商账户打通:用户在 SnapTrade 界面完成授权后,应用只持有一个受限的访问令牌(Access Token),券商的登录凭证始终不会暴露给应用层。这种设计在开放银行和金融科技领域已成主流,其优势在于权限可撤销、可细粒度控制(如只允许下单但不允许出金),即便令牌泄露,攻击面也远小于直接暴露账户密码。对于需要同时接入多家券商的系统而言,SnapTrade 作为聚合中间层,还省去了为每家券商单独维护 OAuth 逻辑的工程成本。
策略内核:12 减 1 动量
系统实现的策略灵感来自 Wes Gray 和 Jack Vogel 的著作《Quantitative Momentum》。核心思路是:对投资标的池里的所有股票按动量排名,买入动量最高的股票,必要时做空动量最低的股票,以期获得超额收益。
这里用的是业界常说的「12 减 1 动量」——即只看过去 12 个月、但剔除最近 30 天的价格涨跌幅。课程把这个窗口期做成了 settings.py 里的可配置变量,意味着你 fork 项目后可以轻松切换成其他动量周期。
在演示中,重新计算动量得分后,排名前 10 的基本都是 AI 与科技股——Google、AMD、Intel、Nvidia、Tesla 等,这反映了近期的 AI 行情;比如 Intel 一年涨了 98.5%。而垫底的 10 只则是 UnitedHealth(跌 45%)、Adobe、Salesforce 这类受「AI 焦虑」拖累的股票。系统最终的操作很直接:往动量最高的 10 只股票各投入 100 美元。

「12 减 1 动量」策略在学术文献中也称为「中期动量」或「跨期动量」(Cross-Sectional Momentum)。剔除最近一个月的原因是:大量实证研究表明,股票在最近 2-4 周内存在短期反转效应(Short-Term Reversal)——即涨得太猛的股票往往会在下月出现均值回归,如果直接用 12 个月全段数据,这个噪音会污染信号质量。通过剔除最近 30 天,策略只保留中长期趋势的部分,信噪比更高。Jegadeesh 和 Titman 在 1993 年的经典论文中首次系统验证了动量效应,而 Wes Gray 与 Jack Vogel 的《Quantitative Momentum》则进一步把这套信号工程化,加入了动量「一致性」(Frog-in-the-Pan)等改良维度,用以区分平滑上涨和剧烈波动的动量来源,课程选取该著作作为策略灵感正是基于此。
工程实现:Django 全栈搭建
项目的后端骨架是 Django——Python 最流行的 Web 框架。开发环境用 uv 作为包管理器,依赖写在 requirements.txt 里。整个搭建过程相当体系化:
数据建模
项目拆分成 trading 和 portfolio 两个 Django app。trading 里定义了 Stock、PriceData、MomentumScore、TradingSignal、RebalanceEvent 等模型;portfolio 里则有 Portfolio、Position、Trade、PerformanceMetric。
每个模型都细致配置了字段类型、数据库索引、唯一约束和默认排序。像 TradingSignal 用枚举(choices)来约束信号类型只能是买/卖/持有中的一种,Trade 模型则用枚举管理 pending、submitted、filled、partially_filled、canceled、rejected 等订单状态。这些细节正是生产级应用与玩具项目的区别所在。

Django Admin 与管理命令
课程充分利用了 Django 自带的 Admin 面板来管理数据模型,并大量使用 Django 管理命令(management command)作为快速迭代后端逻辑的 CLI 工具。无论是拉取 Massive 数据(pull_massive_data)还是给数据库填充种子数据(backfill_data),都是通过这种方式先行验证逻辑,再接到前端。
环境变量管理用的是 python-decouple,把 Massive API Key、SnapTrade 的 client ID 与 secret 都放进 .env 文件,避免硬编码敏感信息。
完整闭环:从信号到成交
当数据、策略和券商连接都就位后,系统就能跑完整个闭环。用户先在前端连接一个 SnapTrade 的 Alpaca 纸面账户组合,然后在交易信号页点击生成信号,系统基于当前动量数据产出 10 个买入信号。点击某个信号的买入按钮——比如买 100 美元的 Walmart 或 AMD——SnapTrade 会把一个市价单(notional 下单,即按金额而非股数)提交给 Alpaca。
值得一提的是,具体买多少股是在 Alpaca 端按成交时的实时价格计算的,应用本身不负责这步。下单成功后,到 Alpaca 的 UI 里就能在订单列表中看到这笔交易——课程特别提醒,Alpaca 界面对 notional 交易的展示并不直观,100 美元的金额藏在订单详情里容易被忽略。

此外,系统还内置了策略引擎(strategy engine)来处理再平衡逻辑,可按周或按月判断是否需要重新调仓。课程作者坦言 run_backtest(回测)方法目前只是个占位符,并把编写回测逻辑作为留给学员的「作业」,欢迎提交 PR。
Notional 下单(按金额下单)是相对于 shares 下单(按股数下单)的另一种委托方式。传统经纪商通常要求投资者指定购买多少股,但 notional 方式允许你直接输入「我要买 100 美元的某股票」,券商在订单执行时按实时价格换算成股数,结果往往是小数股(Fractional Shares)。这对小额资金做等权重配置非常友好——无需手动计算每只股票能买几股,也避免了因股价高低不一导致的实际配置比例失真。Alpaca 支持 notional 委托并允许持有分数股,这正是系统选择它做执行层的原因之一。该功能在 Alpaca 界面的展示确实不够直观,文章特别提醒需要进入订单详情才能看到金额字段,是实际操作时容易踩的一个坑。
适合谁,学到什么
这门课的价值不仅在于「做一个交易系统」,更在于它完整演示了一个真实工程项目的搭建方法论:如何围绕第三方 API 的速率限制设计架构、如何做数据建模、如何用缓存和限流保护脆弱的外部依赖、如何用枚举约束状态机、以及如何通过 OAuth 安全地连接券商。
作者还刻意保留了编码过程中的真实错误和修复过程(比如把方法写错了 app、import 路径搞混),并在配套仓库里保留了真实的提交历史,让学习者能看到工程实战中踩坑与纠错的全貌。对想把 Python 技能应用到量化交易、或是想理解全栈数据管道如何落地的开发者来说,这是一份相当扎实的实操教材。
相关推荐

Databricks Genie重大更新:上下文、数据接入与自动化全面升级
Databricks Genie One迎来重大更新,涵盖业务感知上下文、工作区指令、多格式文件上传、Unity Catalog直连查询和定时自动化任务,推动企业级AI数据助手深度融入数据工作流。

Omnigent:让Claude Code与Codex协同工作的开源元框架
Omnigent是一款开源元框架,让Claude Code、Codex等多个编码智能体共享会话、规则与安全策略。本文解析其任务分叉、Debby多Agent评审辩论与Polly子Agent拆分等协作模式。

算力上太空:谷歌与Planet原型卫星成功发射意味着什么
谷歌与Planet合作的太空算力原型卫星由SpaceX成功发射。本文解析把计算搬到太空的动因、工程挑战以及商业航天生态的协同意义。