引言

大家好,我是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=ni=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α)×EMAt1
      其中, α \alpha α 是平滑系数(通常取值为 2 n + 1 \frac{2}{n+1} n+12), P t P_t Pt 是当天的价格, EMA t − 1 \text{EMA}_{t-1} EMAt1 是前一天的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 = '08xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
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.策略缺陷

  1. 滞后性:均线归根到底是一种平均值,在应用中存在的最大问题就是滞后性。当出现买入卖出信号时,最佳时机早已过去。
  2. 长短周期难以选择:如果两根均线的周期接近,容易缠绕,产生大量无效交易;如果周期差距较大,趋势性不明显,可能会造成很大亏损。

3.策略优化方向

  1. 使用加权移动平均值:将短期(如昨天)的权重增大,以加强指标的敏感性。
  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()

结果如下:

代码思路:

  1. 数据获取
    • 使用tushare库获取股票代码为000001.SZ的股票数据,时间范围为2021年1月1日至2023年6月30日,字段为交易日期和收盘价。
  2. 计算均线
    • 计算5日和20日的简单移动平均线(SMA),分别存储在MA5MA20列中。
  3. 生成交易信号
    • 当5日均线(短期均线)在20日均线(长期均线)之上时,生成买入信号(1);反之,生成卖出信号(-1),存储在signal列中。
  4. 计算持仓状态
    • 通过signal列的差分计算持仓状态,持仓状态的变化表示买入和卖出的时机,存储在position列中。
  5. 回测策略
    • 计算每日收益率,并根据持仓状态计算每日策略收益率,存储在strategy_return列中。
    • 计算累计收益率,存储在cumulative_return列中。
  6. 可视化结果
    • 使用Matplotlib库绘制累计收益率曲线,展示策略的表现。
  • 交易成本:在实际应用中,需要考虑交易成本和滑点。
  • 止损和止盈:建议设置止损和止盈策略,以控制风险。
  • 策略优化:可以根据市场情况和策略表现,进一步优化均线周期和参数。

四、MACD均线择时策略

1.MACD指标概述

MACD(Moving Average Convergence and Divergence),即异同移动平均线,是由Gerald Appel在1979年提出的一种技术分析工具。它通过对金融资产价格的收盘价进行平滑处理,生成两线一柱的组合,分别是快速线DIF、慢速线DEA和柱状图MACDMACD指标能够反映股票近期价格走势的变化强弱和能量,帮助投资者把握准确的买卖点

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 pandas

pip install -U pandas_ta

conda install -c conda-forge TA-Lib

申请聚宽数据的链接:

聚宽登录

最后,投资需谨慎,本文仅供作者学习使用,切勿作为实践案例进行使用;若造成损失,作者可不负责哦!🙂


相关链接

如果觉得我的文章对您有帮助,三连+关注便是对我创作的最大鼓励!或者一个star🌟也可以😂.


Logo

加入社区!打开量化的大门,首批课程上线啦!

更多推荐