头条 从零搭建量化选股系统:一个 Python 开发者的全栈实战笔记

-- 次阅读

作者: 数据科学实战

  用 Python 揭秘均值回归策略:你的收益从何而来?      2026年重磅升级已全面落地!欢迎加入专注财经数据与量化投研的【数据科学实战】知识星球!您将获取持续更新的《财经数据宝典》与《量化投研宝典》,双典协同提供系统化指引;星球内含 500 篇以上独有高质量文章,深度覆盖策略开发、因子分析、风险管理等核心领域,内容基本每日更新;同步推出的「量化因子专题教程」系列(含完整可运行代码与实战案例),系统详解因子构建、回测与优化全流程,并实现日更迭代。我们持续扩充独家内容资源,全方位赋能您的投研效率与专业成长。无论您是量化新手还是资深研究者,这里都是助您少走弯路、事半功倍的理想伙伴,携手共探数据驱动的投资未来!引言你有没有过这样的时刻:打开券商 App,看着满屏跳动的红绿数字,再刷一下财经新闻和论坛帖子,却发现自己只是在"凭感觉"买卖?最近看到一位开发者 Mohit Appari 的分享,他用大约一年时间,基于 Python 独立搭建了一个名为 Seeking Alpha 的全栈量化研究平台。整个系统零云服务费用,API 全部使用免费额度,跑在一台笔记本上,却实现了从因子建模、信号打分、回测验证到模拟交易的完整闭环。对于正在学习 Python 的同学来说,这是一个非常值得研究的项目:它既有工程深度(FastAPI + Next.js + DuckDB),又有量化金融的学术背景(Fama-French、Jegadeesh-Titman 等经典论文),覆盖面广且脉络清晰。本文带你梳理项目的核心思路,并附上可运行的 Python 案例。一、项目背景:为什么要自己造轮子作者的出发点很朴素:Bloomberg 终端买不起,别人的 newsletter 又不敢全信,于是决定自己搭建一套系统化的研究框架。他认为普通散户和专业机构的差距,不在于信息本身(大家拿到的公开数据其实差不多),而在于是否拥有一套可复用、可验证的系统化流程。二、量化基石:四因子模型作者在写代码之前,先读了三篇经典论文:1. 1. Jegadeesh & Titman(1993)动量因子

    1. Fama-French 三因子模型
    1. Carhart(1997)四因子模型

最终他的评分模型由四大因子组成:

1
Score = 0.30 × 动量 + 0.25 × 技术 + 0.25 × 基本面 + 0.20 × 事件

各因子权重与含义如下:* • 动量因子(30%):采用 12-1 动量,即过去 12 个月收益去掉最近 1 个月,避免短期反转效应。

  • • 技术因子(25%):RSI 、MACD 、布林带、均线位置等,作为"确认信号"使用。
  • • 基本面因子(25%):ROE 、ROA 、P/E 、营收增速等,经过横截面百分位归一化。
  • • 事件因子(20%):聚焦财报后漂移 PEAD,捕捉财报前 5-20 天的窗口期。

关键点:每个因子在加权前都要先做百分位排名,否则 RSI 的 45 和动量的 +12% 根本无法直接相加。下面用 Python 演示一个简化版的动量打分:

1
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 到全栈作者最初用 Streamlit 做原型,但很快遇到瓶颈:计算层和 UI 层耦合太紧,复杂交互难以实现。于是他把系统重构成了标准的前后端分离架构:* • 后端:FastAPI + Uvicorn,运行在 localhost:8000

  • • 前端:Next.js 14 + React Query,运行在 localhost:3000
  • • 数据库:DuckDB,存放于本地 .duckdb 文件
  • • 数据源:yfinance 、FRED 、Finnhub 、SEC EDGAR 、Alpaca,全部免费

这里最值得学习的是 DuckDB 的选型。它是一个列式分析型数据库,作为库直接 import,不需要启动服务器。对于 500 只股票、2 年日线数据(约 25 万行)这种体量,聚合查询可以做到亚秒级响应,比行式的 SQLite 快很多。下面用 Python 演示 DuckDB 的基本用法:

1
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。* • EXIT 信号:RSI > 72 、MACD 柱状图转负、跌破 SMA50 、3 个月动量转负、触发止损,满足任意 2 个即触发。

  • • ADD 信号:RSI 在 35-58 健康区间、MACD 金叉、价格站上 SMA20 和 SMA50 、3 个月动量为正,要求多信号同时确认。
  • • HOLD:默认状态,大多数时候都应该持有不动。

每个建议都会给出明确的止损位(1.5 × ATR)和目标价(3 × ATR),用波动率自适应地定义风险。下面是一个简化的信号判定示例:

1
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)作为市场代理,把环境分成三种:1. 1. BULL 牛市:SPY 在 SMA50 之上、RSI > 50 、20 日动量为正,满仓操作。 2. 2. BEAR 熊市:SPY 跌破 SMA50 、RSI < 45,减仓、收紧止损。 3. 3. CHOP 震荡:不明朗时降低仓位,提高开仓门槛。

这一层"保险丝"非常关键:动量策略在趋势市表现亮眼,但在反转市会把利润全部吐回去。六、作者踩过的坑作者在文末总结了几条经验,对新手特别实用:1. 1. 先设计数据模型:作者重构了两次 DuckDB 表结构,每次都比最初搭建还费时间。 2. 2. 先写回测再写界面:没有回测验证过的信号,不值得花时间做 UI。 3. 3. 横截面归一化不可妥协:换成百分位排名后,评分质量肉眼可见地提升。 4. 4. UI 是产品的一部分:Bloomberg 风格的深色终端、供应链关系图,不只是好看,更决定了你如何思考信息。

总结这个项目最值得借鉴的地方,并不是它用了多少炫酷的技术栈,而是它展示了一条清晰的工程路径:* • 从学术论文出发,理解因子为什么有效

  • • 用 Python + DuckDB 搭建轻量、可扩展的数据层
  • • 通过 FastAPI + Next.js 实现前后端分离
  • • 用回测验证假设,用模拟盘验证执行
  • • 用市场状态识别作为风险控制闸门

对 Python 学习者来说,这是一套非常好的练手蓝本。你不需要一次做到 500 只股票,可以先从 10 只股票、1 个因子、1 张数据表开始,逐步扩展。重要的不是复刻整个系统,而是形成一套系统化思考股票的框架——这也是作者反复强调的,他真正收获的东西。正如他在文末写的那句话:这个项目给我最大的价值,不是平台本身,而是一套思考问题的方法。参考文章加入专注于财经数据与量化投研的知识星球【数据科学实战】,获取本文完整研究解析、代码实现细节。财经数据与量化投研知识社区2026年全面升级已落地!【数据科学实战】知识星球核心权益如下:1. 1. 双典系统赋能:获赠《财经数据宝典》与《量化投研宝典》完整文档,凝练多年实战经验,构建系统化知识框架; 2. 2. 量化因子日更教程(2026重磅新增):每日更新「量化因子专题教程」,配套完整可运行代码与实战案例,深度拆解因子构建、回测与优化全流程; 3. 3. 量化文章专题教程库:500+篇星球独有高质量教程式文章,系统覆盖策略开发、因子研究、风险管理等核心领域,内容基本每日更新,并配套精选学习资料与实战参考; 4. 4. 量化投研实战课程:赠送《AKQuant-入门及实战》《PyBroker-入门及实战》视频课程,手把手教学,快速掌握量化策略开发技能; 5. 5. 财经数据支持:定期更新国内外财经数据,为策略研发提供精准、可靠的数据基础; 6. 6. 顶尖学者与行业专家分享:年度邀请学术界博士与业界资深专家开展前沿论文精讲与实战案例分享,不少于4场,直击研究前沿与产业实践;专家直连答疑:与核心开发者及领域专家实时互动,高效解决投研实战难题; 7. 7. 专业社群与专属福利:加入高质量交流社群,获取课程折扣及更多独家资源。

星球已沉淀丰富内容生态——涵盖量化文章专题教程库、因子日更系列、高频数据集、PyBroker实战课程、专家深度分享与实时答疑服务。无论您是初探量化的学习者,还是深耕领域的从业者,这里都是助您少走弯路、高效成长的理想平台。诚邀加入,共探数据驱动的投资未来!

好文推荐

1. 用 Python 打造股票预测系统:Transformer 模型教程(一)

2. 用 Python 打造股票预测系统:Transformer 模型教程(二)

3. 用 Python 打造股票预测系统:Transformer 模型教程(三)

4. 用 Python 打造股票预测系统:Transformer 模型教程(完结)

5. 揭秘隐马尔可夫模型:因子投资的制胜武器

6. YOLO 也能预测股市涨跌?计算机视觉在股票市场预测中的应用

7. 金融 AI 助手:FinGPT 让你轻松掌握市场分析

8. 量化交易秘籍:为什么专业交易员都在用对数收益率?

9. Python 量化投资利器:Ridge、Lasso 和 Elastic Net 回归详解

10. 掌握金融波动率模型:完整 Python 实现指南

好书推荐


来源: 微信公众号

目录

×