搭建过程
每个交易者都应该形成一套自己的交易系统。
很多交易者也清楚知道,搭建自己交易系统的重要性。现实中,从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赚钱,必须学习网格策略。
网格策略
网格策略,顾名思义,我们需要划分出一个个的格子,组成网格。然后选择一个标的,可以是基金,也可以是股票。再选择这个标的合理的价格区间,把这个区间内的价格按照一定的间隔,划分成一个一个的格子。每上涨一格,即卖出一份,每下跌一格,即买入一份。类似下图:
因此,网格策略不依赖于人为的判断,像预设程序一样,在一定区间内的不断低买高卖,高抛低吸,循环往复,在不断地震荡中获得利润。
网格策略的设计分为以下几步:
划定网格范围。确定网格的最高点和最低点,也就是划定震荡的范围。
等分网格数量。在最高价和最低价之间等分成网格。等分的间距一般为该股的日平均振幅。
标定网格价格。在网格线上都有一个价位,当股价触及这个价位时按这个价位买卖股票。
分配操作资金。将投入的总资金除以网格数量,得到每个网格可交易的资金量。比如投入1万元,那么最高点的网格持有1万元可用资金和0元股票市值,最低点的网格持有1万元的股票市值和0元可用资金。
我们设计后的网格图下图所示。
实际操作中,当股价处于什么网格,那么对比该网格的可用资金,相应地买卖股票以调整仓位。也就是跌一格就买,涨一格就卖,赚的是一格的利润。如下图所示。
网格策略的缺点:
使用于震荡行情会有较好的效果。如果由震荡转为趋势行情的话,会出现比较尴尬的情况:“上升趋势突破高点后无筹码”,“下跌趋势跌破低点满仓亏损”。
资金的使用率较低,即首仓买入时,剩下的资金要作为下跌时加仓使用,而上涨时还需要卖出。资金利用率低意味着收益率低。因此网格数量不能太多,否则资金被分散太多。
频繁交易对手续费和滑点比较敏感。
代码设计
接下来我们设计一个网格策略,使用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万的市值。回测效果如下所示:
总结
本文是采用了网格绑定固定涨跌幅的方法,在一定程度上可以让网格大小跟随股价的变化情况自动调整。也有一些优化策略是将网格绑定波段指标,原理上大同小异。
学会了网格策略的思想之后,接下来我们就可以把这个策略融入到我们的交易系统里面了!
说明
此系列为连载专栏,完整代码会上传知识星球《玩转股票量化交易》!作为会员们的学习资料。
想要加入知识星球《玩转股票量化交易》的小伙伴记得先微信call我获取福利!
非星球会员需要的话,需要单独联系我购买!
知识星球介绍点击:知识星球《玩转股票量化交易》精华内容概览