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

引言

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

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

数据获取与初步处理


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

import numpy as np
import pandas as pd 
import qstock as qs
import backtrader as bt
import mplfinance as mpf
import matplotlib.pyplot as plt
#正常显示画图时出现的中文和负号
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False
#获取创业板数据
df=qs.get_data(code_list='cyb',start='20100101',end='20240906')
window_length =20  # 窗口长度设为20  
# 计算过去20个交易日最低价的最小值,作为支撑线  
df['支撑线']= df['low'].rolling(window=window_length).min()
# 计算过去20个交易日最高价的最大值,作为阻力线  
df['阻力线']= df['high'].rolling(window=window_length).max()  
# 识别看涨突破(收盘价高于阻力线)  
df['看涨突破']= df['close']> df['阻力线'].shift()  
# 识别看跌突破(收盘价低于支撑线)  
df['看跌突破']= df['close']< df['支撑线'].shift()
# 为看涨和看跌突破点创建新列,并用NaN值填充  
df1=df.loc['20240101':]
df1['看涨突破点']= np.nan  
df1['看跌突破点']= np.nan  
# 在出现看涨和看跌突破的位置,用收盘价填充新列  
df1.loc[df1['看涨突破'],'看涨突破点']= df1['close']  
df1.loc[df1['看跌突破'],'看跌突破点']= df1['close']  
# 为支撑线、阻力线、看涨突破点和看跌突破点创建附加图  
ap1 = mpf.make_addplot(df1['支撑线'], color='green')  
ap2 = mpf.make_addplot(df1['阻力线'], color='red')  
ap3 = mpf.make_addplot(df1['看涨突破点'], scatter=True, markersize=100, color='blue')  
ap4 = mpf.make_addplot(df1['看跌突破点'], scatter=True, markersize=100, color='orange')  
# 创建带有附加图的K线图  
mpf.plot(df1, type='candle', style='charles',  addplot=[ap1, ap2, ap3, ap4], figsize=(10,6))

4a9444038dd58e2522c4c0d96d2ece01.png

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

实现价格突破交易策略

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

# 定义突破策略类
classBreakoutStrategy(bt.Strategy):
    params =(
        ('window_length',200),  # 窗口期长度
    )
    def __init__(self):
        # 初始化高点和低点的滚动窗口
        self.highest = bt.indicators.Highest(self.data.high, period=self.params.window_length)
        self.lowest = bt.indicators.Lowest(self.data.low, period=self.params.window_length)
        self.buy_signal = bt.indicators.CrossUp(self.data.close, self.highest(-1))  
# 向上突破信号
        self.sell_signal = bt.indicators.CrossDown(self.data.close, self.lowest(-1))  # 向下突破信号
    def next(self):
        # 计算可购买的股票数量,并确保是100的整数倍
        cash = self.broker.getcash()  # 获取当前的现金
        stock_price = self.data.close[0]  # 当前的收盘价
        size = int(cash // stock_price //100*100)  
        # 可购买的股票数量,确保是100的整数倍
        # 检查是否有买入信号,并且当前没有持仓,进行满仓买入
        if self.buy_signal and size >0and self.position.size ==0:
            self.buy(size=size)  # 满仓买入
        # 检查是否有卖出信号,并且当前有持仓,卖出全部持仓
        elif self.sell_signal and self.position.size >0:
            self.sell(size=self.position.size)  
            # 卖出全部持仓

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

qs.bt_result(code='中国平安',
    start='20100101',
    end='20240906',
    strategy=BreakoutStrategy,
    startcash=10000000.0,
    commission=0.0001,
)

715f9ab6192d3adf3686d4c2a5d5e825.png

a4c3f54d3a698c5cdfc918cb1bb7f8bc.png

132db3c4f5f59d2c507004f63cd973e5.png

38231681035150274cacd1b1212101ca.png

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

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

c058cba4066c5946712049f538d4f45a.png

b9623a0c794b1ae6742c9460f11f719c.png

结语

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

18abfc0cdd9f60f877fd151470178620.png

关于Python金融量化

c2fb199d48dffca1355b5602e3f7e1b3.png

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

b7ca74900c0ac92f1eb4073b60d41bb3.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值