
用 Python 揭秘均值回归策略:你的收益从何而来?
2026年重磅升级已全面落地!欢迎加入专注财经数据与量化投研的【数据科学实战】知识星球!您将获取持续更新的《财经数据宝典》与《量化投研宝典》,双典协同提供系统化指引;星球内含 500 篇以上独有高质量文章,深度覆盖策略开发、因子分析、风险管理等核心领域,内容基本每日更新;同步推出的「量化因子专题教程」系列(含完整可运行代码与实战案例),系统详解因子构建、回测与优化全流程,并实现日更迭代。我们持续扩充独家内容资源,全方位赋能您的投研效率与专业成长。无论您是量化新手还是资深研究者,这里都是助您少走弯路、事半功倍的理想伙伴,携手共探数据驱动的投资未来!
你有没有过这样的时刻:打开券商 App,看着满屏跳动的红绿数字,再刷一下财经新闻和论坛帖子,却发现自己只是在"凭感觉"买卖?
最近看到一位开发者 Mohit Appari 的分享,他用大约一年时间,基于 Python 独立搭建了一个名为 Seeking Alpha 的全栈量化研究平台。整个系统零云服务费用,API 全部使用免费额度,跑在一台笔记本上,却实现了从因子建模、信号打分、回测验证到模拟交易的完整闭环。
对于正在学习 Python 的同学来说,这是一个非常值得研究的项目:它既有工程深度(FastAPI + Next.js + DuckDB),又有量化金融的学术背景(Fama-French、Jegadeesh-Titman 等经典论文),覆盖面广且脉络清晰。本文带你梳理项目的核心思路,并附上可运行的 Python 案例。
作者的出发点很朴素:Bloomberg 终端买不起,别人的 newsletter 又不敢全信,于是决定自己搭建一套系统化的研究框架。
他认为普通散户和专业机构的差距,不在于信息本身(大家拿到的公开数据其实差不多),而在于是否拥有一套可复用、可验证的系统化流程。
作者在写代码之前,先读了三篇经典论文:
最终他的评分模型由四大因子组成:
Score = 0.30 × 动量 + 0.25 × 技术 + 0.25 × 基本面 + 0.20 × 事件各因子权重与含义如下:
关键点:每个因子在加权前都要先做百分位排名,否则 RSI 的 45 和动量的 +12% 根本无法直接相加。
下面用 Python 演示一个简化版的动量打分:
import yfinance as yfimport pandas as pd# 定义股票池tickers = ["AAPL", "MSFT", "NVDA", "GOOGL", "META"]# 下载最近 13 个月的数据data = yf.download(tickers, period="13mo", interval="1d")["Close"]# 计算 12-1 动量:跳过最近 21 个交易日,回看 252 个交易日def momentum_12_1(prices): # 最近一个月(约 21 个交易日)的价格,作为起点 recent = prices.iloc[-21] # 大约 12 个月前的价格,作为基准 past = prices.iloc[-252] return (recent - past) / past# 计算每只股票的动量得分scores = data.apply(momentum_12_1)# 做横截面百分位排名,保证可比性scores_rank = scores.rank(pct=True)print("动量原始值:")print(scores)print("\n百分位排名(越接近 1 越强):")print(scores_rank.sort_values(ascending=False))作者最初用 Streamlit 做原型,但很快遇到瓶颈:计算层和 UI 层耦合太紧,复杂交互难以实现。于是他把系统重构成了标准的前后端分离架构:
localhost:8000localhost:3000.duckdb 文件这里最值得学习的是 DuckDB 的选型。它是一个列式分析型数据库,作为库直接 import,不需要启动服务器。对于 500 只股票、2 年日线数据(约 25 万行)这种体量,聚合查询可以做到亚秒级响应,比行式的 SQLite 快很多。
下面用 Python 演示 DuckDB 的基本用法:
import duckdbimport pandas as pd# 连接本地 DuckDB 文件,没有就自动创建con = duckdb.connect("seeking_alpha.duckdb")# 创建价格表con.execute(""" CREATE TABLE IF NOT EXISTS prices ( ticker VARCHAR, date DATE, open DOUBLE, high DOUBLE, low DOUBLE, close DOUBLE, volume BIGINT )""")# 准备示例数据df = pd.DataFrame({ "ticker": ["AAPL", "AAPL", "MSFT"], "date": ["2026-05-10", "2026-05-11", "2026-05-11"], "open": [190.0, 192.0, 410.0], "high": [193.0, 195.0, 415.0], "low": [189.0, 191.0, 408.0], "close": [192.5, 194.5, 413.0], "volume": [50_000_000, 48_000_000, 22_000_000],})# 从 pandas DataFrame 批量写入con.execute("INSERT INTO prices SELECT * FROM df")# 聚合查询:计算每只股票的平均收盘价result = con.execute(""" SELECT ticker, AVG(close) AS avg_close FROM prices GROUP BY ticker""").fetchdf()print(result)有了分数之后,下一步是把它翻译成可执行的操作。系统会为每只持仓输出四种建议之一:EXIT 、REDUCE 、HOLD 、ADD。
每个建议都会给出明确的止损位(1.5 × ATR)和目标价(3 × ATR),用波动率自适应地定义风险。
下面是一个简化的信号判定示例:
def generate_signal(rsi, macd_hist, price, sma50, mom_3m): """ 根据技术指标生成简化的交易建议 参数说明: rsi : 相对强弱指数 macd_hist : MACD 柱状图值 price : 当前价格 sma50 : 50 日均线 mom_3m : 3 个月动量收益率 """ # 统计触发的退出条件数量 exit_conditions = 0 if rsi > 72: exit_conditions += 1 if macd_hist < 0: exit_conditions += 1 if price < sma50: exit_conditions += 1 if mom_3m < 0: exit_conditions += 1 # 多信号才触发行动,否则维持持有 if exit_conditions >= 2: return "EXIT" if 35 <= rsi <= 58 and macd_hist > 0 and price > sma50 and mom_3m > 0: return "ADD" return "HOLD"# 实测一下print(generate_signal(rsi=75, macd_hist=-0.2, price=100, sma50=105, mom_3m=-0.03))print(generate_signal(rsi=45, macd_hist=0.5, price=110, sma50=105, mom_3m=0.08))作者引入了 Regime Detection(市场状态识别),用 SPY(标普 500 ETF)作为市场代理,把环境分成三种:
这一层"保险丝"非常关键:动量策略在趋势市表现亮眼,但在反转市会把利润全部吐回去。
作者在文末总结了几条经验,对新手特别实用:
这个项目最值得借鉴的地方,并不是它用了多少炫酷的技术栈,而是它展示了一条清晰的工程路径:
对 Python 学习者来说,这是一套非常好的练手蓝本。你不需要一次做到 500 只股票,可以先从 10 只股票、1 个因子、1 张数据表开始,逐步扩展。重要的不是复刻整个系统,而是形成一套系统化思考股票的框架——这也是作者反复强调的,他真正收获的东西。
正如他在文末写的那句话:
这个项目给我最大的价值,不是平台本身,而是一套思考问题的方法。
2026年全面升级已落地!【数据科学实战】知识星球核心权益如下:
星球已沉淀丰富内容生态——涵盖量化文章专题教程库、因子日更系列、高频数据集、PyBroker实战课程、专家深度分享与实时答疑服务。无论您是初探量化的学习者,还是深耕领域的从业者,这里都是助您少走弯路、高效成长的理想平台。诚邀加入,共探数据驱动的投资未来!
好文推荐
1. 用 Python 打造股票预测系统:Transformer 模型教程(一)
2. 用 Python 打造股票预测系统:Transformer 模型教程(二)
3. 用 Python 打造股票预测系统:Transformer 模型教程(三)
4. 用 Python 打造股票预测系统:Transformer 模型教程(完结)
6. YOLO 也能预测股市涨跌?计算机视觉在股票市场预测中的应用
9. Python 量化投资利器:Ridge、Lasso 和 Elastic Net 回归详解
好书推荐