从伪代码到 Python:第一行真实代码
读完三编教程,很多读者会陷入一种微妙的「懂了但手生」的状态:
- 回测的时间机器逻辑懂了;
- 收益率、夏普、IC 的手算会算了;
- 趋势、均值回复、因子的伪代码也能读顺了;
- 转移矩阵、置换检验、门禁规则的思路也跟上了;
- 但是打开一个空白的 Python 文件,光标在屏幕上闪烁,第一行到底该写什么?
本篇附录是连接「纸上谈兵」与「上手实操」的脚手架。我们不推荐一上来就啃厚重的第三方专业量化框架,而是用仅 25 行原生 Python + pandas 代码,直接翻译第 4 章与第 7 章的双均线回测逻辑,并告诉你如何免费下载真实的 A 股行情开始动手。
双均线策略的 25 行原生 pandas 实现
Section titled “双均线策略的 25 行原生 pandas 实现”假设你手里有一张表格 df,包含日期 date 和复权收盘价 close,按时间从早到晚排好序。
下面这段完整的 Python 代码,就可以跑出一个严谨、含扣费、防前视的真实回测:
import numpy as npimport 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()关键代码逐行对照
Section titled “关键代码逐行对照”rolling(5).mean():对应伪代码中的 。pandas 会自动用滑动窗口逐行求均值,前 4 天不足窗口会自动填为NaN(空值);np.where(...):对应第 3 章的信号条件函数 。若快线大于慢线输出 1,否则输出 0;shift(1)是整段代码的灵魂:它把整列信号向下平移一行。第 行的持仓position,取的是第 行生成的signal。如果漏写了.shift(1),你就是在用今日收盘确认的信号去吃今日从开盘到收盘的涨幅——回测年化收益会立刻暴涨到几百甚至上千,但这全是一张废纸。diff().abs():检测状态切换。从 0 变 1(买入),差值为 ,绝对值为 1;从 1 变 0(卖出),差值为 ,绝对值为 1;维持持仓不变时差值为 0。乘以费率即可精准扣除每次开仓和平仓的摩擦成本;cumprod():连续乘积 ,直接得到账户净值序列,对应第 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 股数据驱动的量化回测!
2. BaoStock(证券宝)
Section titled “2. BaoStock(证券宝)”- 特点:专门面向金融量化的免费数据库,无需 token 积分,自带除权复权因子、分红配股数据,且提供了停牌、ST 等状态标记(非常适合做第 1 章讲的股票池过滤漏斗);
- 官网:http://baostock.com;
- 安装:
pip install baostock。
3. Tushare
Section titled “3. Tushare”- 特点:国内最早、最成熟的量化数据社区,接口极为丰富规范,涵盖财务报表、宏观经济、行业分类等(适合做第 10 章的多因子分析);
- 注意:采用积分制,基础日线免费,高阶逐笔和深度财务数据需要通过社区签到、高校学生认证或赞助获取积分。
从极简脚本到专业量化的进阶地图
Section titled “从极简脚本到专业量化的进阶地图”当你跑通了上面的 25 行代码,并在真实股票上画出了第一条净值曲线后,你已经正式跨过了量化的大门。接下来的进阶路径非常明确:
- 台阶 1:掌握向量化工具箱(pandas / numpy)
- 熟练使用
rolling、expanding、shift、pct_change、groupby; - 练习用几行代码算出最大回撤、夏普比率和月度分组收益。
- 熟练使用
- 台阶 2:拥抱事件驱动回测框架
- 当你的策略需要同时管理 100 只股票、动态调仓、考虑每只股票的挂单成交量上限时,向量化脚本会变得捉襟见肘;
- 此时可以学习主流的开源事件驱动框架,如 Backtrader(经典、生态成熟)或国内开源的 rqalpha / vn.py;
- 了解框架内部是如何把我们第 4 章讲的「时间机器循环」工程化落地的。
- 台阶 3:走向专业机构级投研体系
- 学习真正严肃的量化工程:严格的 PIT(点截面)财务数据防未来函数、量化门禁系统、组合优化求解与风险模型。
- 这部分进阶知识,可以在本仓库的后续体系中继续深造:
learn1:从仓库五个真实量化工程项目中提炼的体系课(涵盖 A 股回测工程、特征工程、机器学习边界与风控);learn2:以 Conditional Alpha 研究仓为蓝本的真实实验编年史(从假设预登记到样本外验证的全流程实录)。
伪代码帮你打牢了思维的地基,Python 赋予了你探索数据的工具。不要害怕报错,去下载一段历史数据,敲下你的第一行策略代码吧!