查看全课大纲(第 1 / 59 节)
- 1.量化投资必备基础知识
- 2.趋势型策略及模型原理
- 3.均值回复型策略及模型原理
- 4.配对交易策略及模型原理
- 5.量化策略研发流程与基本技能
- 6.常用的量化平台概述及如何选择
- 7.如何量化一个主观策略思路
- 8.常用技术指标及指标计算过程
- 9.如何编写指标代码
- 10.指标的物理意义
- 11.技术指标的应用技巧
- 12.更多的交易决策
- 13.编写程序去量化一个趋势型技术指标
- 14.编写趋势型技术指标的性能评价
- 15.策略对交易成本和持仓周期的影响
- 16.股票池策略的原理及基本框架
- 17.基于多因子分析的股票池设计与实现
- 18.股票池的性能评估
- 19.使用定制化财务因子构建股票池
- 20.趋势型策略原理及股票池机制的设计
- 21.趋势型择时信号的设计方法与编程实现
- 22.趋势型策略的回测与性能评估
- 23.优化趋势型策略的思路及方法
- 24.量化体系中的风险控制思想
- 25.风险的度量-波动率
- 26.常用的风险控制方法
- 27.实现止盈止损模块以提高策略性能
- 28.策略性能的评估与优化
- 29.探讨波动率与风险的关系
- 30.量化策略中的经典资金管理模型
- 31.用python编程实现资金管理模块
- 32.构建一个完善的量化交易策略
- 33.趋势型量化策略必备的期货知识
- 34.期货量化工具介绍
- 35.商品期货趋势型策略原理
- 36.用TB编写商品期货趋势型策略(上)
- 37.用TB编写商品期货趋势型策略(下)
- 38.分析优化商品期货趋势型策略的方法思路
- 39.期货交易策略的注意事项
- 40.均值回复型策略的原理
- 41.A股市场有没有稳定的均值回复效应?
- 42.编写一个均值回复型股票量化策略
- 43.编写多空组合策略进行策略改进
- 44.在策略中实现头寸管理进行策略优化
- 45.套利策略原理及常见套利类型
- 46.用MC开发一个跨品种套利交易策略(上)
- 47.用MC开发一个跨品种套利交易策略(下)
- 48.统计套利之股票配对交易策略
- 49.实盘中的细节问题:加减仓
- 50.关于高频交易
- 51.如何评价实盘量化策略的性能
- 52.量化系统的工作过程及研发流程
- 53.运气or实力
- 54.量化实盘交易需要满足什么条件
- 55.未来函数的坑
- 56.实盘数据接口异常的自动报警
- 57.交易系统的压力测试
- 58.自动运行的交易策略,什么时候需要人工干预
- 59.预案准备和实盘心理建设
量化投资必备基础知识
约 16 分钟
小象实战讲义 · 进阶量化交易实战:迭代式的量化策略研发 本讲义仅用于编程与量化方法教学,不构成任何投资建议。
在进入进阶量化交易策略研发之前,系统化梳理全市场多资产类别的微观交易机制是构建坚实量化体系的第一步。与单一股票多头不同,进阶量化交易覆盖了股票、ETF、商品期货、股指期货、期权、债券以及外汇等多维资产谱系。不同资产在保证金杠杆、交易时间、多空双向机制与清算交割规则上的差异,直接决定了量化策略在资产配置、风险平价与统计套利中的数学表达与工程架构。
💡 核心导读
- 进阶量化覆盖的七大核心资产微观特征:
- 股票(Stocks):T+1 现货交易、全额资金占用、依赖多因子选股与截面 Alpha 提取;
- ETF(交易型开放式指数基金):一二级市场套利(Creation/Redemption)、T+0/T+1 混合交易机制、跟踪宽基与行业指数;
- 商品期货(Commodity Futures):多空双向、T+0 交易、保证金杠杆、主力合约换月移仓(Roll Yield);
- 股指期货(Index Futures):IF/IC/IM/IH 对冲工具、负基差与升贴水结构、系统性风险完全中性化;
- 期权(Options):非线性收益结构、希腊字母风险对冲(Delta/Gamma/Vega/Theta);
- 债券与利率衍生品(Bonds):固定收益底层资产、久期与凸性管理;
- 外汇(FX):24 小时全球连续交易、高流动性与宏观基本面驱动。
- 主观投资向定量算法转化的核心思维跃迁:
- 多资产分散配置的量化数学本质:
- 利用不同资产间的低相关性或负相关性(),在保持预期收益的同时大幅压缩组合整体方差与最大回撤。
┌─────────────────────────────────────────────────────────────┐
│ 进阶量化全市场多资产交互拓扑图 │
└──────────────────────────────┬──────────────────────────────┘
│
┌───────────────┬─────────────┼─────────────┬───────────────┐
▼ ▼ ▼ ▼ ▼
┌─────────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌─────────────┐
│ 股票 (Alpha)│ │ 指数/商品 │ │ 股指期货 │ │期权/衍生品│ │ 固收与外汇 │
├─────────────┤ ├───────────┤ ├───────────┤ ├───────────┤ ├─────────────┤
│ • 多因子选股│ │ • 行业 ETF│ │ • 空头对冲│ │•波动率套利│ │ • 利率债底仓│
│ • 基本面财务│ │ • 趋势跟踪│ │ • 锁定Beta│ │•尾部防黑天│ │ • 宏观对冲 │
└─────────────┘ └───────────┘ └───────────┘ └───────────┘ └─────────────┘一、主观投资与量化投资的工程转化路径
主观交易者常说”在市场恐慌、放量探底时分批建仓”,在量化工程中必须将其逐字分解为无歧义的逻辑表达式:
- 恐慌度量:过去 20 日历史波动率位于过去 1 年的 95% 分位数以上();
- 放量确认:当日成交量大于 20 日平均成交量的 2.5 倍();
- 探底定义:收盘价跌破布林下轨且 RSI 进入超卖区();
- 分批建仓:基于凯利公式与 ATR 动态头寸,首批建仓 20% 预算,随后每回撤 追加 20%。
import pandas as pd
import numpy as np
def quantify_subjective_buy_condition(df):
"""
将主观'放量恐慌探底'转化为严格的量化判定布尔信号(历史模式,存在未来函数与过拟合风险)
"""
# 1. 均量与成交量放量
vma20 = df['volume'].rolling(20).mean()
is_huge_volume = df['volume'] > (2.5 * vma20)
# 2. 价格跌破布林下轨
ma20 = df['close'].rolling(20).mean()
std20 = df['close'].rolling(20).std()
boll_lower = ma20 - 2.0 * std20
is_price_oversold = df['close'] < boll_lower
# 3. 恐慌放量探底综合信号
buy_trigger = is_huge_volume & is_price_oversold
return buy_trigger
# 合成价格与成交量数据(历史回测样例,不代表未来表现)
rng = np.random.default_rng(42)
dates = pd.date_range(start='2023-01-01', periods=100, freq='D')
base_price = 100 + np.cumsum(rng.normal(0, 1, 100))
base_volume = 1000000 + rng.normal(0, 200000, 100).astype(int)
# 在第80-85日附近构造一个“恐慌探底”场景
base_price[80:86] = base_price[80:86] * 0.85 # 价格下跌
base_volume[83] = base_volume.mean() * 3.5 # 第84日放量
df_demo = pd.DataFrame({
'close': base_price,
'volume': base_volume
}, index=dates)
# 计算信号
signals = quantify_subjective_buy_condition(df_demo)
signal_dates = signals[signals].index
print("===== 主观交易逻辑的量化信号生成 =====")
print(f"数据日期范围: {df_demo.index[0].date()} 至 {df_demo.index[-1].date()}")
print(f"生成量化买入信号的天数: {signals.sum()}")
if not signal_dates.empty:
print("信号触发日期:")
for d in signal_dates:
print(f" - {d.date()}: 收盘价={df_demo.loc[d, 'close']:.2f}, 成交量={df_demo.loc[d, 'volume']:,}")
else:
print("信号触发日期: 无")
print("注:合成数据用于演示逻辑,实盘需警惕未来函数与参数过拟合。")===== 主观交易逻辑的量化信号生成 =====
数据日期范围: 2023-01-01 至 2023-04-10
生成量化买入信号的天数: 1
信号触发日期:
- 2023-03-25: 收盘价=85.94, 成交量=3,492,557
注:合成数据用于演示逻辑,实盘需警惕未来函数与参数过拟合。二、多资产组合的协方差与夏普优化
在多资产配置中,投资组合的方差由资产权重与协方差矩阵共同决定:
通过将低相关的股票、商品期货与债券进行风险平价配置,能够显著提升组合的夏普比率。
import numpy as np
def calculate_portfolio_metrics(weights, expected_returns, cov_matrix):
"""
计算多资产组合的预期年化收益率与年化波动率(基于历史统计,预期收益存在不确定性)
"""
w = np.array(weights)
port_return = np.sum(w * expected_returns) * 252.0
port_volatility = np.sqrt(np.dot(w.T, np.dot(cov_matrix * 252.0, w)))
return port_return, port_volatility
# 合成三资产场景:股票(S)、债券(B)、商品(C)
rng = np.random.default_rng(2024)
# 预期日收益率(历史均值)
exp_returns_daily = np.array([0.0008, 0.0002, 0.0005]) # S, B, C
# 年化协方差矩阵(基于历史日收益率计算)
cov_daily = np.array([
[0.0004, 0.00002, 0.00005],
[0.00002, 0.000025, -0.00001],
[0.00005, -0.00001, 0.0003]
])
cov_annual = cov_daily * 252.0
# 定义两个投资组合
weights_a = [0.6, 0.3, 0.1] # 激进型
weights_b = [0.3, 0.5, 0.2] # 稳健型
ret_a, vol_a = calculate_portfolio_metrics(weights_a, exp_returns_daily, cov_daily)
ret_b, vol_b = calculate_portfolio_metrics(weights_b, exp_returns_daily, cov_daily)
print("===== 多资产组合收益与风险测算 =====")
print(f"资产预期年化收益率: S={exp_returns_daily[0]*252*100:.2f}%, B={exp_returns_daily[1]*252*100:.2f}%, C={exp_returns_daily[2]*252*100:.2f}%")
print("\n组合A (60% S, 30% B, 10% C):")
print(f" 预期年化收益率: {ret_a*100:.2f}%")
print(f" 预期年化波动率: {vol_a*100:.2f}%")
print(f" 预期夏普比率(无风险利率2%): {(ret_a - 0.02) / (vol_a + 1e-8):.2f}")
print("\n组合B (30% S, 50% B, 20% C):")
print(f" 预期年化收益率: {ret_b*100:.2f}%")
print(f" 预期年化波动率: {vol_b*100:.2f}%")
print(f" 预期夏普比率(无风险利率2%): {(ret_b - 0.02) / (vol_b + 1e-8):.2f}")
print("\n注:基于历史统计的预期,市场结构变化可能导致结果偏离。")===== 多资产组合收益与风险测算 =====
资产预期年化收益率: S=20.16%, B=5.04%, C=12.60%
组合A (60% S, 30% B, 10% C):
预期年化收益率: 14.87%
预期年化波动率: 20.20%
预期夏普比率(无风险利率2%): 0.64
组合B (30% S, 50% B, 20% C):
预期年化收益率: 11.09%
预期年化波动率: 12.72%
预期夏普比率(无风险利率2%): 0.71
注:基于历史统计的预期,市场结构变化可能导致结果偏离。📝 动手练一练
下面我们用 Python 编写一段 多资产量化投资组合收益与风险测算引擎,模拟股票、商品期货与债券三类低相关资产在 50%/30%/20% 固定配比下的组合收益、波动率与夏普比率测算:
import pandas as pd
import numpy as np
def calculate_multi_asset_portfolio(weights, returns_df):
"""
多资产量化配置收益与风险测算器(历史回测,存在幸存者偏差与过拟合风险)
- 股票 (Stock), 商品期货 (Futures), 债券基金 (Bonds)
"""
w = np.array(weights)
cov_matrix = returns_df.cov() * 252.0
port_ret = np.sum(returns_df.mean() * w) * 252.0
port_vol = np.sqrt(np.dot(w.T, np.dot(cov_matrix, w)))
sharpe = (port_ret - 0.02) / (port_vol + 1e-6)
return {
"Annual_Return": port_ret,
"Annual_Volatility": port_vol,
"Sharpe_Ratio": sharpe
}
# 合成三类低相关资产日收益率序列
rng = np.random.default_rng(12345)
dates = pd.date_range("2023-01-01", periods=252, freq="B") # 约一年交易日
# 生成具有不同风险收益特征与相关性的序列
# 股票:中等收益,高波动
r_stock = rng.normal(0.0006, 0.018, 252)
# 商品期货:低收益,中等波动,与股票弱正相关
r_futures = 0.3 * r_stock + rng.normal(0.0002, 0.014, 252)
# 债券:低收益低波动,与股票弱负相关
r_bonds = -0.1 * r_stock + rng.normal(0.0001, 0.004, 252)
# 引入一段模拟回撤期(第150-200日)
r_stock[150:200] = r_stock[150:200] - 0.002
r_futures[150:200] = r_futures[150:200] - 0.0015
returns_df = pd.DataFrame({
'Stock': r_stock,
'Futures': r_futures,
'Bonds': r_bonds
}, index=dates)
# 测试两个配置方案
weights_1 = [0.5, 0.3, 0.2] # 均衡偏股
weights_2 = [0.2, 0.3, 0.5] # 稳健偏债
res1 = calculate_multi_asset_portfolio(weights_1, returns_df)
res2 = calculate_multi_asset_portfolio(weights_2, returns_df)
print("================ 多资产量化投资组合测算 ================")
print(f"回测期: {returns_df.index[0].date()} 至 {returns_df.index[-1].date()} ({len(returns_df)}个交易日)")
print(f"资产历史年化波动率: S={returns_df['Stock'].std()*np.sqrt(252)*100:.2f}%, F={returns_df['Futures'].std()*np.sqrt(252)*100:.2f}%, B={returns_df['Bonds'].std()*np.sqrt(252)*100:.2f}%")
print(f"股票-期货相关性: {returns_df[['Stock', 'Futures']].corr().iloc[0,1]:.3f}")
print(f"股票-债券相关性: {returns_df[['Stock', 'Bonds']].corr().iloc[0,1]:.3f}")
print("\n--- 配置方案对比 ---")
print("方案A (50% S, 30% F, 20% B):")
print(f" 年化收益率: {res1['Annual_Return']*100:.2f}%")
print(f" 年化波动率: {res1['Annual_Volatility']*100:.2f}%")
print(f" 夏普比率(无风险利率2%): {res1['Sharpe_Ratio']:.3f}")
print("\n方案B (20% S, 30% F, 50% B):")
print(f" 年化收益率: {res2['Annual_Return']*100:.2f}%")
print(f" 年化波动率: {res2['Annual_Volatility']*100:.2f}%")
print(f" 夏普比率(无风险利率2%): {res2['Sharpe_Ratio']:.3f}")
print("\n注:合成历史回测,低相关性分散非系统性风险,但不保证未来表现。")
print("======================================================")运行结果输出:
================ 多资产量化投资组合测算 ================
回测期: 2023-01-02 至 2023-12-19 (252个交易日)
资产历史年化波动率: S=27.76%, F=24.77%, B=6.79%
股票-期货相关性: 0.323
股票-债券相关性: -0.349
--- 配置方案对比 ---
方案A (50% S, 30% F, 20% B):
年化收益率: 4.94%
年化波动率: 17.38%
夏普比率(无风险利率2%): 0.169
方案B (20% S, 30% F, 50% B):
年化收益率: 0.86%
年化波动率: 10.43%
夏普比率(无风险利率2%): -0.109
注:合成历史回测,低相关性分散非系统性风险,但不保证未来表现。
======================================================📖 结果解读(合成样例):本次仿真中,偏股方案 A(50/30/20)年化收益 4.94%、夏普 0.169;偏债方案 B(20/30/50)年化仅 0.86%、夏普 -0.109。这恰恰说明两条要点:① 低相关分散只能压缩波动(方案 B 波动 10.43% 远低于 A 的 17.38%),但不能凭空提高风险调整后收益——偏债配置在低收益假设下夏普反而为负;② 单一 252 交易日样本里,随机噪声对均值估计影响显著,结论须做统计显著性检验。工程排查思路:拉长样本窗口、扫描不同配比观察夏普对权重的敏感性、用风险平价或最小方差目标替代拍脑袋权重。回测结论随假设改变——这正是量化”可证伪性”的价值。
👉 点击查看解析
本练习的核心是多资产组合的收益—风险测算口径:对股票、商品期货、债券三类低相关资产,先用各自日收益率序列算出年化协方差矩阵,再按给定权重计算组合年化收益与年化波动率(组合波动由权重与资产间协方差共同决定,而非各资产波动的简单加权)。在本组合成样例中,偏股方案(50/30/20)年化收益 4.94%、夏普 0.169;偏债方案(20/30/50)波动更低(10.43% vs 17.38%),但在低收益假设下年化仅 0.86%、夏普 -0.109——说明分散能压缩波动,却不保证提高风险调整后收益,结论须经统计显著性检验,且不构成收益承诺。
本章小结
- 构筑全资产视野:充分理解股票、期货、期权、ETF 等标的的微观制度差异与对冲互补性。
- 掌握主观量化转化:将模糊的盘感转化为由参数、阈值与触发器构成的严密定量规则。
- 践行跨资产分散原则:依托协方差矩阵与低相关性资产配置,有效平滑单一市场的极端回撤。
📋 行动清单 (Action Checklist)
- 运行本讲多资产组合测算代码,测试调整股票与债券配比对夏普比率的影响;
- 梳理自己过往的一条主观交易思路,尝试用 Python 布尔表达式进行完全定量化表达;
- 预习下一节,深入剖析趋势型策略与均值回复型策略在模型原理上的对称之美。
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。