引言
大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年10月学习赛的Python量化交易学习总结文档。在现代金融市场中,量化择时策略已成为投资者追求超额收益的重要工具。本文将系统梳理量化择时策略的基本概念,重点解析常见的技术指标和策略,并介绍如何使用Python进行量化择时分析。
一、 什么是量化择时策略
- 定义:利用数量化分析方法,通过技术指标组合,对交易标的进行低买高卖的操作,期望获得超越简单买入持有策略的收益风险表现。
- 核心:技术分析(客观型技术分析)
- 优点:具有很强的可传授性和可复制性
- 客观型技术分析:分析过程中使用的分析方法,100%客观定义,不含主观定义;
- 特点:具有很强的可传授性和可复制性,任何人只要花费时间精力去理解,掌握;便可以得到令人满意的投资业绩;
1. 量化择时的内容
- 股票市场的非理性是周期性爆发的;
- 定量分析不一定会出色,但是也不会坠入疯狂;
所谓量化择时,即为:根据量化指标,选择买卖的时机。量化择时分为:
- 市场整体择时
- 板块行业轮动择时
- 个股的择时
意义:选择牛市、规避熊市,获得高超额收益;选择时机进入是投资决策的首要目标,低风险区域进入能增大安全边际;
2. 量化择时的优点
- 提高超额收益:
- 通过精准的市场时机选择,量化择时策略能够在市场上涨时买入,下跌时卖出,从而获得高于市场平均水平的收益。
- 降低风险:
- 量化择时策略通过避免市场下跌期间的持有,有效降低了投资组合的整体风险。
- 省去选股复杂性:
- 量化择时策略主要关注市场整体趋势,而非个股表现,因此投资者无需花费大量时间和精力进行个股研究与选择。
- 系统化决策:
- 量化择时策略依赖于系统化的数据分析和技术工具,减少了人为情绪和主观判断的影响,提高了决策的客观性和一致性。
- 灵活应对市场波动:
- 通过宏观先行指标、市场情绪指标、整体估值指标和技术分析指标的综合运用,量化择时策略能够灵活应对市场波动,及时调整投资组合。
- 优化大类资产配置:
- 量化择时策略适用于大类资产配置,能够在不同资产类别(如股票、债券、商品等)之间进行动态调整,以优化投资组合的风险收益比。
- 捕捉市场机会:
- 量化择时策略能够及时捕捉市场的短期拐点和中期趋势,从而在市场机会出现时迅速做出反应,最大化投资收益。
- 长期稳健回报:
- 通过量化择时策略,投资者可以在不同市场环境下,灵活调整资产配置,以应对市场波动,实现长期稳健的投资回报。
二、量化择时的策略
常见的技术指标有:
- 均线
- MACD
- RSI等
它们都有一个共同点,那就是具有明确的数学公式,这说明其有广泛性,任何人计算出来的结果都是一样的;
例如20日简单均线,不管谁画出来的均线都是一样的;
这些客观型技术指标按照其性能及其设计特征,归纳了八种量化择时的方法:
- 趋势择时
- Hurst指数
- SWARCH模型
- 异常指标择时
- 市场情绪择时
- SVM分类
- 有效资金模型
- 牛熊线
接下来我们将其整理为以下表格进行区分:
策略名称 | 定义 | 公式/计算方法 | 作用 | 指标 | 备注 |
---|---|---|---|---|---|
异常指标择时 | 处理特殊情况下的择时,如大盘顶点或低点时的异常数据。 | 无特定公式,主要依赖市场噪声、行业集中度和兴登堡凶兆等策略。 | 识别市场极端情况,提前预警。 | 市场噪声、行业集中度、兴登堡凶兆 | 适用于市场出现极端情况时的择时。 |
趋势择时 | 基于技术分析,认为趋势具有延续性,跟随趋势操作。 | 主要指标:MA(移动平均线)、MACD(指数平滑异同移动平均线)、DMA(差离值)等。 | 识别市场趋势,跟随操作以获取收益。 | MA、MACD、DMA | 适用于趋势明显的市场环境。 |
有效资金择时 | 通过判断推动大盘上涨或下跌的有效资金来判断走势。 | 构建有效资金指标EMS(有效资金模型),计算资金流入流出情况。 | 判断市场趋势的拐点,优化资金配置。 | EMS(有效资金指标) | 适用于市场顶部和底部的资金流动分析。 |
市场情绪择时 | 利用投资者情绪判断市场方向,情绪热烈时市场可能继续上涨,反之下跌。 | 利用投资信心指数等情绪指标。 | 捕捉市场情绪波动,预测市场趋势。 | 投资信心指数 | 适用于个人投资者居多的市场环境。 |
SVM择时 | 利用支持向量机(SVM)技术进行大盘趋势的模式识别。 | 利用SVM技术进行大盘趋势的模式识别,区分不同市场模式。 | 通过模式识别预测市场趋势。 | SVM分类模型 | 适用于大数据分析和模式识别。 |
SWARCH择时 | 利用宏观经济指标(如货币供应量M2)判断大盘走势。 | 刻画货币供应量M2与大盘走势之间的关系。 | 通过宏观经济指标预测市场趋势。 | 货币供应量M2 | 适用于宏观经济与股市关联性强的市场。 |
牛熊线择时 | 将大盘走势划分为牛线和熊线,突破牛线预示上涨趋势,突破熊线预示下跌。 | 使用250日移动平均线(年线)作为牛熊线。 | 判断市场长期趋势,捕捉大级别行情。 | 250日移动平均线(年线) | 适用于长期趋势判断。 |
Hurst指数 | 利用分形理论判断市场趋势的长期记忆性和转折点。 | 计算Hurst指数,判断时间序列的长期记忆性。 | 识别市场趋势的延续性和转折点。 | Hurst指数(H=0.5为随机游走,0.5<H<1为长期记忆性,0≤H<0.5为均值回复) | 适用于分形市场理论下的趋势判断。 |
1. 均线由来
这里将均线法则整理为表格:
法则分类 | 法则名称 | 描述 | 图示说明 |
---|---|---|---|
买入法则 | 买1:黄金交叉 | 均线整体上行,股价由下至上上穿均线,形成黄金交叉,为第一个买点。 | 均线向上,股价从下方穿过均线。 |
买入法则 | 买2:回测不过 | 股价出现下跌迹象,但尚未跌破均线,均线变为支撑线,为第二个买点。 | 股价下跌但未跌破均线,均线提供支撑。 |
买入法则 | 买3:小幅跌破 | 股价仍处于均线上方,但呈现急剧下跌趋势。当跌破均线时,为第三个买点。 | 股价在均线上方急剧下跌,跌破均线。 |
买入法则 | 买4:乖离过大 | 股价和均线都处于下降通道,且股价处于均线下方,严重远离均线,为第四个买点。 | 股价和均线均下降,股价严重偏离均线。 |
卖出法则 | 卖1:死亡交叉 | 均线由上升状态变为缓慢下降的状态,股价也开始下降。当股价跌破均线时,形成死亡交叉,为第一个卖点。 | 均线由上升转为下降,股价跌破均线。 |
卖出法则 | 卖2:回测不过 | 股价仍处于均线之下,但股价开始呈现上涨趋势,当股价无限接近均线但尚未突破时,均线变为阻力线,为第二个卖点。 | 股价在均线下方上涨,接近但未突破均线。 |
卖出法则 | 卖3:小幅突破 | 股价终于突破均线,处于均线上方。但持续时间不长,股价开始下跌,直至再一次跌破均线,为第三个卖点。 | 股价突破均线后迅速下跌,再次跌破均线。 |
卖出法则 | 卖4:乖离过大 | 股价和均线都在上涨,股价上涨的速度远快于均线上涨的速度。当股价严重偏离均线时,为第四个卖点。 | 股价和均线均上涨,股价严重偏离均线。 |
- 买入法则:主要用于判断买入时机,通过股价与均线的相对位置来识别买入信号。
- 卖出法则:主要用于判断卖出时机,通过股价与均线的相对位置来识别卖出信号。
Granville八大买卖法则通过简单的均线和股价关系,提供了明确的买卖信号,至今仍被广泛应用于股票市场的量化策略中。
2.常见均线
常见的均线包括简单移动平均线(SMA)和指数移动平均线(EMA)。
- 简单移动平均线(SMA):
- 定义:SMA是通过将一段时间内的价格加总,然后除以时间段的长度来计算的。
- 计算公式:
SMA = ∑ i = 1 n P i n \text{SMA} = \frac{\sum_{i=1}^{n} P_i}{n} SMA=n∑i=1nPi
其中,
P
i
P_i
Pi是第
i
i
i天的价格,
n
n
n是时间段的长度。
- 示例:20日简单移动平均线是根据过去20个交易日的收盘价来计算的。
- 指数移动平均线(EMA):
- 定义:EMA是根据指数平滑系数来计算的,它更加关注最近的价格数据。较新的价格数据会给予更高的权重,而较旧的价格数据则给予较低的权重。
- 计算公式:
EMA t = α × P t + ( 1 − α ) × EMA t − 1 \text{EMA}t = \alpha \times P_t + (1 - \alpha) \times \text{EMA}{t-1} EMAt=α×Pt+(1−α)×EMAt−1
其中, α \alpha α 是平滑系数(通常取值为 2 n + 1 \frac{2}{n+1} n+12), P t P_t Pt 是当天的价格, EMA t − 1 \text{EMA}_{t-1} EMAt−1 是前一天的EMA值。 - 初始EMA值:通常取第一个SMA值作为初始EMA值。
- 应用:
- 趋势分析:均线可以帮助分析趋势和价格的走势。
- 买卖信号:当价格上涨并且价格位于均线之上时,可能被视为买入信号;当价格下跌并且价格位于均线之下时,可能被视为卖出信号。
- 交叉均线策略:使用两条不同长度的移动均线,当短期均线穿过长期均线时产生交易信号。
3. 均线计算
我们结合金融软件具体查看一下该指标。目前各大金融软件基本都提供移动平均值的计算,如下截图展示了平安银行(000001.SZ) 2023年4月到6月的估价走势,在右上角展示了5日移动平均值(M5)、10日移动平均值(M10)、20日移动平均值(M20)、30日移动平均值(M30)。
为了进一步计算验证,本文拉取了20230501 - 20230630 交易日每天的日行情数据,根据收盘价计算,可以看出该计算结果与金融产品上展示的数据一致。
计算代码如下:
"""
使用tushare库来获取股票数据,并对数据进行处理和计算移动平均值。
"""
import tushare as ts
# https://tushare.pro/user/token
tushare_token = '0858b935f4518d9e56ffeb19910dc13e296291364ea1d7bd574eb84b'
ts.set_token(tushare_token)
pro = ts.pro_api(tushare_token)
# 个股数据 https://tushare.pro/document/2?doc_id=27
# 从tushare获取个股数据,从2023年5月1日到2023年6月30日期间获取股票代码为000001.SZ的数据,字段包括交易代码、交易日期和收盘价。
df = pro.daily(ts_code='000001.SZ', start_date='20230501', end_date='20230630', fields='ts_code,trade_date,close')
df = df.sort_values(by='trade_date')
# 使用.rolling()函数计算收盘价的移动平均值,分别为5天、10天、20天和30天,并将结果存储在M5、M10、M20和M30列中。
df['M5'] = df.close.rolling(window=5).mean().round(2)
df['M10'] = df.close.rolling(window=10).mean().round(2)
df['M20'] = df.close.rolling(window=20).mean().round(2)
df['M30'] = df.close.rolling(window=30).mean().round(2)
# 对数据按交易日期进行降序排序,以便按照日期从新到旧的顺序显示数据。
df = df.sort_values(by='trade_date', ascending=False)
print("前10条数据:\n", df.head(10))
df.to_csv('result.csv', index=False)
输出结果:
根据输出的结果,可以看出已经成功计算出均线数据;
三、双均线策略
1.策略原理
双均线策略使用两根均线,一根长周期均线和一根短周期均线。当短期均线从下往上穿越长周期均线时,买入;当短期均线从上往下穿越长周期均线时,卖出。Granville八大法则也是一种双均线策略,其短周期均线为M1(当日收盘价)。
- 短期均线:5、7、10,用于预测短期走势,MA5和MA10又称为短期监测线。
- 中期均线:20、30、60,用于预测中期走势,MA20和MA30又称为警戒线,MA60则称之为生死线。
- 长期均线:120、250,用于长期走势,MA120又称为确认线,MA250则通常被看做反转线,又称为牛熊分界线。
2.策略缺陷
- 滞后性:均线归根到底是一种平均值,在应用中存在的最大问题就是滞后性。当出现买入卖出信号时,最佳时机早已过去。
- 长短周期难以选择:如果两根均线的周期接近,容易缠绕,产生大量无效交易;如果周期差距较大,趋势性不明显,可能会造成很大亏损。
3.策略优化方向
- 使用加权移动平均值:将短期(如昨天)的权重增大,以加强指标的敏感性。
- 不局限于收盘价:尝试将最高价、最低价等加入到加权移动平均值的计算中。
- 自适应调整均线周期:根据价格走势自动调整均线周期,如单边上涨趋势时采用短期均线,横盘震荡时采用长期均线。
案例代码如下:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tushare as ts
# 设置tushare token
# tushare_token = 'your_tushare_token'
tushare_token = '0858b935f4518d9e56ffeb19910dc13e296291364ea1d7bd574eb84b'
ts.set_token(tushare_token)
pro = ts.pro_api()
# 获取股票数据
df = pro.daily(ts_code='000001.SZ', start_date='20210101', end_date='20230630', fields='trade_date,close')
# 计算短期均线和长期均线
df['MA5'] = df['close'].rolling(window=5).mean()
df['MA20'] = df['close'].rolling(window=20).mean()
# 生成交易信号
df['signal'] = np.where(df['MA5'] > df['MA20'], 1, -1)
# 计算当天持仓状态
df['position'] = df['signal'].diff()
# 回测策略
df['return'] = df['close'].pct_change() # 计算每日收益率
df['strategy_return'] = df['position'].shift() * df['return'] # 计算每日持仓收益
# 计算累计收益率
df['cumulative_return'] = (1 + df['strategy_return']).cumprod()
# 可视化结果
plt.plot(df['trade_date'], df['cumulative_return'])
plt.xlabel('Date')
plt.ylabel('Cumulative Return')
plt.title('Dual Moving Average Strategy')
plt.xticks(rotation=45)
plt.show()
结果如下:
代码思路:
- 数据获取:
- 使用
tushare
库获取股票代码为000001.SZ
的股票数据,时间范围为2021年1月1日至2023年6月30日,字段为交易日期和收盘价。
- 使用
- 计算均线:
- 计算5日和20日的简单移动平均线(SMA),分别存储在
MA5
和MA20
列中。
- 计算5日和20日的简单移动平均线(SMA),分别存储在
- 生成交易信号:
- 当5日均线(短期均线)在20日均线(长期均线)之上时,生成买入信号(1);反之,生成卖出信号(-1),存储在
signal
列中。
- 当5日均线(短期均线)在20日均线(长期均线)之上时,生成买入信号(1);反之,生成卖出信号(-1),存储在
- 计算持仓状态:
- 通过
signal
列的差分计算持仓状态,持仓状态的变化表示买入和卖出的时机,存储在position
列中。
- 通过
- 回测策略:
- 计算每日收益率,并根据持仓状态计算每日策略收益率,存储在
strategy_return
列中。 - 计算累计收益率,存储在
cumulative_return
列中。
- 计算每日收益率,并根据持仓状态计算每日策略收益率,存储在
- 可视化结果:
- 使用
Matplotlib
库绘制累计收益率曲线,展示策略的表现。
- 使用
- 交易成本:在实际应用中,需要考虑交易成本和滑点。
- 止损和止盈:建议设置止损和止盈策略,以控制风险。
- 策略优化:可以根据市场情况和策略表现,进一步优化均线周期和参数。
四、MACD均线择时策略
1.MACD指标概述
MACD(Moving Average Convergence and Divergence),即异同移动平均线,是由Gerald Appel在1979年提出的一种技术分析工具。它通过对金融资产价格的收盘价进行平滑处理,生成两线一柱的组合,分别是快速线DIF、慢速线DEA和柱状图MACD。MACD指标能够反映股票近期价格走势的变化强弱和能量,帮助投资者把握准确的买卖点。
2.MACD计算方法
MACD的计算涉及以下几个步骤:
- 短期EMA:通常采用12天的收盘价指数移动平均值,记为EMA(price, 12)。
- 长期EMA:通常采用26天的收盘价指数移动平均值,记为EMA(price, 26)。
- DIF:短期EMA与长期EMA的差值,即DIF = EMA(price, 12) - EMA(price, 26)。
- DEA:DIF的9天指数移动平均值,即DEA = EMA(DIF, 9)。
- MACD:DIF线与DEA线的差,即MACD = DIF - DEA。
3.依据MACD进行择时
MACD指标在择时策略中有以下经典应用:
- 金叉:当MACD从负数转向正数,快速线DIF自下而上穿过慢速线DEA时,形成金叉,这是买入信号。
- 死叉:当MACD从正数转向负数,快速线DIF自上而下穿过慢速线DEA时,形成死叉,这是卖出信号。
- 大角度变化:当MACD以大角度变化时,表示快速线和慢速线的差距迅速拉开,预示着市场大趋势的转变。
4.MACD指标的优缺点
优点:
- 简化观察:相比双均线策略,MACD将两条线转换成单个指标,更容易观察。
- 减少假信号:在震荡行情中,MACD能减少频繁发出假信号的现象。
- 风险控制:MACD能较早地发出卖出信号,帮助策略在股价开始下跌时及时离场。
缺点:
- 错失利润:在大型趋势上涨行情中,MACD可能过早离场,错失部分利润。
5.代码案例
以下是案例代码,展示了如何使用MACD指标进行择时策略的回测:
import numpy as np
import pandas as pd
import talib as ta
# Joinquant数据下载API
from jqdatasdk import *
# 登录验证
auth("xxxx电话号码", "xxxx聚宽登录密码")
import matplotlib.pyplot as plt
# 下载数据
# 下载2015-2018年的沪深300指数,频率为每天,只要收盘价
price = get_price("000300.XSHG", start_date="2023-07-22", end_date="2024-07-28", frequency="daily", fields=['close'])['close']
# 用python自带的tseries库中的pct_change()函数计算日收益率
ret = price.pct_change()
# 用talib库中的相应函数计算MACD指标
dif, dea, macd = ta.MACD(price)
# 只考虑MACD指标,MACD转正时开仓买入,转负时清仓
sig = (macd>0)
# sig滞后一期、去除空值、转换成整数
sig_lag = sig.shift(1).fillna(0).astype(int)
# sig_lag与股票日收益率相乘,即可得策略日收益率。python能自动对齐时间序列的日期。
sig_ret = sig_lag*ret
# 计算策略累计收益
cum_sig_ret = (1+sig_ret).cumprod()
# 把股票价格转换成从1开始,方便比较
price_norm = price/price[0]
# 简单起见,这里不考虑手续费,作图比较该策略和“买入-持有”策略的表现。
plt.figure(figsize=(18,8))
plt.plot(price_norm)
plt.plot(cum_sig_ret)
plt.legend(["benchmark", "strategy cumulative return"], loc="upper left")
plt.show()
通过这段代码,我们可以直观地比较MACD择时策略与“买入-持有”策略的表现。
相关包安装:
pip install numpy== 1.14.1
pip install thriftpy2==0.4.20 jqdatasdk pandaspip install -U pandas_ta
conda install -c conda-forge TA-Lib
申请聚宽数据的链接:
聚宽登录
最后,投资需谨慎,本文仅供作者学习使用,切勿作为实践案例进行使用;若造成损失,作者可不负责哦!🙂
相关链接
- 项目地址:AlgoQuant-CookBook
- 相关文档:专栏地址
- 作者主页:GISer Liu-CSDN博客
如果觉得我的文章对您有帮助,三连+关注便是对我创作的最大鼓励!或者一个star🌟也可以😂.