市场上股票的价格总是在不断的上下波动,投资者通过低买高卖获利。第三篇将向大家介绍网格交易,一个动态的调仓策略,有效解决仓位和价位控制。
第三篇:网格交易—动态调仓策略
导语:市场上股票的价格总是在不断的上下波动,投资者通过低买高卖获利。第三篇将向大家介绍网格交易,一个动态的调仓策略,有效解决仓位和价位控制。
一、策略阐述
窥探网格交易
“追涨杀跌”与“高抛低吸”是两种完全不同的交易方式,也是大家听到较多的两个炒股词汇。顾名思义,“追涨杀跌”就是股价上涨买入,股价下跌卖出。“高抛低吸”就是股价下跌买入,股价上涨卖出。
但是纯粹的“高抛低吸”只是概念,根本无法形成一个交易系统。而且A股市场,只有股价上涨,投资者才能从中获利。如果股价跌跌不休,投资者每一次补仓都亏得更多。
网格交易与“高抛低吸”相似,但网格交易更为成熟,主要体现在以下两个方面:
1.价位管理:网格交易有明确的分批买入价格和卖出价格,不受任何主观意识影响。
2.仓位管理:网格交易有明确的买入仓位和卖出仓位,不受任何主观意识影响。
具体参考下图:
可以明确的是,上述网格交易中每笔交易都是盈利的。只要股价不断的上下波动,那么策略就可以不断的盈利。
网格交易的注意点
1. 网格交易需要规避长期下跌的个股,由于低买高卖的特征,网格交易盈利需要依赖股价波动,进行长期积累,如果个股长期下跌,那么持股市值亏损可能会吞没低买高卖的盈利。
2. 网格交易需要尽量寻找波动较高的股票,这样就可以进行更多次的低买高卖操作,提高网格交易收益率。
3. 因为网格交易没有止损,只有越跌越买,而且不盈利绝不退出。网格交易需要做好股价继续下跌的措施,保证在极限底部仍然要有现金使用。
4.网格交易因其上涨卖出的性质,决定了其追求的是绝对收益,以及保证每笔交易是盈利的。
构建网格交易
第一步:我们选取互联网游戏行业龙头:三七互娱为投资标的,该股票业绩优异,波动率大,且股价靠近安全边际。
第二步:建底仓,仓位40%。
第三步:设置网格,每上涨2%,卖出2000股,每下跌2%,买入2000股。
第四步:对三七互娱该股票进行网格交易回测。
以下为策略实现的基本信息:
策略实现难度:1
实现过程中所需要用到的API函数,ps:通过SuperMind量化交易平台API文档快速掌握:
| 需要用到的API函数 | 功能 |
|---|---|
| set_benchmark | 设置基准指数 |
| g. | 全局变量 |
| get_price | 获取历史行情数据 |
| get_datetime() | 获取当前时间 |
二、代码示意图
三、编写释义
本策略使用到了全局变量:g,策略编写上需与大家分享全局变量的概念,并讲述全局变量的使用
全局变量、局部变量、对象
一般量化策略同时含有全局变量、局部变量、对象,全局变量即为函数外部的变量,可以在整个程序访问。局部变量即为函数内部的变量,仅仅在某个函数内访问。对象内存储信息,比如资金账户对象context存储账户信息,bar_dict对象用于获取行情数据等等。
【示例】
全局变量:g
局部变量:sh、sz
对象:context、bar_dict
注意:每个量化交易平台的全局变量都是系统定义的,用户无法自定义一个新的全局变量,但是局部变量可以自定义。
全局变量g和context是不同的,context是账户对象。在自定义函数中,用户使用该对象的变量时,需在函数中传入context,也就是def 函数名(context):,但是全局变量g不同,即使函数不输入任何信息,还是可以直接使用全局变量g中的变量,可以方便策略编写。
四、最终结果
策略回测区间:2021.01.01-2022.12.31
回测资金:1000000
回测频率:分钟级
回测结果:红色曲线为策略收益率曲线,蓝色曲线为对应的基准指数收益率曲线
策略源代码:
In [ ]:
import numpy
import pandas as pd
# 初始化函数,全局只运行一次
def init(context):
g.stock = '002555.SZ'#设置网格交易的股票
set_benchmark(g.stock)
g.x1 = 0.02 #上涨多少卖出
g.x2 = 0.02 #下跌多少买入
g.y1 = 2000 #卖出多少
g.y2 = 2000 #买入多少
g.p = 0 #记录上一次交易的价格
g.p1 = 0 #下次买入价
g.p2 = 0 #下次卖出价
g.day = 1 #记录运行天数
g.tall = []#记录做t资金变动
pass
#每日开盘前9:00被调用一次,用于储存自定义参数、全局变量,执行盘前选股等
def before_trading(context):
if g.day == 1:
context.jc = True
else:
context.jc = False
g.t = []
## 开盘时运行函数
def handle_bar(context, bar_dict):
date=get_datetime().strftime('%Y%m%d%H%M%S')
if context.jc == True:
order_target_percent(g.stock,0.4)
p=history(g.stock, ['close'], 1, '1m', False, 'pre', is_panel=1)['close'].iloc[0]
g.p=p
g.p1 = g.p*(1-g.x1)
g.p2 = g.p*(1+g.x2)
else:
p=history(g.stock, ['close'], 1, '1m', False, 'pre', is_panel=1)['close'].iloc[0]
if p <g.p1:
order(g.stock,g.y2)
g.p=p
g.p1 = g.p*(1-g.x1)
g.p2 = g.p*(1+g.x2)
log.info('时间:{},执行买入操作,价位:{},数量:{}'.format(date,p,g.y2))
g.t.append(-1*(p*g.y2))
g.tall.append(-1*(p*g.y2))
elif p>g.p2:
order(g.stock,-g.y1)
g.p=p
g.p1 = g.p*(1-g.x1)
g.p2 = g.p*(1+g.x2)
log.info('时间:{},执行卖出操作,价位:{},数量:{}'.format(date,p,g.y1))
g.t.append(p*g.y1)
g.tall.append(p*g.y1)
else:
pass
## 收盘后运行函数,用于储存自定义参数、全局变量,执行盘后选股等
def after_trading(context):
if g.day==1:
log.info('首日建仓')
pass
else:
log.info('当日做T资金变动:{}'.format(sum(g.t)))
log.info('全部做T资金变动:{}'.format(sum(g.tall)))
pass
g.day=g.day+1
查看以上策略详情请到supermind量化交易官网查看:同花顺Supermind量化交易 风险控制建模--网格交易—动态调仓策略