A 股量化入门:一个程序员的视角
为什么写这篇文章
2025年底,我开始对量化交易产生兴趣。作为一个写了8年代码的程序员,我以为凭借技术背景可以快速上手。
结果发现:我错了。
市面上的资源主要分两类:
- 学术派:满篇数学公式、随机过程、随机微积分...看完觉得自己智商不够
- 玄学派:"我用这个指标抓了10倍股"、"主力资金流向揭秘"...看完觉得像算命
我想找的是:工程师视角的量化交易指南
- 数据从哪来?怎么存?
- 策略怎么写?用什么语言?
- 回测怎么做?如何避免过拟合?
- 风控怎么搞?亏了怎么办?
这篇文章就是我的学习笔记整理。不求暴富,但求真正理解量化交易的工程实践。
先泼冷水:量化的真实面貌
量化不是印钞机
- 年化收益20%+已经算是优秀(巴菲特长期也就20%左右)
- 最大回撤30%是常态(你能承受吗?)
- 90%的散户量化者亏损(和主观交易差不多)
- 幸存者偏差严重:你看到的都是成功案例,失败者不会晒单
程序员的常见误区
- "我有技术优势" → 技术只是基础,市场认知才是核心
- "我可以高频套利" → 机构延迟比你低100倍,你竞争不过
- "回测好看就能赚钱" → 过拟合会让你在实盘中血本无归
- "AI/ML能预测市场" → 如果真这么简单,早就被机构垄断了
第一步:数据获取与存储
A股数据源选择
| 数据源 | 类型 | 成本 | 更新频率 | 适合场景 |
|---|---|---|---|---|
| Tushare | API | 免费/付费 | T+1 | 历史数据+基本面 |
| AkShare | API | 免费 | 实时/T+1 | 爬虫式数据采集 |
| Baostock | API | 免费 | T+1 | 历史行情数据 |
| JoinQuant/RiceQuant | 平台 | 免费/付费 | 实时 | 完整量化平台 |
| Wind/Choice | 终端 | 昂贵 | 实时 | 专业机构使用 |
我的选择:Tushare(积分制,免费额度够用)+ AkShare(补充数据)
数据存储方案
# 推荐技术栈
数据库: PostgreSQL (时序数据) + Redis (缓存)
ORM: SQLAlchemy (Python)
文件格式: Parquet (高效压缩) / HDF5 (科学计算)
# 表结构示例
CREATE TABLE stock_daily (
ts_code VARCHAR(10), # 股票代码
trade_date DATE, # 交易日期
open DECIMAL(10,2), # 开盘价
high DECIMAL(10,2), # 最高价
low DECIMAL(10,2), # 最低价
close DECIMAL(10,2), # 收盘价
vol BIGINT, # 成交量
amount DECIMAL(20,2), # 成交额
PRIMARY KEY (ts_code, trade_date)
);
数据质量检查(重要!)
def data_quality_check(df):
"""数据质量检查清单"""
checks = {
'null_ratio': df.isnull().sum() / len(df), # 空值比例 >5%?
'duplicate': df.duplicated().sum(), # 重复记录?
'outlier': detect_outliers(df['close']), # 异常值?(如价格为0或负数)
'continuity': check_trading_day_gap(df), # 交易日连续性?(停牌处理)
'range_check': df['close'].between(0.1, 1000) # 价格合理性?
}
return checks
# ⚠️ 垃圾进垃圾出(GIGO):数据质量决定策略上限
第二步:策略开发框架
策略类型分类
- 趋势跟踪型:均线系统、突破策略、动量策略
→ 适合趋势明显的市场,震荡市会反复打脸 - 均值回归型:布林带、RSI超卖超买、配对交易
→ 适合震荡市,趋势市会被碾压 - 统计套利型:协整关系、因子模型、多因子选股
→ 需要大量数据和统计学知识 - 事件驱动型:财报预告、政策变化、概念炒作
→ 需要NLP能力提取事件信号
一个简单的双均线策略示例
import pandas as pd
import numpy as np
def dual_ma_strategy(df, short_window=5, long_window=20):
"""
双均线交叉策略
短均线上穿长均线 → 买入信号
短均线下穿长均线 → 卖出信号
"""
# 计算均线
df['ma_short'] = df['close'].rolling(short_window).mean()
df['ma_long'] = df['close'].rolling(long_window).mean()
# 生成信号
df['signal'] = 0
df.loc[df['ma_short'] > df['ma_long'], 'signal'] = 1 # 持有
df.loc[df['ma_short'] <= df['ma_long'], 'signal'] = 0 # 空仓
# 计算持仓变化(产生交易信号)
df['position_change'] = df['signal'].diff()
return df
# ⚠️ 这只是演示!实盘需要考虑更多因素:
# - 滑点(Slippage)
# - 手续费(Transaction Cost)
# - 冲击成本(Market Impact)
# - 涨跌停限制
# - 流动性不足
因子库建设(进阶)
多因子模型的核心是因子库:
- 价值因子:PE、PB、PS、股息率
- 成长因子:营收增长率、净利润增长率、ROE变化
- 质量因子:ROE、ROA、资产负债率、毛利率
- 动量因子:过去1/3/6/12个月收益率
- 波动率因子:历史波动率、下行风险
- 流动性因子:换手率、成交额、Amihud非流动性指标
- 分析师预期:盈利预测调整、目标价变化
第三步:回测系统搭建
回测框架选择
| 框架 | 特点 | 适合人群 |
|---|---|---|
| Backtrader | 纯Python,灵活度高 | 喜欢自己造轮子的开发者 |
| Zipline | Quantopian开源,社区大 | 快速原型验证 |
| VnPy | 国内开发,支持国内期货 | 期货/期权交易者 |
| JoinQuant/RiceQuant | 云端回测,无需本地环境 | 新手入门 |
我的选择:Backtrader(灵活性高,完全可控)
回测代码结构
class MyStrategy(bt.Strategy):
params = (
('ma_period', 20),
('stop_loss', 0.05), # 5%止损
('take_profit', 0.15), # 15%止盈
)
def __init__(self):
self.ma = bt.indicators.SMA(self.data.close, period=self.params.ma_period)
self.order = None
def next(self):
if not self.position: # 还没有持仓
if self.data.close[0] > self.ma[0]: # 价格站上均线
# 计算仓位大小(风险控制!)
size = self.calculate_position_size()
self.order = self.buy(size=size)
else:
if self.data.close[0] < self.ma[0]: # 价格跌破均线
self.order = self.close()
# 止损止盈检查
if self.profit_percent < -self.params.stop_loss:
self.order = self.close() # 止损
elif self.profit_percent > self.params.take_profit:
self.order = self.close() # 止盈
def calculate_position_size(self):
"""基于ATR的仓位管理"""
atr = self.data.atr[0] # Average True Range
risk_per_trade = 0.02 # 单笔风险不超过本金2%
stop_distance = 2 * atr # 止损距离
size = (self.broker.cash * risk_per_trade) / stop_distance
return int(size)
# 运行回测
cerebro = bt.Cerebro()
cerebro.addstrategy(MyStrategy)
data = bt.feeds.PandasData(dataname=df)
cerebro.adddata(data)
cerebro.broker.setcash(100000) # 初始资金10万
results = cerebro.run()
cerebro.plot() # 可视化
⚠️ 回测陷阱(必读!)
陷阱1:过拟合(Overfitting)
症状:回测收益率完美,实盘一塌糊涂
原因:参数优化过度,把历史噪声当成了规律
解决方案:
- 样本外测试(Out-of-Sample Testing):用70%数据训练,30%数据验证
- 参数稳定性检验:参数微小变化是否导致性能大幅波动?
- 前向分析(Walk-Forward Analysis):滚动窗口验证
- 简单性原则(Occam's Razor):参数越少越好,逻辑越简单越robust
陷阱2:幸存者偏差(Survivorship Bias)
症状:只用了当前存在的股票做回测
问题:退市股、ST股被排除,导致回测收益虚高
解决方案:使用包含退市股的全样本数据
陷阱3:未来函数(Look-Ahead Bias)
症状:回测中使用了当时不可能知道的信息
例子:用当日收盘价作为买入信号(实际无法在收盘价买入)
解决方案:严格按时间顺序,只用已知信息
陷阱4:忽略交易成本
现实成本:
- 印花税:卖出时0.05%(单向)
- 佣金:万2.5(最低5元)
- 过户费:万0.2(沪市)
- 滑点:实际成交价 vs 期望价格(冲击成本)
经验法则:高频策略如果考虑真实成本,很多"盈利"策略会变成亏损
第四步:风险管理(最重要!)
仓位管理
def kelly_fraction(win_rate, avg_win, avg_loss):
"""凯利公式计算最优仓位"""
b = avg_win / abs(avg_loss) # 盈亏比
f = (b * win_rate - (1 - win_rate)) / b
return max(0, min(f, 0.25)) # 实际使用不超过凯利值的一半(半凯利)
# 示例:
# 胜率55%,盈亏比1.5:1
# 凯利公式建议仓位 = 16.67%
# 半凯利 = 8.33%(更保守安全)
# ⚠️ 绝不要满仓梭哈!这是新手最大的死因
止损纪律(铁律)
- 固定百分比止损:亏损达到X%无条件离场
- ATR止损:基于波动率的动态止损
- 时间止损:持有超过N天没有预期走势则离场
- 逻辑止损:买入的理由不再成立时离场
组合管理
- 分散投资:单一标的仓位不超过总资金的10%
- 低相关性:选择相关性<0.6的资产构建组合
- 动态再平衡:定期调整权重回到目标配置
- 最大回撤控制:设定组合级止损线(如-15%)
第五步:实盘执行
交易通道选择
| 方式 | 门槛 | 费用 | 适合策略 |
|---|---|---|---|
| 手动交易 | 0 | 万2.5 | 低频(周线级别) |
| 券商API/QMT | 50万 | 万1-1.5 | 中高频 |
| 专业柜台(CTP) | 高 | 低 | 期货/高频 |
自动化执行注意事项
- 网络异常处理:断网怎么办?订单状态不明怎么办?
- 限价单vs市价单:流动性不足时限价单可能无法成交
- 日志记录:每笔交易必须可追溯、可审计
- 熔断机制:单日亏损超过X%自动停止交易
我的实战经验与教训
2025年的战绩
- 初始资金:5万元(实验性质,亏得起)
- 策略数量:测试过12个策略,最终保留3个
- 年度收益+18.7%(跑赢沪深300的+12.3%)
- 最大回撤-22.3%(心理压力巨大)
- 胜率48%(靠盈亏比赚钱,不是靠胜率)
踩过的坑
- 过度优化参数:某个策略回测年化80%,实盘第1个月就亏15% → 教训:简单粗暴往往更好
- 忽视黑天鹅:2026年初市场暴跌,所有相关性资产一起跌 → 教训:尾部风险必须考虑
- 情绪化操作:看到浮亏就慌,提前止损;看到浮盈就拿不住 → 教训:严格执行纪律,去掉人为干预
- 数据错误:某次因为复权数据处理错误导致信号全错 → 教训:数据质量检查不能省
给程序员的特别建议
你的优势
- 能快速实现策略想法(别人还在Excel里算,你已经跑完回测了)
- 能处理大数据(全A股4000+股票的日线数据轻松应对)
- 能自动化执行(减少情绪干扰)
- 能进行系统性研究(而不是凭感觉)
你的劣势
- 容易陷入技术细节:纠结代码优雅度而忽视策略本身
- 过度自信:以为聪明就能战胜市场(市场专治各种不服)
- 缺乏金融直觉:对宏观经济、产业周期、市场情绪不敏感
- 风险意识不足:习惯了"大不了重部署",但钱亏了就真的没了
学习路径推荐
- 基础阶段(1-2个月):学会获取数据 + 写一个简单策略 + 跑通回测
- 进阶阶段(2-3个月):学习经典策略(海龟、布林带、因子模型)+ 理解过拟合
- 实战阶段(3-6个月):小资金实盘(1-5万)+ 记录每笔交易 + 复盘总结
- 优化阶段(持续):根据实盘反馈迭代策略 + 学习新方法(ML/AI应用)
资源推荐
书籍
- 《量化投资:方法与技术》(入门必读)
- 《主动投资组合管理》(进阶)
- 《统计套利》(数学基础好再看)
- 《打开量化投资的黑箱》(通俗易懂)
在线课程
- JoinQuant学院(免费,适合入门)
- RiceQuant研究(高质量研报)
- 优矿社区(实战案例丰富)
开源项目
- vnpy(国产量化框架) li>backtrader(灵活的回测引擎) li>empyrical(绩效分析工具)
最后的忠告
量化交易不是致富捷径,它是一门需要持续学习的技艺。
作为一个程序员,你有技术优势,但这只是入场券。真正的挑战在于市场理解和风险控制。
如果你决定开始:
ol>本文基于作者2025-2026年的学习和实践经验整理。所有代码仅供学习参考,不构成投资建议。股市有风险,入市需谨慎。最后更新于2026年5月10日。