跳转到内容

从伪代码到 Python:第一行真实代码

读完三编教程,很多读者会陷入一种微妙的「懂了但手生」的状态:

  • 回测的时间机器逻辑懂了;
  • 收益率、夏普、IC 的手算会算了;
  • 趋势、均值回复、因子的伪代码也能读顺了;
  • 转移矩阵、置换检验、门禁规则的思路也跟上了;
  • 但是打开一个空白的 Python 文件,光标在屏幕上闪烁,第一行到底该写什么?

本篇附录是连接「纸上谈兵」与「上手实操」的脚手架。我们不推荐一上来就啃厚重的第三方专业量化框架,而是用仅 25 行原生 Python + pandas 代码,直接翻译第 4 章与第 7 章的双均线回测逻辑,并告诉你如何免费下载真实的 A 股行情开始动手。

双均线策略的 25 行原生 pandas 实现

Section titled “双均线策略的 25 行原生 pandas 实现”

假设你手里有一张表格 df,包含日期 date 和复权收盘价 close,按时间从早到晚排好序。

下面这段完整的 Python 代码,就可以跑出一个严谨、含扣费、防前视的真实回测:

import numpy as np
import pandas as pd
# 1. 计算均线(第 3、7 章学过的移动平均公式)
df['ma5'] = df['close'].rolling(5).mean()
df['ma20'] = df['close'].rolling(20).mean()
# 2. 生成多空信号(金叉持仓 1,死叉空仓 0)
df['signal'] = np.where(df['ma5'] > df['ma20'], 1, 0)
# 3. 核心防前视阀门:T+1 信号滞后一天成交(绝不可省略!)
# 今日 15:00 收盘计算信号,次日才能以市场价成交买入
df['position'] = df['signal'].shift(1)
# 4. 计算每日基准收益与策略毛收益
df['market_ret'] = df['close'].pct_change()
df['strat_ret'] = df['position'] * df['market_ret']
# 5. 扣除交易成本(双边佣金+印花税+滑点,综合按单边 0.15% 计)
cost_rate = 0.0015
# 仓位发生变动时产生换手(0 变 1 或 1 变 0)
df['trade_volume'] = df['position'].diff().abs()
df['net_ret'] = df['strat_ret'] - df['trade_volume'] * cost_rate
# 6. 复利累乘计算策略累计净值与买入持有基准净值
df['equity_strategy'] = (1 + df['net_ret'].fillna(0)).cumprod()
df['equity_benchmark'] = (1 + df['market_ret'].fillna(0)).cumprod()
  1. rolling(5).mean():对应伪代码中的 MA5=15∑i=04Pt−i\text{MA}_5 = \frac{1}{5}\sum_{i=0}^4 P_{t-i}。pandas 会自动用滑动窗口逐行求均值,前 4 天不足窗口会自动填为 NaN(空值);
  2. np.where(...):对应第 3 章的信号条件函数 sts_t。若快线大于慢线输出 1,否则输出 0;
  3. shift(1) 是整段代码的灵魂:它把整列信号向下平移一行。第 tt 行的持仓 position,取的是第 t−1t-1 行生成的 signal。如果漏写了 .shift(1),你就是在用今日收盘确认的信号去吃今日从开盘到收盘的涨幅——回测年化收益会立刻暴涨到几百甚至上千,但这全是一张废纸。
  4. diff().abs():检测状态切换。从 0 变 1(买入),差值为 +1+1,绝对值为 1;从 1 变 0(卖出),差值为 −1-1,绝对值为 1;维持持仓不变时差值为 0。乘以费率即可精准扣除每次开仓和平仓的摩擦成本;
  5. cumprod():连续乘积 (1+r1)(1+r2)…(1+rt)(1 + r_1)(1 + r_2)\dots(1 + r_t),直接得到账户净值序列,对应第 5 章绩效评估的输入数据。

你看,没有神秘的黑魔法,量化回测的底层不过就是这 20 多行清晰规整的数组运算。

去哪里搞真实的 A 股数据?免费开源数据源推荐

Section titled “去哪里搞真实的 A 股数据?免费开源数据源推荐”

很多初学者卡在「没有数据」这一步。实际上,国内 Python 生态拥有非常成熟且免费的开源数据工具,无需花几万元买专业终端。

1. AkShare(最推荐起步,完全开源无门槛)

Section titled “1. AkShare(最推荐起步,完全开源无门槛)”
  • 特点:纯 Python 开源库,无需注册、无需 token、不限请求次数,数据直接爬取自东方财富、同花顺、新浪财经等公开行情接口;
  • 安装:
    终端窗口
    pip install akshare --upgrade
  • 获取贵州茅台历史前复权日 K 线(只需 3 行代码):
    import akshare as ak
    # 获取 600519 前复权日线
    df = ak.stock_zh_a_hist(
    symbol="600519",
    period="daily",
    start_date="20230101",
    end_date="20241231",
    adjust="qfq", # 前复权,对应第 1 章的复权口径
    )
    print(df[['日期', '开盘', '收盘', '最高', '最低', '成交量']].head())
    拿到这个 df 后,将列名 '收盘' 传给上面的 25 行回测代码,你就完成了人生中第一个用真实 A 股数据驱动的量化回测!
  • 特点:专门面向金融量化的免费数据库,无需 token 积分,自带除权复权因子、分红配股数据,且提供了停牌、ST 等状态标记(非常适合做第 1 章讲的股票池过滤漏斗);
  • 官网:http://baostock.com;
  • 安装:pip install baostock。
  • 特点:国内最早、最成熟的量化数据社区,接口极为丰富规范,涵盖财务报表、宏观经济、行业分类等(适合做第 10 章的多因子分析);
  • 注意:采用积分制,基础日线免费,高阶逐笔和深度财务数据需要通过社区签到、高校学生认证或赞助获取积分。

从极简脚本到专业量化的进阶地图

Section titled “从极简脚本到专业量化的进阶地图”

当你跑通了上面的 25 行代码,并在真实股票上画出了第一条净值曲线后,你已经正式跨过了量化的大门。接下来的进阶路径非常明确:

  1. 台阶 1:掌握向量化工具箱(pandas / numpy)
    • 熟练使用 rolling、expanding、shift、pct_change、groupby;
    • 练习用几行代码算出最大回撤、夏普比率和月度分组收益。
  2. 台阶 2:拥抱事件驱动回测框架
    • 当你的策略需要同时管理 100 只股票、动态调仓、考虑每只股票的挂单成交量上限时,向量化脚本会变得捉襟见肘;
    • 此时可以学习主流的开源事件驱动框架,如 Backtrader(经典、生态成熟)或国内开源的 rqalpha / vn.py;
    • 了解框架内部是如何把我们第 4 章讲的「时间机器循环」工程化落地的。
  3. 台阶 3:走向专业机构级投研体系
    • 学习真正严肃的量化工程:严格的 PIT(点截面)财务数据防未来函数、量化门禁系统、组合优化求解与风险模型。
    • 这部分进阶知识,可以在本仓库的后续体系中继续深造:
      • learn1:从仓库五个真实量化工程项目中提炼的体系课(涵盖 A 股回测工程、特征工程、机器学习边界与风控);
      • learn2:以 Conditional Alpha 研究仓为蓝本的真实实验编年史(从假设预登记到样本外验证的全流程实录)。

伪代码帮你打牢了思维的地基,Python 赋予了你探索数据的工具。不要害怕报错,去下载一段历史数据,敲下你的第一行策略代码吧!