跳转到主要内容
返回文章列表
已发布 - 内容完整

A 股量化入门:一个程序员的视角

投资理财阅读时间:15 分钟
#A股#量化交易#Python#新手指南

为什么写这篇文章

2025年底,我开始对量化交易产生兴趣。作为一个写了8年代码的程序员,我以为凭借技术背景可以快速上手。

结果发现:我错了

市面上的资源主要分两类:

  • 学术派:满篇数学公式、随机过程、随机微积分...看完觉得自己智商不够
  • 玄学派:"我用这个指标抓了10倍股"、"主力资金流向揭秘"...看完觉得像算命

我想找的是:工程师视角的量化交易指南

  • 数据从哪来?怎么存?
  • 策略怎么写?用什么语言?
  • 回测怎么做?如何避免过拟合?
  • 风控怎么搞?亏了怎么办?

这篇文章就是我的学习笔记整理。不求暴富,但求真正理解量化交易的工程实践。

先泼冷水:量化的真实面貌

量化不是印钞机

  • 年化收益20%+已经算是优秀(巴菲特长期也就20%左右)
  • 最大回撤30%是常态(你能承受吗?)
  • 90%的散户量化者亏损(和主观交易差不多)
  • 幸存者偏差严重:你看到的都是成功案例,失败者不会晒单

程序员的常见误区

  1. "我有技术优势" → 技术只是基础,市场认知才是核心
  2. "我可以高频套利" → 机构延迟比你低100倍,你竞争不过
  3. "回测好看就能赚钱" → 过拟合会让你在实盘中血本无归
  4. "AI/ML能预测市场" → 如果真这么简单,早就被机构垄断了

第一步:数据获取与存储

A股数据源选择

数据源类型成本更新频率适合场景
TushareAPI免费/付费T+1历史数据+基本面
AkShareAPI免费实时/T+1爬虫式数据采集
BaostockAPI免费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):数据质量决定策略上限

第二步:策略开发框架

策略类型分类

  1. 趋势跟踪型:均线系统、突破策略、动量策略
    → 适合趋势明显的市场,震荡市会反复打脸
  2. 均值回归型:布林带、RSI超卖超买、配对交易
    → 适合震荡市,趋势市会被碾压
  3. 统计套利型:协整关系、因子模型、多因子选股
    → 需要大量数据和统计学知识
  4. 事件驱动型:财报预告、政策变化、概念炒作
    → 需要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,灵活度高喜欢自己造轮子的开发者
ZiplineQuantopian开源,社区大快速原型验证
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%(更保守安全)

# ⚠️ 绝不要满仓梭哈!这是新手最大的死因

止损纪律(铁律)

  1. 固定百分比止损:亏损达到X%无条件离场
  2. ATR止损:基于波动率的动态止损
  3. 时间止损:持有超过N天没有预期走势则离场
  4. 逻辑止损:买入的理由不再成立时离场

组合管理

  • 分散投资:单一标的仓位不超过总资金的10%
  • 低相关性:选择相关性<0.6的资产构建组合
  • 动态再平衡:定期调整权重回到目标配置
  • 最大回撤控制:设定组合级止损线(如-15%)

第五步:实盘执行

交易通道选择

方式门槛费用适合策略
手动交易0万2.5低频(周线级别)
券商API/QMT50万万1-1.5中高频
专业柜台(CTP)期货/高频

自动化执行注意事项

  • 网络异常处理:断网怎么办?订单状态不明怎么办?
  • 限价单vs市价单:流动性不足时限价单可能无法成交
  • 日志记录:每笔交易必须可追溯、可审计
  • 熔断机制:单日亏损超过X%自动停止交易

我的实战经验与教训

2025年的战绩

  • 初始资金:5万元(实验性质,亏得起)
  • 策略数量:测试过12个策略,最终保留3个
  • 年度收益+18.7%(跑赢沪深300的+12.3%)
  • 最大回撤-22.3%(心理压力巨大)
  • 胜率48%(靠盈亏比赚钱,不是靠胜率)

踩过的坑

  1. 过度优化参数:某个策略回测年化80%,实盘第1个月就亏15% → 教训:简单粗暴往往更好
  2. 忽视黑天鹅:2026年初市场暴跌,所有相关性资产一起跌 → 教训:尾部风险必须考虑
  3. 情绪化操作:看到浮亏就慌,提前止损;看到浮盈就拿不住 → 教训:严格执行纪律,去掉人为干预
  4. 数据错误:某次因为复权数据处理错误导致信号全错 → 教训:数据质量检查不能省

给程序员的特别建议

你的优势

  • 能快速实现策略想法(别人还在Excel里算,你已经跑完回测了)
  • 能处理大数据(全A股4000+股票的日线数据轻松应对)
  • 能自动化执行(减少情绪干扰)
  • 能进行系统性研究(而不是凭感觉)

你的劣势

  • 容易陷入技术细节:纠结代码优雅度而忽视策略本身
  • 过度自信:以为聪明就能战胜市场(市场专治各种不服)
  • 缺乏金融直觉:对宏观经济、产业周期、市场情绪不敏感
  • 风险意识不足:习惯了"大不了重部署",但钱亏了就真的没了

学习路径推荐

  1. 基础阶段(1-2个月):学会获取数据 + 写一个简单策略 + 跑通回测
  2. 进阶阶段(2-3个月):学习经典策略(海龟、布林带、因子模型)+ 理解过拟合
  3. 实战阶段(3-6个月):小资金实盘(1-5万)+ 记录每笔交易 + 复盘总结
  4. 优化阶段(持续):根据实盘反馈迭代策略 + 学习新方法(ML/AI应用)

资源推荐

书籍

  • 《量化投资:方法与技术》(入门必读)
  • 《主动投资组合管理》(进阶)
  • 《统计套利》(数学基础好再看)
  • 《打开量化投资的黑箱》(通俗易懂)

在线课程

  • JoinQuant学院(免费,适合入门)
  • RiceQuant研究(高质量研报)
  • 优矿社区(实战案例丰富)

开源项目

  • vnpy(国产量化框架)
  • li>backtrader(灵活的回测引擎) li>empyrical(绩效分析工具)

最后的忠告

量化交易不是致富捷径,它是一门需要持续学习的技艺

作为一个程序员,你有技术优势,但这只是入场券。真正的挑战在于市场理解和风险控制

如果你决定开始:

ol>
  • 先用模拟盘练手3个月(别一上来就真金白银)
  • 从小资金开始(亏光了也不心疼的程度)
  • 做好记录(每笔交易都要有据可查)
  • 保持谦逊(市场永远是对的,错的只能是你)
  • 持续学习(这个领域变化很快,停止学习就被淘汰)

  • 本文基于作者2025-2026年的学习和实践经验整理。所有代码仅供学习参考,不构成投资建议。股市有风险,入市需谨慎。最后更新于2026年5月10日。

    最后更新:2026-05-10
    讨论这篇文章

    这篇文章对你有帮助吗?