【手把手教你】趋势跟踪交易策略的量化回测

01

引言


趋势跟踪策略旨在根据市场趋势的方向来进行交易,即如果市场处于上升趋势,那么投资者应该买入,并且保持这种头寸直到趋势结束。同样地,如果市场处于下降趋势,投资者应该卖空,并且保持这种头寸直到趋势结束。这种策略基于市场趋势的延续性原则,即市场趋势通常会在一段时间内持续。常用的工具包括k线、压力和支撑、趋势线,均线,交易模式等。趋势跟踪也可以称为右手交易策略。其交易理念基于至少五个基本假设:第一,市场价格包含所有当前信息;第二,价格波动按照一定的趋势运行;第三,可以现实地清晰判断市场走势;第四,趋势能走多远,无法预料;第五,市场趋势可以跟踪交易,最终利。

趋势跟踪策略包括以下几种交易策略:

  • 均线策略:根据价格在一定期间内的均值来判断市场趋势,具体使用的指标包括双均线,多重均线, MACD指标等。

  • 动量策略:动量策略是通过股票的价格和交易量的变化来判断股票的趋势方向。例如,当股票价格和交易量都在上涨时,可以认为股票处于上升趋势中,买入股票;当股票价格和交易量都在下跌时,可以认为股票处于下降趋势中,卖出股票。其核心逻辑主要是利用市场信息的不对称性。有的人对股票的利好消息反应快,有的人对利好消息反应慢,导致了股票连续上涨的惯性。常用的指标有涨跌天数等。

  • 价格通道策略:根据股票价格波动的上下限来判断市场趋势,通常使用布林带或移动平均线通道指标,如唐奇安通道和布林带策略。

下面基于 qstock 包对这些交易策略进行简单的量化回测,关于qstock的安装和使用介绍参见推文:【手把手教你】使用qstock进行量化回测

02

均线策略

双均线策略

Moving Average

移动平均线反应了某一段时间内的平均价格,双均线交叉系统利用两根不同周期的移动平均线的交叉作为趋势确认形成的信号,这通常是指一根较小周期的均线上穿或者下穿较长周期均线形成多头或者空头趋势的信号。其原理是认为较短周期的移动均线较能反应近期的行情方向,当其上穿或者下穿较长周期的移动均价线时,会有很大可能形成该方向的趋势。

import pandas as pd
import numpy as np
import qstock as qs
def ma_trend_follow(code='中国平安',sma=20,lma=60,benchmark='hs300',start='20100101',end='202303117'):
    df=qs.data_feed(code,index=benchmark,start=start,end=end)
    df['sma']=df.close.rolling(sma).mean()
    df['lma']=df.close.rolling(lma).mean()
    #短期均线大于长期均线发出买入信号设置为1
    df.loc[(df['sma']>df['lma']), 'signal'] = 1
    #当短期均线跌破长期均线发出卖出信号设置为0
    df.loc[(df['sma']<=df['lma']), 'signal'] = 0
    #当仓位为1时,买入或持仓,当仓位为0时,卖出或空仓,计算资金净值
    df['position']=df['signal'].shift(1)
    df['position'].fillna(method='ffill',inplace=True)
    df['capital_ret']=df.rets.values*df['position']
    #计算策略累计收益率
    df['capital_line']=(df.capital_ret+1.0).cumprod()
    return df
qs.start_backtest(ma_trend_follow())

2e33778862c3d505c51a15ef6e08c55b.jpeg

f1f3726603cac29b2361930e1bb20c12.jpeg

9d29abf5cc3290fe9413b6c719a10cc8.jpeg

将“中国平安”换成“晓程科技”,同时把参数改成短期均线7日,长期均线14日,回测结果如下所示。
qs.start_backtest(ma_trend_follow('晓程科技',sma=7,lma=14))

f50d41abd781ec9bb57448d65ce06d13.jpeg

5882e6cff2ea171698b7025b13948ee9.jpeg

39a868b181d5133369a1d368e967babd.jpeg

MACD交易策略

MACD Strategy

MACD交易策略是一种趋势跟踪策略,它通过计算股票价格的长期移动平均线和短期移动平均线之间的差异来发现市场趋势的变化。MACD由快速移动平均线(EMA12)和慢速移动平均线(EMA26)之间的差异以及它们的移动平均线(信号线EMA9)组成。

当MACD的快速线(12日EMA)向上穿过慢速线(26日EMA),产生所谓的“金叉”,通常被视为买入信号;相反,当快速线向下穿过慢速线时产生“死叉”,通常被视为卖出信号。

def macd_trend_follow(code='中国平安',benchmark='hs300',start='20100101',end='202303117'):
    df=qs.data_feed(code,index=benchmark,start=start,end=end)
    df['EMA12'] = df['close'].ewm(span=12, adjust=False).mean()
    df['EMA26'] = df['close'].ewm(span=26, adjust=False).mean()
    df['MACD'] = df['EMA12'] - df['EMA26']
    df['Signal'] = df['MACD'].ewm(span=9, adjust=False).mean()
    # 计算金叉和死叉信号
    df['position'] = 0
    df.loc[df['MACD'] > df['Signal'], 'position'] = 1  # 金叉买入
    df.loc[df['MACD'] < df['Signal'], 'position'] = 0  # 死叉卖出
    df['position'] = df['position'].shift(1).fillna(0)  # 将信号序列向前移动一位,防止未来数据干扰
    #df['position'].fillna(method='ffill',inplace=True)
    df['capital_ret']=df.rets.values*df['position']
    #计算策略累计收益率
    df['capital_line']=(df.capital_ret+1.0).cumprod()
    return df
qs.start_backtest(macd_trend_follow())

953c2fc804ae1006c805c6b392ba87b3.jpeg

0dcde721ca00be3cf3b829710d3e9482.jpeg

a3c3aa1fcd18e56dbf74b257922210f3.jpeg

03

动量交易策略

动量交易策略是一种趋势跟踪策略,它认为市场上涨或下跌的趋势会持续一段时间,因此通过观察过去一段时间内资产价格的走势来预测未来的价格变动,并根据预测结果进行交易。

def mom_trend_follow(code='中国平安',benchmark='hs300',n=30,start='20100101',end='202303117'):
    df=qs.data_feed(code,index=benchmark,start=start,end=end)
    # 计算收益率
    df['returns'] = df['close'].pct_change()
    # 计算动量指标
    df['momentum'] = df['returns'].rolling(n).mean()
    # 计算交易信号
    df['position'] = df['momentum'].apply(lambda x: 1 if x > 0 else 0)
    df['position'] = df['position'].shift(1).fillna(0)  # 将信号序列向前移动一位,防止未来数据干扰
    #df['position'].fillna(method='ffill',inplace=True)
    df['capital_ret']=df.rets.values*df['position']
    #计算策略累计收益率
    df['capital_line']=(df.capital_ret+1.0).cumprod()
    return df
qs.start_backtest(mom_trend_follow())

bdecac1171e396949ac7000ab615a73d.jpeg

5bd72910f44db7c3879866b0e153d3fe.jpeg

93269ba19d75051e721e1aca69fada34.jpeg

04

价格通道交易策略

价格通道交易策略主要有以下几种:

布林带策略:利用布林带指标来判断股价的波动情况和趋势,进而进行交易。

Keltner Channel策略:由股票交易员 Chester Keltner 所创造,该指标是基于移动平均线和真实波幅指标计算得出的通道指标。

Donchian Channel策略:该指标是基于价格波动的最高点和最低点所形成的通道,通常选择20日或者30日作为计算周期。

Envelopes策略:该指标是由一条中心线和上下两条通道组成,中心线通常为移动平均线,上下通道的宽度由一定的比例参数决定。

ATR Channel策略:该指标基于股票的波动性,通常使用股票的平均真实波幅(ATR)指标来确定价格通道的范围。


以上这些价格通道策略都可以用于判断趋势和波动,进而进行交易。具体选择哪种策略要根据个人的投资风格、资金管理和市场情况来定夺。下面主要介绍布林带交易策略。

布林带交易策略

Bollinger Band

当布林带开口向上或倾斜上升,当价格上涨并触及布林带中轨线时,你可以立即入场做多(只要触及中轨线即可入场);反之,当前一日价格突破了布林带上轨,且价格和均线趋势掉头向下,布林带开口向下或倾斜下降时做空。

def pp_trend_follow(code='中国平安',benchmark='hs300',n=20,k=1,start='20100101',end='202303117'):
    df=qs.data_feed(code,index=benchmark,start=start,end=end)
    # 计算价格通道指标
    df['sma'] = df['close'].rolling(n).mean()
    df['std'] = df['close'].rolling(n).std()
    df['upper_band'] = df['sma'] + k * df['std']
    df['lower_band'] = df['sma'] - k * df['std']
    # 根据布林带中轨线进行交易
    df['position'] = 0
    for i in range(1, len(df)):
        # 上涨趋势,价格回撤并触及中轨线,买入
        if df['sma'][i] > df['sma'][i-1] and df['close'][i-1] > df['sma'][i-1] and df['close'][i] >= df['sma'][i]:
            df['position'][i] = 1
        # 下跌趋势,价格反弹并触及中轨线,卖出
        elif df['sma'][i] < df['sma'][i-1] and df['close'][i] < df['close'][i-1] and df['close'][i-1] > df['upper_band'][i-1]:
            df['position'][i] = -1

    # 将信号序列向前移动一位,防止未来数据干扰
    df['position'] = df['position'].shift(1).fillna(0)  
    #df['position'].fillna(method='ffill',inplace=True)
    df['capital_ret']=df.rets.values*df['position']
    #计算策略累计收益率
    df['capital_line']=(df.capital_ret+1.0).cumprod()
    return df
qs.start_backtest(pp_trend_follow())

1cfa02247881aaf7d0d14865bdfa8a8d.jpeg

d7b04ded79c60756d153c9734a09f93a.jpeg

560666e0e306b55a4e17c3e3c8418d1a.jpeg

Keltner Channel交易策略

KC Strategy


Keltner Channel是一种价格通道交易策略,与布林带相似,但使用不同的计算方法。它由三条线组成:中轨线,上轨线和下轨线。中轨线是一个移动平均线,通常使用20日或50日的简单移动平均线。上轨线和下轨线是根据股票价格的波动率来计算的,通常使用股票价格的平均真实范围(ATR)。Keltner Channel交易策略的基本思路是,当股票价格穿过上轨线时,表示市场处于超买状态,可以卖出;当股票价格穿过下轨线时,表示市场处于超卖状态,可以买入。关于该交易策略的回测留待读者自己完成。完整版见Python金融量化知识星球。

结语

趋势跟踪交易策略是一种相对简单且易于理解的交易策略,其基本思想是在市场存在趋势时,通过跟随趋势方向来获取收益。在实践中,趋势跟踪交易策略被广泛应用于股票、期货、外汇等市场。

相对于其他交易策略,趋势跟踪策略的优势在于可以通过较少的交易来获取较高的收益率,尤其是在市场存在明显趋势的时候。同时,趋势跟踪交易策略也可以提高交易的胜率和风险控制能力,因为在趋势明显的时候,交易者可以更加自信地持有头寸,减少不必要的交易操作。

值得注意的是,趋势跟踪交易策略需要市场具备足够的趋势性,才能够发挥较好的效果。换句话说,趋势跟踪交易策略并非适用于所有市场和所有交易者,因为市场并非总是存在趋势,而且趋势的变化也很难预测。在中国A股市场中,由于市场波动较大、个股投机情绪较为普遍,市场整体趋势性相对较弱。因此,趋势跟踪交易策略在中国A股市场中的表现可能不如在某些其他市场中的表现。趋势跟踪交易策略需要有一定的市场观察能力和交易经验。需要观察市场走势、价格变化等多个方面的信息,并能够进行较为准确的判断,才能够更好地发挥趋势跟踪交易策略的效果。同时,还需要具备良好的风险控制能力,能够灵活地控制仓位和止损

889b5e32f9e18f7eeaea30fe2da91ce8.png

关于Python金融量化

c980a9bfce8b3d9e97d0dcb751a4dba7.png

专注于分享Python在金融量化领域的应用。加入知识星球,可以免费获取qstock源代码、30多g的量化投资视频资料、量化金融相关PDF资料、公众号文章Python完整源码、与博主直接交流、答疑解惑等。添加个人微信sky2blue2可获取八五折优惠。

288761bf44f5341d2f305eb563c72a31.jpeg

猜你喜欢

转载自blog.csdn.net/ndhtou222/article/details/129630884