第 1 章:量化投资概述与环境搭建¶
1.1 量化投资的定义与特征¶
量化投资 (Quantitative Investment) 是指借助现代统计学和数学方法,利用计算机技术从海量历史数据中寻找能够带来超额收益的多种“大概率”策略,并纪律严明地按照这些策略进行投资决策的过程。
与定性投资(Fundamental Investing)相比,量化投资具有以下显著特征:
- 纪律性 (Discipline):严格执行模型给出的信号,克服人性的贪婪与恐惧。
- 系统性 (Systematic):多层次(资产配置、行业选择、个股选择)、多角度(宏观、估值、成长、技术)地观察市场。
- 套利思想 (Arbitrage):寻找市场定价偏差,通过买入低估资产、卖出高估资产获利。
- 概率取胜 (Probability):不追求单笔交易的暴利,而是追求在大概率获利的策略下,通过长期重复交易积累财富。
1.1.1 核心流程 (Workflow)¶
一个标准的量化投资系统通常包含以下四个核心模块:
- 数据 (Data):
- 采集:从交易所、数据商获取行情、财务、舆情等数据。
- 清洗:处理缺失值、异常值,统一数据格式(ETL)。
- 策略 (Strategy):
- 建模:基于金融逻辑或机器学习算法,构建交易信号。
- 回测:在历史数据上验证策略的有效性。
- 交易 (Execution):
- 撮合:模拟交易所的撮合机制(回测阶段)。
- 报单:将策略信号转化为具体的买卖指令发送至柜台(实盘阶段)。
- 风控 (Risk Control):
- 事前:限制单笔最大下单量、持仓集中度。
- 事中:实时监控敞口风险、流动性风险。
- 事后:归因分析,评估策略表现。
1.1.2 理论基础:从 CAPM 到多因子¶
量化投资的理论基石是 现代投资组合理论 (MPT) 和 资本资产定价模型 (CAPM)。
根据 CAPM,投资组合的预期收益率 \(E(R_p)\) 可以分解为:
其中:
- \(R_f\):无风险收益率(Risk-Free Rate),通常以国债收益率为锚。
- \(\beta_p (E(R_m) - R_f)\):市场收益 (Beta)。\(\beta\) 衡量了组合对市场波动的敏感度。这是被动承担市场风险所获得的补偿。
- \(\alpha_p\):超额收益 (Alpha)。这是剔除市场因素后,由投资经理的主动管理能力带来的收益。
量化投资的核心目标,通常是在控制 Beta 风险(甚至将 Beta 对冲至 0)的前提下,追求稳定且可持续的 Alpha 收益。
1.1.3 有效市场假说 (EMH)¶
尤金·法玛 (Eugene Fama) 提出的 有效市场假说 (Efficient Market Hypothesis) 认为,如果在一个证券市场中,价格完全反映了所有可以获得的信息,那么就称这样的市场为有效市场。
- 弱式有效:价格已反映所有历史信息(技术分析无效)。
- 半强式有效:价格已反映所有公开信息(基本面分析无效)。
- 强式有效:价格已反映所有信息,包括内幕信息(所有分析均无效)。
量化投资的前提是市场并非“强式有效”。我们通过挖掘市场微观结构中的非理性行为或信息不对称,寻找定价偏差(Mispricing)并从中获利。
1.3 行为金融学 (Behavioral Finance)¶
传统金融学假设投资者是理性的 (Rational),但现实中,人是情感驱动的。行为金融学揭示了导致市场无效的心理学根源。
-
前景理论 (Prospect Theory):
- 由 Kahneman 和 Tversky 提出。人对损失的厌恶程度是对收益喜好程度的 2-2.5 倍。
- 现象:投资者倾向于过早止盈(落袋为安),但死扛亏损(不愿意承认错误)。这解释了为什么动量策略(追涨杀跌)长期有效。
-
过度自信 (Overconfidence):
- 投资者往往高估自己的信息优势和预测能力。
- 现象:导致过度交易 (Over-trading),推高了成交量和波动率,却降低了净收益。
-
羊群效应 (Herd Behavior):
- 投资者倾向于模仿他人的行为,通过随大流来获得安全感。
- 现象:导致资产价格泡沫的形成和破裂。
1.4 市场微观结构基础 (Market Microstructure)¶
宏观分析关注 GDP 和利率,微观结构关注价格是如何形成的。
1.4.1 限价订单簿 (Limit Order Book, LOB)¶
在指令驱动市场(如 A 股),所有未成交的限价单按照价格优先、时间优先的原则排列,形成 LOB。
- 买一 (Bid 1):当前最高的买入价。
- 卖一 (Ask 1):当前最低的卖出价。
- 买卖价差 (Bid-Ask Spread):\(Ask 1 - Bid 1\)。衡量流动性的核心指标。价差越小,流动性越好,交易成本越低。
1.4.2 市场深度 (Market Depth)¶
指在特定价格水平上可交易的数量。深度越好,大单交易对价格的冲击 (Market Impact) 越小。
1.4.3 价格发现 (Price Discovery)¶
价格不是连续的曲线,而是通过买卖力量的博弈(吃单)瞬间跳变的。量化高频策略正是通过分析 LOB 的微观失衡(如大单压顶、撤单率)来预测短时间内的价格方向。
1.5 量化与主观的融合 (Quantamental)¶
Quantamental = Quant + Fundamental。
- 量化 (Quant):擅长广度。能同时扫描 5000 只股票,处理海量数据,纪律性强,但对突发事件(如战争、政策突变)反应迟钝。
- 主观 (Fundamental):擅长深度。能深入调研一家公司,理解商业模式和管理层,但覆盖面窄,易受情绪影响。
未来的趋势是二者的融合:
- 量化赋能主观:用量化模型筛选出初选池,再由研究员深入调研。
- 主观赋能量化:将研究员的逻辑(如供应链关系、行业景气度)转化为量化因子,增强模型的可解释性和适应性。
1.6 开发环境搭建¶
为了进行量化研究,我们需要搭建一套高效的开发环境。本教材推荐使用 Python + Rust 的混合架构。
1.6.1 Python 环境 (Miniconda)¶
Python 是量化领域最主流的语言,拥有丰富的生态库(Pandas, NumPy, Scikit-learn)。我们推荐使用 Miniconda 来管理 Python 环境。
国内镜像加速: 1. 下载加速:推荐从清华大学开源软件镜像站下载安装包:https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/ 2. 配置 Conda 源:安装完成后,在终端执行以下命令以加速包的下载:
安装完成后,打开终端(Windows 用户请打开 Anaconda Powershell Prompt,macOS/Linux 用户请打开 Terminal),创建一个新的环境:
1.6.2 安装 AKQuant¶
akquant 是一个基于 Rust 核心的高性能事件驱动量化回测框架。它结合了 Rust 的极致速度与 Python 的生态易用性,专为追求高性能回测与实盘一体化的量化开发者设计。
核心特性:
- Rust 驱动的高性能:底层撮合引擎、订单管理系统 (OMS) 和风控模块 (RMS) 均由 Rust 编写,彻底告别 Python 的 GIL 锁限制,回测速度比纯 Python 框架快 10-100 倍。
- 事件驱动架构 (Event-Driven):不同于简单的向量化回测,
akquant采用严格的时间序列事件驱动模型,能够精确模拟限价单 (Limit Order)、止损单 (Stop Order) 以及复杂的成交撮合逻辑,杜绝“未来函数”。 - 全资产覆盖:原生支持 股票 (Stock)、期货 (Futures)、期权 (Options) 及 基金 (Fund) 等多种金融资产,并针对 A 股的 T+1 制度和涨跌停机制做了深度适配。
- 回测实盘一体化:坚持 "Code Once, Run Anywhere" 理念。同一套策略代码,既可以在历史数据上回测,也可以直接切换到 CTP/XTP 等实盘接口进行交易。
在激活的 conda 环境中,运行以下命令安装(建议使用清华源加速):
akquant: 高性能事件驱动量化框架。作为本课程的核心,它提供了回测引擎、订单管理、风控模块等全套基础设施,让用户只需专注于编写策略逻辑 (Strategy)。akshare: 强大的开源财经数据接口库。它专为 Python 量化交易员设计,提供了从股票、期货、期权、基金到宏观经济、另类数据等全方位的金融数据获取能力。其完全开源、免费且持续更新的特性,使其成为国内量化社区的首选数据源。pandas: Python 数据分析标准库。在量化中,它几乎无处不在:我们用DataFrame存储历史行情,用Series计算技术指标,用Timestamp处理时间序列。掌握 Pandas 是成为量化开发者的第一道门槛。matplotlib: 基础绘图库。量化不仅是数字的游戏,更是图形的艺术。我们使用 Matplotlib 绘制资金曲线、K 线图和技术指标,直观地评估策略表现。此外,akquant内置的绘图功能也是基于它构建的。
1.6.3 IDE 选择 (Trae / VS Code / PyCharm)¶
1. Trae (AI Native IDE) - 强烈推荐¶
Trae 是字节跳动推出的一款 AI 原生 IDE,内置了强大的 AI 编程助手。
- Context7 深度集成:能够理解你的整个项目上下文,准确回答关于
akquant架构的问题。 - 智能代码补全:根据你的策略逻辑,自动补全
on_bar中的代码。 - 一键重构:帮你把复杂的 Python 循环重构为高效的 Pandas 向量化操作。
2. Visual Studio Code (VS Code)¶
微软出品的轻量级编辑器,插件生态极其丰富。
- 推荐插件:Python, Pylance, Jupyter, Markdown All in One。
- 优点:启动快,资源占用低,远程开发 (Remote-SSH) 体验极佳。
3. PyCharm¶
JetBrains 出品的专业 Python IDE。
- 优点:代码分析能力最强,重构功能极其强大,调试体验好。
- 版本选择:初学者可以使用免费的 Community 版;Professional 版 额外支持 Jupyter Notebook、科学绘图和远程开发功能,适合进阶用户。
1.7 第一个量化策略 (Hello World)¶
让我们通过一个简单的例子来体验 akquant 的工作流程。我们将编写一个简单的策略:买入并持有。
代码示例¶
创建一个名为 quickstart.py 的文件,输入以下代码:
"""
第 1 章:快速开始 (Quickstart).
本示例演示了使用 AKQuant 进行量化回测的最基础流程。
为了展示真实的交易结果,我们将实现一个经典的**双均线策略 (Dual Moving Average)**。
策略逻辑:
1. 计算 5 日均线 (MA5) 和 20 日均线 (MA20)。
2. 金叉买入:当 MA5 上穿 MA20,且当前无持仓时,满仓买入。
3. 死叉卖出:当 MA5 下穿 MA20,且当前有持仓时,清仓卖出。
"""
import akquant as aq
import akshare as ak
import pandas as pd
from akquant import Bar, Strategy
def get_data() -> pd.DataFrame:
"""
步骤 1: 数据获取.
使用 akshare 获取浦发银行 (600000) 的历史日线数据。
"""
print("正在获取数据...")
# 获取前复权数据
df = ak.stock_zh_a_daily(
symbol="sh600000", start_date="20200101", end_date="20231231", adjust="qfq"
)
df["symbol"] = "600000"
if "date" not in df.columns:
df = df.reset_index().rename(columns={"index": "date"})
return df # type: ignore
class DualMAStrategy(Strategy):
"""
步骤 2: 策略定义.
双均线策略实现。
"""
def __init__(self) -> None:
"""策略初始化."""
super().__init__()
self.short_window = 5
self.long_window = 20
self.warmup_period = 20
def on_start(self) -> None:
"""策略初始化时调用."""
print("策略初始化...")
def on_bar(self, bar: Bar) -> None:
"""核心交易逻辑."""
symbol = bar.symbol
# 1. 获取历史数据
closes = self.get_history(
count=self.long_window + 1, symbol=symbol, field="close"
)
if len(closes) < self.long_window + 1:
return
# 2. 计算均线 (使用截止到昨天的数据)
history_closes = closes[:-1]
ma5_curr = history_closes[-self.short_window :].mean()
ma20_curr = history_closes[-self.long_window :].mean()
# 3. 获取持仓
position = self.get_position(symbol)
# 4. 交易信号
if ma5_curr > ma20_curr and position == 0:
print(
f"[{bar.timestamp_str}] 金叉买入 (MA5={ma5_curr:.2f}, "
f"MA20={ma20_curr:.2f})"
)
self.order_target_percent(0.95, symbol)
elif ma5_curr < ma20_curr and position > 0:
print(
f"[{bar.timestamp_str}] 死叉卖出 (MA5={ma5_curr:.2f}, "
f"MA20={ma20_curr:.2f})"
)
self.order_target_percent(0.0, symbol)
if __name__ == "__main__":
# 1. 准备数据
df = get_data()
# 2. 运行回测
print("开始回测...")
result = aq.run_backtest(
strategy=DualMAStrategy,
data=df,
initial_cash=100_000,
commission_rate=0.0003,
stamp_tax_rate=0.001,
lot_size=100,
)
# 3. 打印结果
print("\n" + "=" * 30)
print("回测结果摘要")
print("=" * 30)
print(result)
代码解析¶
-
数据准备: 我们使用
akshare获取了sh600000(浦发银行) 等几只股票的历史数据。akquant支持直接传入 Pandas DataFrame。 -
策略定义 (
MyStrategy):- 继承自
akquant.Strategy。 on_bar(self, bar):这是策略的核心。回测引擎会按时间顺序,每产生一根 K 线(Bar),就调用一次该函数。self.order_target_percent(target_percent=0.33, symbol=symbol):下单函数,将仓位调整到目标比例(这里是 33%)。
- 继承自
-
回测配置与运行:
BacktestConfig:配置回测参数(如手续费、初始资金)。aq.run_backtest:启动回测引擎。
运行结果¶
在终端运行该脚本:
你将看到类似以下的输出日志:
正在获取数据...
开始回测...
2026-02-24 20:29:07 | INFO | Running backtest via run_backtest()...
[2020-01-02 00:00:00] 首次买入 600000,目标仓位 95%
[00:00:00] [########################################] 970/970 (0s)
==============================
回测结果摘要
==============================
BacktestResult:
Value
start_time 2020-01-02 00:00:00+08:00
end_time 2023-12-29 00:00:00+08:00
duration 1457 days, 0:00:00
total_bars 970
trade_count 0.0
initial_market_value 100000.0
end_market_value 66014.3989
total_pnl 0.0
unrealized_pnl -33957.0
total_return_pct -33.985601
annualized_return -0.098809
volatility 0.168118
total_profit 0.0
total_loss 0.0
total_commission 28.6011
max_drawdown 36630.0
max_drawdown_pct 36.568054
win_rate 0.0
sharpe_ratio -0.587735
calmar_ratio -0.270206
注:由于浦发银行 (600000) 在 2020-2023 年表现不佳,简单的买入持有策略并未盈利。但这正是回测的意义——验证策略在历史上的表现。
结果解析¶
下表详细解释了回测结果中的各项核心指标。这些指标的计算逻辑均基于 akquant 源码实现。
| 指标 (Metric) | 含义 (Meaning) | 计算公式 / 逻辑 | 评价标准 |
|---|---|---|---|
| Total Return Pct (累计收益率) |
策略从开始到结束的总收益百分比。 | \(\frac{\text{Final Value} - \text{Initial Cash}}{\text{Initial Cash}} \times 100\%\) | 越高越好。正值代表盈利,负值代表亏损。 |
| Annualized Return (年化收益率) |
策略的复合年均增长率 (CAGR)。 | \((1 + R_{total})^{\frac{1}{Years}} - 1\) 注:将累计收益平摊到每一年,便于与其他理财产品比较。 |
> 10% 优秀 > 20% 卓越 |
| Max Drawdown Pct (最大回撤率) |
策略在任一时间点,从历史最高点 (Peak) 到当前点的最大跌幅。 | \(\max_{t} \frac{\text{Peak}_t - \text{Value}_t}{\text{Peak}_t} \times 100\%\) 注:这是衡量风险最直观的指标。 |
< 10% 优秀 < 20% 良好 > 30% 风险较高 |
| Sharpe Ratio (夏普比率) |
衡量每承担一单位总风险(波动率),能获得多少超额收益。 | \(\frac{R_{annual} - R_{free}}{\sigma_{annual}}\) 注:\(R_{free}\) 默认为 0,\(\sigma_{annual}\) 为年化波动率。 |
> 1.0 良好 > 2.0 优秀 < 0 不如空仓 |
| Calmar Ratio (卡玛比率) |
衡量收益与最大回撤的比值,即“性价比”。 | $\frac{R_{annual}}{ | \text{Max Drawdown} |
| Volatility (年化波动率) |
收益率标准差的年化值,反映策略的稳定性。 | \(\sigma_{daily} \times \sqrt{252}\) | 越低越稳定。 |
| Win Rate (胜率) |
盈利交易次数占总交易次数的比例。 | \(\frac{\text{Winning Trades}}{\text{Total Trades}}\) | 取决于策略类型。趋势策略通常胜率低但盈亏比高。 |
通过这个简单的 "Hello World",我们跑通了量化回测的全流程:数据 -> 策略 -> 回测 -> 结果。
恭喜! 你已经完成了量化投资的第一步。在下一章中,我们将深入探讨数据的获取与处理,这是量化大厦的基石。