15天搭建ETF量化交易系统Day9—玩大A必学网格策略

08a1c136c24571eed241c792c7a53892.png

搭建过程

3fee63ddeefeeaf08335c57c8132d987.png

每个交易者都应该形成一套自己的交易系统。

很多交易者也清楚知道,搭建自己交易系统的重要性。现实中,从0到1往往是最难跨越的一步。
授人鱼不如授人以渔,为了帮助大家跨出搭建量化系统的第一步,我们决定推出这个主题系列。
这个系列中,我们用Python从0开始一步步搭建出一套ETF量化交易系统(选择ETF标的是因为对于普通交易者来说,ETF相对于选强势股难度要小,而且没有退市风险)。大家可以跟随着我们的实现路径来一起学习,从过程中掌握方法。
掌握了方法之后,你可以换成期货系统、比特币系统、美股系统,然后在实战中不断去完善自己的系统了。
搭建一套ETF量化交易系统涉及多个模块和组件的协同工作,包括数据源模块、量化策略模块、可视化模块、数据库模块、回测评估模块、自动交易模块等等。
DAY1链接如下:15天搭建ETF量化交易系统Day1—数据源模块
DAY2链接如下:15天搭建ETF量化交易系统Day2—图形显示模块
DAY3链接如下:15天搭建ETF量化交易系统Day3—上手经典回测框架
DAY4链接如下:15天搭建ETF量化交易系统Day4—玩转海龟交易策略
DAY5链接如下:15天搭建ETF量化交易系统Day5—打造实盘量化机器人
DAY6链接如下:15天搭建ETF量化交易系统Day6—打通同花顺自动交易
DAY7链接如下:15天搭建ETF量化交易系统Day7—全自动化交易系统
DAY8链接如下:15天搭建ETF量化交易系统Day8—强化自动交易模块
如果我们的ETF量化交易系统选择的品种是A股的话,这里分享一个客观数据:
A股自2007年首次站上3000点以来,至今16年的时间打了50次“3000点保卫战”。
由此可见,A股大部分时间是处在震荡行情。震荡行情的特点是股价在一个区间内频繁波动、节奏很难踏准。假设某股09年买入是10块,经过了一系列的涨跌之后,到了今年价格还是回到了10块,如果是简单地持有该股的投资方法,意味着十几年的时间不赚不赔。
网格策略是针对于震荡行情所设计的一个策略,可以依赖波动盈利,即使在震荡行情内我们也可以获利。要想做A股的ETF赚钱,必须学习网格策略。

b6bd205022bbf13827581279e0c768c8.png

网格策略

d284e2bb479faebf06cfe4d58ddf2a56.png

网格策略,顾名思义,我们需要划分出一个个的格子,组成网格。然后选择一个标的,可以是基金,也可以是股票。再选择这个标的合理的价格区间,把这个区间内的价格按照一定的间隔,划分成一个一个的格子。每上涨一格,即卖出一份,每下跌一格,即买入一份。类似下图:

63d2ec08cf4103f5034d50edbeed9c55.png

因此,网格策略不依赖于人为的判断,像预设程序一样,在一定区间内的不断低买高卖,高抛低吸,循环往复,在不断地震荡中获得利润。

网格策略的设计分为以下几步:

  • 划定网格范围。确定网格的最高点和最低点,也就是划定震荡的范围。

  • 等分网格数量。在最高价和最低价之间等分成网格。等分的间距一般为该股的日平均振幅。

  • 标定网格价格。在网格线上都有一个价位,当股价触及这个价位时按这个价位买卖股票。

  • 分配操作资金。将投入的总资金除以网格数量,得到每个网格可交易的资金量。比如投入1万元,那么最高点的网格持有1万元可用资金和0元股票市值,最低点的网格持有1万元的股票市值和0元可用资金。

我们设计后的网格图下图所示。

30aeed380cfcdd2e5a3d4d13e0cde37d.png

实际操作中,当股价处于什么网格,那么对比该网格的可用资金,相应地买卖股票以调整仓位。也就是跌一格就买,涨一格就卖,赚的是一格的利润。如下图所示。

e3aa98032defebb2fc79e5ec7905fdf3.png

网格策略的缺点:

  • 使用于震荡行情会有较好的效果。如果由震荡转为趋势行情的话,会出现比较尴尬的情况:“上升趋势突破高点后无筹码”,“下跌趋势跌破低点满仓亏损”。

  • 资金的使用率较低,即首仓买入时,剩下的资金要作为下跌时加仓使用,而上涨时还需要卖出。资金利用率低意味着收益率低。因此网格数量不能太多,否则资金被分散太多。

  • 频繁交易对手续费和滑点比较敏感。

0302d3e2e5ca910688073352e57ddeac.png

代码设计

128de011e935ab540b80c9a1ffe00c15.png

接下来我们设计一个网格策略,使用Backtrader来回测下网格策略的使用效果。策略大致思想如下:

首先动态地得到该股60分钟级别数据的60周期的最低价移动序列,选择最低价作为基准的原因是我更偏向于做反转类的行情。

Backtrader的关键代码为:

self.lowest = bt.indicators.Lowest(self.data.low, period=60, subplot=False)

然后划定网格的间距为1%,太小的网格虽然能够覆盖更多的波动,但是带来的是频繁的交易,也会更大程度受到手续费和滑点额影响。网格的数量为10个,其中有2个是埋在最低价之下的,为的是防范下跌趋势跌破低点这个风险。

Backtrader的关键代码为:

pct_levels = [x for x in np.arange(1 - self.params.grid_perc * 2, 1 + self.params.grid_perc * 8, self.params.grid_perc)]

将最低价移动序列与网格相乘即得到了动态的网格价格区间。

Backtrader的关键代码为:

self.price_levels = [self.lowest * x for x in pct_levels]

每个交易日判断的逻辑比较简单,判断当前股价的上一格和下一格的价位,跌一格就买,涨一格就卖。使用Backtrader中的order_target_percent函数来调整目标仓位。

Backtrader的关键代码为:

self.order_target_percent(
    target=((len(self.price_levels) - 1)-self.last_price_index) / (len(self.price_levels) - 1))

我们回测516350半导体最近一个月60分钟数据,初始资金是10万的话最终可以做到10.5万的市值。回测效果如下所示:

ee514f771d9fe0dc5b307366576b03fc.png

02c62db6885304a2221ab2698d3504e8.png

总结

cacab8087efbf2f7dd3dc9825a28241b.png

本文是采用了网格绑定固定涨跌幅的方法,在一定程度上可以让网格大小跟随股价的变化情况自动调整。也有一些优化策略是将网格绑定波段指标,原理上大同小异。

学会了网格策略的思想之后,接下来我们就可以把这个策略融入到我们的交易系统里面了!

说明

此系列为连载专栏,完整代码会上传知识星球《玩转股票量化交易》!作为会员们的学习资料。

想要加入知识星球《玩转股票量化交易》的小伙伴记得先微信call我获取福利!

非星球会员需要的话,需要单独联系我购买!

知识星球介绍点击:知识星球《玩转股票量化交易》精华内容概览

8950d689a1c7c1a1092d7e8e248a5953.jpeg

<think>嗯,用户想要在Ptrade软件上进行ETF网格交易策略的回测,需要示例代码。首先,我得回忆一下Ptrade支持的API和语法。Ptrade用的是Python,所以代码应该是Python写的。网格交易的基本逻辑是设定价格区间,分成多个网格,价格波动时自动买卖。 首先,需要确定ETF代码,比如510050.SH。然后设置网格参数,比如基准价、网格间距、数量。初始化的时候,可能需要获取历史数据来计算基准价,比如过去20的均价。然后,在每开盘前取消未成交的订单,避免重复下单。 接下来,在每次的定时任务里,比如每30分钟执行一次,获取当前持仓和最新价。计算当前价与基准价的偏离百分比,决定买入或卖出。比如,偏离-3%时买入一格,偏离+3%时卖出一格。这里可能需要用round函数来确保网格的间距正确。 还需要处理下单逻辑,检查是否有可用资金或持仓,避免无效操作。比如,买入时要确保资金足够,卖出时要确保有足够的持仓。每次下单后,记录基准价到context变量,避免重复触发。 然后,用户可能需要回测结果的分析,比如年化收益率、最回撤等指标。Ptrade的回测报告会自动生成这些数据,所以代码里不需要额外处理,但用户可能需要知道如何查看报告。 还要考虑一些常见问题,比如网格间距调整、止盈止损、不同时间段的参数优化。比如,用户可能想知道如何修改网格间距,或者在策略中加入止盈条件。这时候可以提供一些修改建议,比如调整grid_percent或者添加止损逻辑。 另外,引用中的信息提到Ptrade支持算法交易和网格策略,所以代码示例需要符合这些功能。确保代码中使用了正确的API,比如order_target和get_position。还要注意Ptrade的定时任务设置,比如schedule_daily和schedule_timer。 最后,测试代码是否存在语法错误,比如变量名是否正确,函数调用是否恰当。例如,get_history的正确参数,order_target的用法是否正确。确保用户可以直接复制代码进行回测,并根据需要调整参数。 总结一下,步骤是:初始化参数,定时任务处理订单,计算网格触发条件,执行买卖操作,记录状态。同时,提供优化方向和常见问题解答,帮助用户进一步调整策略。</think>以下是为Ptrade平台设计的ETF网格交易策略回测示例代码,包含完整逻辑和注释说明: ```python # 导入Ptrade量化交易API from ptrade.api import * import numpy as np # 初始化函数 def initialize(context): # 设置标的为上证50ETF context.symbol = "510050.SH" # 网格参数设置 context.benchmark_price = 0 # 基准价格 context.grid_interval = 0.03 # 3%网格间距 context.grid_qty = 1000 # 每格交易数量 # 定时任务设置 schedule_daily(reset_benchmark, time="09:30") # 每日开盘重置基准价 schedule_timer(check_grid, frequency="30m") # 每30分钟检查网格 # 重置基准价函数 def reset_benchmark(context): # 获取前20日收盘价计算基准 hist = get_history(20, "1d", "close", [context.symbol]) context.benchmark_price = np.mean(hist[context.symbol]) cancel_all_orders() # 取消前日未成交订单 # 网格检查函数 def check_grid(context): price = get_price(context.symbol) # 获取实时价格 position = get_position(context.symbol) # 获取持仓 # 计算价格偏离百分比 deviation = (price - context.benchmark_price)/context.benchmark_price # 向下突破网格 if deviation <= -context.grid_interval: buy_qty = context.grid_qty * round(abs(deviation)/context.grid_interval) if context.cash >= buy_qty * price: order_target(context.symbol, position + buy_qty) context.benchmark_price = price # 更新基准价 # 向上突破网格 elif deviation >= context.grid_interval: sell_qty = min(position, context.grid_qty * round(deviation/context.grid_interval)) if sell_qty > 0: order_target(context.symbol, position - sell_qty) context.benchmark_price = price # 更新基准价 # 获取价格函数 def get_price(symbol): bars = get_latest_bars(symbol, 1) return bars[-1]["close"] # 策略回测参数设置 def backtest_setting(): return { "start": "2020-01-01", "end": "2023-12-31", "cash": 1000000, "commission": 0.0002, "slippage": 0.001 } ``` §§代码说明与优化方向§§ 1. **参数优化方向**: - 网格间距$grid\_interval$可调整为动态参数,根据波动率指标ATR动态计算[^4] - 加入止盈止损机制,当累计收益率超过$15\%$时平仓[^2] 2. **风险控制模块**: ```python # 可添加最回撤控制 if context.portfolio.max_drawdown > 0.2: order_target(context.symbol, 0) print("触发最回撤20%止损") ``` 3. **进阶功能扩展**: - 支持多ETF轮动配置,通过夏普比率动态选择标的[^1] - 添加盘口流动性检测,避免单冲击成本[^3] 4. **回测结果分析**: Ptrade回测报告将自动生成以下指标: - 年化收益率$R_{annual} = \frac{P_{end} - P_{start}}{P_{start}} \times \frac{365}{days}$ - 最回撤$MDD = \max_{0≤i<j≤n}( \frac{P_i - P_j}{P_i} )$ - 胜率$WR = \frac{\sum profitable\ trades}{\sum total\ trades}$ §§常见问题解答§§ 1. **如何修改网格间距**? 调整`context.grid_interval`参数,建议保持$0.01≤interval≤0.05$,过小会增加交易频率和摩擦成本[^2] 2. **如何处理分红除权**? Ptrade已自动处理复权价格,使用`get_history()`获取的是后复权数据 3. **如何添加交易信号提醒**? 可在订单函数后添加: ```python send_message(f"已下单{quantity}股{context.symbol} @ {price}") ``` 4. **策略容量评估**: 建议单策略资金规模不超过$2000$万元,避免在低流动性ETF上产生显著冲击成本[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值