Py学习  »  Python

如何用Python捕捉市场趋势:从支撑与阻力到量化回测

Python金融量化 • 1 年前 • 1061 次点击  



引言




价格突破交易策略常用于捕捉市场的趋势性波动,其基本原理是当价格突破某个关键的支撑位或阻力位时,市场往往会延续这一方向,形成新的趋势。这类策略通常被交易者用来识别市场的突破点,以便及时介入或退出,从而获得盈利。无论是短线交易还是中长期投资,价格突破策略都具有重要的实战意义。在实际操作中,价格突破策略的关键在于如何准确识别支撑和阻力位,并判断价格突破后的延续性。通过结合历史数据和技术指标,交易者可以有效过滤掉假突破,减少无效交易带来的风险。


本文将结合实际案例,利用Python代码展示如何构建价格突破交易策略,并通过backtrader回测分析验证策略的有效性。





数据获取与初步处理




首先从创业板获取历史数据,并设置一个20天的窗口期来计算支撑线和阻力线。支撑线为过去20天的最低价,阻力线为过去20天的最高价。根据这些线,我们可以识别出看涨和看跌的突破。


  1. import numpy as np

  2. import pandas as pd

  3. import qstock as qs

  4. import backtrader as bt

  5. import mplfinance as mpf

  6. import matplotlib.pyplot as plt

  7. #正常显示画图时出现的中文和负号

  8. from pylab import mpl

  9. mpl.rcParams['font.sans-serif']=['SimHei']

  10. mpl.rcParams['axes.unicode_minus']=False

  1. #获取创业板数据

  2. df=qs.get_data(code_list='cyb',start='20100101',end='20240906')

  3. window_length =20  # 窗口长度设为20  

  4. # 计算过去20个交易日最低价的最小值,作为支撑线  

  5. df['支撑线']= df['low'].rolling(window=window_length).min()

  6. # 计算过去20个交易日最高价的最大值,作为阻力线  

  7. df['阻力线']= df['high'].rolling(window=window_length).max()  

  8. # 识别看涨突破(收盘价高于阻力线)  

  9. df[ '看涨突破']= df['close']> df['阻力线'].shift()  

  10. # 识别看跌突破(收盘价低于支撑线)  

  11. df['看跌突破']= df['close']< df['支撑线'].shift()

  1. # 为看涨和看跌突破点创建新列,并用NaN值填充  

  2. df1=df.loc['20240101':]

  3. df1['看涨突破点']= np.nan  

  4. df1['看跌突破点']= np.nan  

  5. # 在出现看涨和看跌突破的位置,用收盘价填充新列  

  6. df1.loc[df1['看涨突破'],'看涨突破点']= df1['close']  

  7. df1.loc[df1['看跌突破'],'看跌突破点']= df1['close']  

  8. # 为支撑线、阻力线、看涨突破点和看跌突破点创建附加图  

  9. ap1 = mpf. make_addplot(df1['支撑线'], color='green')  

  10. ap2 = mpf.make_addplot(df1['阻力线'], color='red')  

  11. ap3 = mpf.make_addplot(df1['看涨突破点'], scatter=True, markersize=100, color='blue')  

  12. ap4 = mpf.make_addplot(df1['看跌突破点'], scatter=True, markersize=100, color='orange')  

  13. # 创建带有附加图的K线图  

  14. mpf.plot(df1, type='candle', style='charles',  addplot=[ap1, ap2, ap3, ap4], figsize=(10,6))

在上面的代码中,以创业板指数价格为例,计算了20日的支撑线和阻力线,并在K线图上标记了看涨和看跌的突破点,有助于我们直观了解价格何时突破这些关键水平。




实现价格突破交易策略




接下来,我们使用Backtrader框架来实现突破交易策略。在这个策略中,当价格突破阻力线时,我们买入;当价格跌破支撑线时,我们卖出。同时,我们设置了满仓买卖的条件,且每次交易的数量必须为100的整数倍。


  1. # 定义突破策略类

  2. classBreakoutStrategy(bt.Strategy):

  3.    params =(

  4.        ('window_length',200),  # 窗口期长度

  5.    )

  6.    def __init__(self):

  7.        # 初始化高点和低点的滚动窗口

  8.        self.highest = bt.indicators.Highest(self.data.high, period=self.params.window_length)

  9.        self.lowest = bt.indicators.Lowest(self.data.low, period=self.params.window_length)

  10.        self.buy_signal = bt.indicators.CrossUp(self.data .close, self.highest(-1))  

  11. # 向上突破信号

  12.        self.sell_signal = bt.indicators.CrossDown(self.data.close, self.lowest(-1))  # 向下突破信号

  13.    def next(self):

  14.        # 计算可购买的股票数量,并确保是100的整数倍

  15.        cash = self.broker.getcash()  # 获取当前的现金

  16.        stock_price = self.data.close[0]  # 当前的收盘价

  17.        size = int(cash // stock_price //100*100)  

  18. # 可购买的股票数量,确保是100的整数倍

  19.        # 检查是否有买入信号,并且当前没有持仓,进行满仓买入

  20.        if self.buy_signal and size >0and self.position.size ==0:

  21.            self.buy(size=size)  # 满仓买入

  22.        # 检查是否有卖出信号,并且当前有持仓,卖出全部持仓

  23.        elif self.sell_signal and self.position.size >0:

  24.            self.sell(size=self.position.size)  

  25. # 卖出全部持仓

接下来,使用Backtrader框架来实现突破交易策略。在这个策略中,当价格突破阻力线时,买入;当价格跌破支撑线时,卖出。同时,设置了满仓买卖的条件,且每次交易的数量必须为100的整数倍。

  1. qs.bt_result(code='中国平安',

  2.    start='20100101',

  3.    end='20240906',

  4.    strategy=BreakoutStrategy,

  5.    startcash=10000000.0,

  6.    commission=0.0001,

  7. )

下面是买入持有中国平安在回测期间的回测表现。从回测结果来看,在回测期间内其价格突破策略优于简单的买入持有。

  1. df0=qs.data_feed('中国平安',index='hs300',start='20100101',end='20240906')

  2. qs.start_backtest(df0)





结语




价格突破交易策略是一种简单且直观的技术分析工具,通过捕捉价格突破支撑或阻力的时机,能够在市场趋势中获得不错的收益。在本文中,我们展示了如何通过Python代码实现价格突破策略,并结合实际市场数据进行了回测分析。尽管该策略在长期内表现较好,但较大的最大回撤提醒我们,在实际应用中可能需要配合其他风险管理手段,如止损或资金管理策略,以控制潜在的损失。

关于Python金融量化








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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/173975