价格突破交易策略常用于捕捉市场的趋势性波动,其基本原理是当价格突破某个关键的支撑位或阻力位时,市场往往会延续这一方向,形成新的趋势。这类策略通常被交易者用来识别市场的突破点,以便及时介入或退出,从而获得盈利。无论是短线交易还是中长期投资,价格突破策略都具有重要的实战意义。在实际操作中,价格突破策略的关键在于如何准确识别支撑和阻力位,并判断价格突破后的延续性。通过结合历史数据和技术指标,交易者可以有效过滤掉假突破,减少无效交易带来的风险。
本文将结合实际案例,利用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))
在上面的代码中,以创业板指数价格为例,计算了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,
)
下面是买入持有中国平安在回测期间的回测表现。从回测结果来看,在回测期间内其价格突破策略优于简单的买入持有。
df0=qs.data_feed('中国平安',index='hs300',start='20100101',end='20240906')
qs.start_backtest(df0)
价格突破交易策略是一种简单且直观的技术分析工具,通过捕捉价格突破支撑或阻力的时机,能够在市场趋势中获得不错的收益。在本文中,我们展示了如何通过Python代码实现价格突破策略,并结合实际市场数据进行了回测分析。尽管该策略在长期内表现较好,但较大的最大回撤提醒我们,在实际应用中可能需要配合其他风险管理手段,如止损或资金管理策略,以控制潜在的损失。
专注于分享Python在金融量化领域的应用。加入知识星球,可以免费获取qstock源代码、30多g的量化投资视频资料、量化金融相关PDF资料、公众号文章Python完整源码、与博主直接交流、答疑解惑等。添加个人微信sky2blue2可获取相关优惠。