📑 查看全课大纲(第 5 / 38 节)
- 1.课程介绍与学习目标
- 2.量化交易的发展
- 3.主观投资与量化投资的关系
- 4.认识一个量化策略(1)
- 5.认识一个量化策略(2)
- 6.理工生做量化的优势
- 7.量化交易系统的基本架构
- 8.必要的交易基础知识及参考资料
- 9.上节课思考题及本节课内容介绍
- 10.技术指标简介
- 11.基于MACD的交易信号开发(1)
- 12.基于MACD的交易信号开发(2)
- 13.基于RSI的交易信号开发
- 14.基于BOLL的交易信号开发
- 15.基于分形的交易信号开发
- 16.总结及下节课预告
- 17.开发环境安装
- 18.获取指数和个股历史行情数据
- 19.修复行情数据中的问题
- 20.抓取财报数据、数据定时更新
- 21.实现低PE股票池(1)
- 22.实现低PE股票池(2)
- 23.实现低PE策略的回测(1)
- 24.实现低PE策略的回测(2)
- 25.风险控制综述
- 26.风险控制中的止盈止损
- 27.仓位管理的工程实现
- 28.完整策略介绍-基础策略
- 29.策略的分步优化
- 30.策略评价指标(1)
- 31.策略评价指标(2)
- 32.如何评价策略
- 33.如何优化策略
- 34.tick数据的意义
- 35.tick数据的介绍及使用
- 36.Hans123策略
- 37.经典买入三法策略
- 38.量化系统的完整研发和系统搭建
认识一个量化策略(2)
约 14 分钟
认识一个量化交易策略(2)
小象实战讲义 · 初阶量化交易:策略编写及系统搭建 本讲义仅用于编程与量化方法教学,不构成任何投资建议。
在量化投资的世界中,构建一个策略究竟需要经历哪些标准步骤?为什么在数学模型上看起来天衣无缝的博弈策略,在真实金融市场中却往往难以直接照搬?
承接上一讲对博弈论策略的探讨,本讲将深入剖析真实市场群体博弈的动态本质,并以量化交易中最经典的原型——**双均线策略(MA5 / MA10)**为例,完整走通从参数初始化、数据准备、信号检测到回测归因诊断的全生命周期,揭示策略从”逻辑构想”到”实战检验”的真实演进规律。
💡 核心导读
- 群体博弈的现实本质:
- 任何资金都不可能长期绝对控盘或操纵全市场大盘;
- 真实金融市场充满假象、博弈与反制,不存在固定正期望的静态套利游戏;
- 量化策略没有绝对的”对与错”,只有与自身风险偏好和资金规模相匹配的”合适与不合适”。
- 量化策略的标准生命周期:
- 参数与标的初始化:设定基准(Benchmark 如沪深 300)、交易标的、摩擦成本(印花税与佣金);
- 行情数据对齐:加载高开低收成交量(OHLCV)标准时序数据;
- 信号生成逻辑:金叉买入(短周期上穿长周期)、死叉卖出(短周期下穿长周期);
- 回测验证与归因诊断:重点观察收益率、最大回撤幅度与回撤持续时长。
- 经典双均线策略实战警示:
- 朴素双均线策略在震荡行情中极易产生连续假突破与频繁摩擦磨损;
- 实盘量化追求的是平稳向上的资金曲线,单纯依赖原始均线交叉不可直接上实盘,必须叠加过滤器与头寸控制。
┌─────────────────────────────────────────────────────────────┐
│ 量化策略标准开发与回测流水线 │
└──────────────────────────────┬──────────────────────────────┘
│
┌─────────────────────────────┼─────────────────────────────┐
▼ ▼ ▼
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ 参数与环境初始化 │ │ 信号检测与触发 │ │ 回测归因与诊断 │
├──────────────────┤ ├──────────────────┤ ├──────────────────┤
│ • 标的/基准设定 │ │ • MA5 > MA10 金叉│ │ • 累计收益 vs 基准│
│ • 佣金与税费规费 │ │ • MA5 < MA10 死叉│ │ • 最大回撤与夏普比│
│ • 日线数据加载 │ │ • 生成交易指令 │ │ • 震荡市磨损评估 │
└──────────────────┘ └──────────────────┘ └──────────────────┘一、从博弈游戏到二级市场:群体博弈的动态真实
在上一讲的猜硬币博弈模型中,当庄家(美女)以特定概率 随机出正面时,无论对手采取何种出牌概率 ,对手的数学期望收益恒为负:
然而,在真实二级市场中,这种”单向绝对收割模型”并不存在:
- 不存在全知全能的控盘资金:没有任何机构能长期锁定全市场指数。市场由成千上万具有不同目标、周期和信息的参与者共同博弈构成。
- 反制与动态平衡:若某一策略模式被普遍识别,市场博弈结构会迅速演化出反制策略,原有规律随之钝化或消失。
- 策略的适配性原则:量化交易中没有放之四海皆准的”圣杯”。高收益往往伴随高波动,稳健收益往往牺牲爆发力。策略研发的核心在于寻找与自身资金属性、流动性需求和心理承受力最契合的方案。
二、经典量化原型:双均线策略的全流程拆解
双均线策略(Dual Moving Average Crossover)是趋势跟踪领域最基础、最直观的经典策略:
1. 策略核心逻辑
- 短期均线(MA5):反映资产近 5 个交易日的短期持仓成本与动量;
- 长期均线(MA10):反映资产近 10 个交易日的中期趋势方向;
- 交易规则:
- 黄金交叉(金叉): 向上穿越 ,表明短期动能强劲,发出买入开仓信号;
- 死亡交叉(死叉): 向下穿越 ,表明短期趋势转弱,发出平仓卖出信号。
2. 真实回测必须包含的交易摩擦成本
在量化回测中,如果忽略交易成本,回测结果将完全失真。标准股票回测应内置以下摩擦规费:
- 印花税:单边卖出收取万分之五(0.05%,2023-08-28 起减半征收);
- 佣金费率:双边收取(如万分之三 0.03%),且设置单笔最低佣金(如 5 元);
- 滑点与冲击成本:市价单成交时的价差损耗。
三、回测诊断与实战反思:为什么简单均线不能直接上实盘?
在专业量化平台对标的进行双均线历史回测时,常观察到以下典型现象:
- 趋势行情中表现优异:在单边大幅上涨行情中,均线系统能牢牢捕捉主升浪,实现可观收益;
- 震荡行情中频繁挨打(锯齿形磨损):在无明显趋势的横盘震荡区间,价格频繁上下穿插均线,导致系统高频发出错误信号,出现”追高买入即回落、止损卖出即反弹”的反复亏损;
- 回撤持续时间漫长:朴素双均线策略的最大回撤往往超过 20% ~ 30%,且回撤修复周期可能长达一年以上,夏普比率较低(常在 0.3 以下)。
💡 专业量化的改进方向: 简单均线策略是极佳的学习样板,但实战中必须引入波动率过滤器(如 ATR)、均线发散阈值确认、宏观大盘状态过滤以及动态仓位管理模块,才能真正转化为具备抗风险能力的实盘策略。
📝 动手练一练
下面我们用纯 Python 实现一个完整的双均线策略回测引擎,内置佣金与印花税摩擦成本扣除,模拟计算买入持有基准(Benchmark)与双均线策略在 250 个交易日中的资金曲线演变及最大回撤指标:
import numpy as np
import pandas as pd
def dual_moving_average_backtest():
"""
实现经典双均线(MA5 / MA10)策略回测引擎
对比策略收益率、买入持有基准收益率与最大回撤
"""
np.random.seed(42)
n_days = 250 # 模拟 250 个交易日 (约 1 个完整自然年)
# 1. 模拟资产日线价格序列 (几何布朗运动)
daily_returns = np.random.normal(0.0005, 0.02, n_days)
prices = 10.0 * np.exp(np.cumsum(daily_returns))
df = pd.DataFrame({'Close': prices})
# 2. 计算 5 日与 10 日移动平均线
df['MA5'] = df['Close'].rolling(window=5).mean()
df['MA10'] = df['Close'].rolling(window=10).mean()
# 3. 信号检测: MA5 上穿 MA10 产生金叉(持仓 Signal=1),否则空仓(Signal=0)
df['Signal'] = 0
df.loc[df['MA5'] > df['MA10'], 'Signal'] = 1
# 次日开盘执行信号 (避免未来函数,持仓滞后一期生效)
df['Position'] = df['Signal'].shift(1).fillna(0)
# 4. 计算每日收益与累计净值曲线
df['Pct_Change'] = df['Close'].pct_change().fillna(0)
df['Strategy_Return'] = df['Position'] * df['Pct_Change']
# 5. 扣除交易摩擦成本: 买入收佣金万三, 卖出收佣金万三 + 印花税万五
COMMISSION = 0.0003 # 佣金费率 (双边收取)
STAMP_TAX = 0.0005 # 印花税 (仅卖出单边收取, 2023-08-28 起减半征收)
position_change = df['Position'].diff().fillna(0) # 持仓变动: +1 买入开仓, -1 卖出平仓
cost_rate = np.where(position_change > 0, COMMISSION, COMMISSION + STAMP_TAX)
df['Strategy_Return'] = df['Strategy_Return'] - np.abs(position_change) * cost_rate
initial_cash = 100000.0
df['Benchmark_Equity'] = (1 + df['Pct_Change']).cumprod() * initial_cash
df['Strategy_Equity'] = (1 + df['Strategy_Return']).cumprod() * initial_cash
# 6. 计算最大回撤指标
peak = df['Strategy_Equity'].cummax()
drawdown = (peak - df['Strategy_Equity']) / peak
max_dd = drawdown.max()
strat_ret = (df['Strategy_Equity'].iloc[-1] - initial_cash) / initial_cash
bench_ret = (df['Benchmark_Equity'].iloc[-1] - initial_cash) / initial_cash
print("================ 双均线策略 (MA5/MA10) 回测诊断 ================")
print(f"回测周期: {n_days} 个交易日")
print(f"基准(买入持有)收益: {bench_ret*100:.2f}% | 最终资产: {df['Benchmark_Equity'].iloc[-1]:,.2f} 元")
print(f"双均线策略收益: {strat_ret*100:.2f}% | 最终资产: {df['Strategy_Equity'].iloc[-1]:,.2f} 元")
print(f"策略最大资产回撤: {max_dd*100:.2f}%")
print("=============================================================")
return df
if __name__ == "__main__":
dual_moving_average_backtest()运行结果输出:
================ 双均线策略 (MA5/MA10) 回测诊断 ================
回测周期: 250 个交易日
基准(买入持有)收益: 10.79% | 最终资产: 110,788.32 元
双均线策略收益: -13.54% | 最终资产: 86,456.32 元
策略最大资产回撤: 23.00%
=============================================================📌 成本侵蚀实证:完全相同的信号序列下,若不扣成本,策略收益为 -11.91%、最大回撤 22.04%;计入佣金与印花税后,收益进一步恶化至 -13.54%、回撤扩大至 23.00%。震荡市中双均线频繁换手,每一次买卖都被摩擦成本持续蚕食净值——这正是「锯齿形磨损」在资金曲线上的量化体现。
本章小结
- 深刻理解博弈演化:金融市场不存在单向收割的静态套利机会,量化策略的有效性取决于对市场环境变化的动态适应。
- 掌握策略开发四部曲:参数初始化 → 干净数据对齐 → 明确信号判定 → 严谨回测归因。
- 正视震荡市假突破缺陷:朴素双均线策略易在震荡行情中产生频繁假信号与资本磨损,必须结合多周期过滤与仓位控制综合优化。
📋 行动清单 (Action Checklist)
- 运行本讲双均线回测代码,尝试将均线参数由
(5, 10)修改为(10, 30)或(20, 60),观察交易频率与回撤特征的变化; - 思考并记录:在双均线策略中加入什么附加过滤条件(如成交量放大或价格偏离幅度),能够有效减少震荡行情中的假金叉亏损;
- 熟练掌握避免未来函数(
shift(1)信号次日生效)的标准回测设计方法。
— 小象教研组
领取《小象 11GB VIP 课件资料包与大厂真题手册》
包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。
- ✔完整 Python / 数据分析 Jupyter 实战源码
- ✔大厂真实业务数据集与练习题
- ✔微信扫码添加课程顾问,免费获取网盘下载链接
微信扫码添加顾问