社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Python金融量化 • 4 月前 • 462 次点击  



引言




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


本文将结合实际案例,利用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
 
462 次点击