引言
在金融市场中,价格的突破往往伴随着强烈的趋势,是投资者捕捉机会的关键点。突破策略因此成为一种广受欢迎的趋势跟随策略,用于在价格超出特定区间时入场或出场,以此捕捉潜在的盈利机会。
本文将介绍 Carver 突破指标策略,并通过 Python 和 Backtrader 量化框架来实现回测。Carver 突破策略的核心在于识别价格突破的边界条件,判断价格是否超出波动区间。本文将详细解释策略逻辑、实现代码,并进行交易回测,最后对回测结果进行分析。
本文使用qstock获取数据、可视化和量化回测,关于 qstock 更详细的使用方法, 请参考 qstock 专题系列文章(点击跳转)。加入Python金融量化知识星球,可以获取qstock最新版及教程、30多g的量化投资视频资料、量化金融相关PDF资料、公众号文章Python完整源码、与博主直接交流、答疑解惑等。添加个人微信sky2blue2咨询可获取8.5折优惠。:
实战解析:如何利用backtrader进行突破交易策略的量化回测
Carver突破策略的核心逻辑
Carver 突破指标通过以下步骤实现对突破点的识别:
计算滚动最高价和最低价:在特定周期内计算最高和最低价格区间。
计算滚动均值:使用最高价和最低价的均值作为参考,便于观察价格在区间中的相对位置。
计算缩放后的价格:将当前价格相对于区间上下限进行缩放,得出当前价格在区间内的位置。
生成买入或卖出信号:当价格接近上限或下限时,认为可能发生突破,从而生成交易信号。
策略实现代码
1. 计算滚动最高、最低价及缩放价格 首先,我们使用 Python 代码计算滚动最高、最低价格及缩放后的价格,生成初步的策略信号。
import pandas as pd
import numpy as np
import qstock as qs
df=qs.get_data('cybETF',start='20110101',end='20241108')
window = 20
# 计算20天滚动最高价和最低价
df['Rolling_Max'] = df['close'].rolling(window=window).max()
df['Rolling_Min'] = df['close'].rolling(window=window).min()
# 计算滚动均值
df['Rolling_Mean'] = (df['Rolling_Max'] + df['Rolling_Min']) / 2
# 计算缩放后的价格
df['Scaled_Price'] = (df['close'] - df['Rolling_Min']) / (df['Rolling_Max'] - df['Rolling_Min'])
# 设定买入和卖出阈值
buy_threshold = 0.9
sell_threshold = 0.1
# 生成信号
df['Signal'] = np.where(df['Scaled_Price'] > buy_threshold, 'Buy',
np.where(df['Scaled_Price'] < sell_threshold, 'Sell', 'Hold'))
qs.line(df[['close','Rolling_Max','Rolling_Min','Rolling_Mean']][-250:])
2. 使用 Backtrader 进行量化回测
为了更真实地模拟交易情况,我们将使用 Backtrader 量化框架来实现该策略,以下是完整的代码实现。
import backtrader as bt
from datetime import datetime
class CarverBreakoutStrategy(bt.Strategy):
params = (
('period', 20), # 设置滚动窗口的时间周期
('buy_threshold', 0.9), # 买入阈值
('sell_threshold', 0.1), # 卖出阈值
)
def __init__(self):
# 定义指标:滚动最大、最小值和均值
self.highest = bt.ind.Highest(self.data.close, period=self.params.period)
self.lowest = bt.ind.Lowest(self.data.close, period=self.params.period)
self.scaled_price = (self.data.close - self.lowest) / (self.highest - self.lowest)
def next(self):
# 获取当前的持仓
position_size = self.position.size
# 检查买入条件
if self.scaled_price[0] > self.params.buy_threshold:
# 满仓买入 100 的整数倍股数
if position_size == 0: # 当前无仓位
size = int(self.broker.getcash() / self.data.close[0] / 100) * 100
if size > 0:
self.buy(size=size)
# 检查卖出条件
elif self.scaled_price[0] < self.params.sell_threshold:
# 卖出所有持仓
if position_size > 0:
self.close()
qs.bt_result('晓程科技',start='2014-01-01',end='2024-11-08',strategy=CarverBreakoutStrategy)
下面是同一标的相同回测期间使用买入持有的回测结果:
df0=qs.data_feed('晓程科技',index='cyb',start='2014-01-01',end='2024-11-09')
qs.start_backtest(df0)
从回测结果看,Carver 突破策略与买入持有策略相比,年化收益率显著提升(16.8% 对比 5.2%),且累计收益达到 407.5%,远超买入持有的 70.5%,表现出强劲的收益能力。然而,Carver 突破策略的波动率较高(42.8%),最大回撤为 -55.6%,尽管低于买入持有的 -83.68%,但风险依然较大。夏普比率为 0.57,低于买入持有的 1.04,显示出在风险调整后收益的优势较弱。Calmar 比率为 0.30,表明策略在面临较大波动的同时仍具备一定的回报能力。整体来看,Carver 突破策略适合追求高回报的投资者,但需承受较高的波动和回撤。
结语
Carver 突破策略利用了滚动价格区间的突破效应,是一种简单但有效的趋势跟随型策略。在市场趋势明显时,该策略能帮助投资者抓住上涨或下跌动量,获得超额收益。本文通过 Backtrader 框架将该策略落地,并对策略进行了详尽回测分析。然而需要注意的是,该策略的效果可能受限于特定市场环境,在市场趋势明显时该策略能有效发挥作用,但在震荡市场中策略效果可能不佳。
在实际应用中,可结合不同的指标或进行参数优化来提高策略的稳健性。希望本文的介绍能帮助您深入理解和实现突破策略,并在量化交易实践中获得更优效果。
关于Python金融量化
专注于分享Python在金融量化领域的应用。加入知识星球,可以免费获取qstock源代码、30多g的量化投资视频资料、量化金融相关PDF资料、公众号文章Python完整源码、与博主直接交流、答疑解惑等。添加个人微信sky2blue2咨询可获取8.5折优惠。