失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 第四章:经典量化策略集锦(第三篇:网格交易—动态调仓策略)

第四章:经典量化策略集锦(第三篇:网格交易—动态调仓策略)

时间:2020-05-07 19:32:20

相关推荐

第四章:经典量化策略集锦(第三篇:网格交易—动态调仓策略)

导语:市场上股票的价格总是在不断的上下波动,投资者通过低买高卖获利。第三篇将向大

家介绍网格交易,一个动态的调仓策略,有效解决仓位和价位控制。

一、策略阐述

窥探网格交易

“追涨杀跌”与“高抛低吸”是两种完全不同的交易方式,也是大家听到较多的两个炒

股词汇。顾名思义,“追涨杀跌”就是股价上涨买入,股价下跌卖出。“高抛低吸”就是股

价下跌买入,股价上涨卖出。

但是纯粹的“高抛低吸”只是概念,根本无法形成一个交易系统。而且A 股市场,只有

股价上涨,投资者才能从中获利。如果股价跌跌不休,投资者每一次补仓都亏得更多。

网格交易与“高抛低吸”相似,但网格交易更为成熟,主要体现在以下两个方面:

1.价位管理:网格交易有明确的分批买入价格和卖出价格,不受任何主观意识影响。

2.仓位管理:网格交易有明确的买入仓位和卖出仓位,不受任何主观意识影响。

具体参考下图:

可以明确的是,上述网格交易中每笔交易都是盈利的。只要股价不断的上下波动,那么

策略就可以不断的盈利。

----------------------- Page 78-----------------------

网格交易的注意点

1. 网格交易需要规避长期下跌的个股,由于低买高卖的特征,网格交易盈利需要依赖股

价波动,进行长期积累,如果个股长期下跌,那么持股市值亏损可能会吞没低买高卖的盈利。

2. 网格交易需要尽量寻找波动较高的股票,这样就可以进行更多次的低买高卖操作,提

高网格交易收益率。

3. 因为网格交易没有止损,只有越跌越买,而且不盈利绝不退出。网格交易需要做好股

价继续下跌的措施,保证在极限底部仍然要有现金使用。

4. 网格交易因其上涨卖出的性质,决定了其追求的是绝对收益,以及保证每笔交易是盈

利的。

构建网格交易

第一步:我们选取互联网游戏行业龙头:三七互娱为投资标的,该股票业绩优异,波动

率大,且股价靠近安全边际。

第二步:建底仓,仓位40% 。

第三步:设置网格,每上涨2% ,卖出2000 股,每下跌2% ,买入2000 股。

第四步:对三七互娱该股票进行网格交易回测,并打印日志。

以下为策略实现的基本信息:

策略实现难度:1

实现过程中所需要用到的API 函数,ps:通过 MindGo 量化交易平台 API 文档快速掌握:

需要用到的API 函数功能

set_benchmark 设置基准指数

g. 全局变量

account.positions 查询账户信息

get_price获取历史行情数据

get_datetime() 获取当前时间

----------------------- Page 79-----------------------

二、代码示意图

三、编写释义

本策略使用到了全局变量:g,策略编写上需与大家分享全局变量的概念,并讲述全局

变量的使用

全局变量、局部变量、对象

一般量化策略同时含有全局变量、局部变量、对象,全局变量即为函数外部的变量,可

以在整个程序访问。局部变量即为函数内部的变量,仅仅在某个函数内访问。对象内存储信

息,比如资金账户对象account 存储账户信息,data 对象用于获取行情数据等等。

【示例】

全局变量:g

局部变量:sh、sz

对象:account、data

注意:每个量化交易平台的全局变量都是系统定义的,用户无法自定义一个新的全局变

量,但是局部变量可以自定义。

全局变量 g 和 account 是不同的,account 是账户对象。在自定义函数中,用户使用该对

象的变量时,需在函数中传入 account,也就是 def 函数名(account):,但是全局变量 g 不同,

即使函数不输入任何信息,还是可以直接使用全局变量 g 中的变量,可以方便策略编写。

----------------------- Page 80-----------------------

四、最终结果

策略回测区间:.11.01-.02.11

回测资金:1000000

回测频率:分钟级

回测结果:红色曲线为策略收益率曲线,蓝色曲线为对应的基准指数收益率曲线

网格交易日志 (局部):

-11-03 09:31:00 - INFO 执行卖出操作,价位:23.48 ,数量:2000

-11-03 09:49:00 - INFO 执行买入操作,价位:22.9 ,数量:2000

-11-03 14:15:00 – INFO 执行买入操作,价位:22.35 ,数量:2000

-11-06 09:31:00 - INFO 执行买入操作,价位:21.73 ,数量:2000

-11-06 10:56:00 – INFO 执行卖出操作,价位:22.19 ,数量:2000

-11-07 09:31:00 - INFO 执行卖出操作,价位:22.95 ,数量:2000

-11-07 09:35:00 - INFO 执行卖出操作,价位:23.45 ,数量:2000

-11-07 09:43:00 - INFO 执行买入操作,价位:22.86 ,数量:2000

-11-07 14:51:00 – INFO 执行卖出操作,价位:23.34 ,数量:2000

-11-08 09:39:00 - INFO 执行买入操作,价位:22.82 ,数量:2000

-11-08 09:48:00 - INFO 执行卖出操作,价位:23.3 ,数量:2000

-11-08 10:07:00 - INFO 执行卖出操作,价位:23.9 ,数量:2000

-11-08 10:24:00 - INFO 执行卖出操作,价位:24.58 ,数量:2000

----------------------- Page 81-----------------------

-11-08 11:06:00 - INFO 执行买入操作,价位:24.07 ,数量:2000

-11-08 13:05:00 - INFO 执行卖出操作,价位:24.59 ,数量:2000

-11-08 14:16:00 – INFO 执行买入操作,价位:24.07 ,数量:2000

-11-09 09:31:00 – INFO 执行买入操作,价位:23.42 ,数量:2000

-11-10 09:54:00 - INFO 执行买入操作,价位:22.93 ,数量:2000

-11-10 11:00:00 - INFO 执行买入操作,价位:22.45 ,数量:2000

策略源代码:

import numpy

import pandas as pd

#============================初始化函数================================

def initialize(account):

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

def before_trading_start(account,data):

if g.day == 1:

account.jc = True

else:

account.jc = False

g.t = []

#===========================开盘时===============================

def handle_data(account,data):

date=get_datetime().strftime('%Y%m%d%H%M%S')

if account.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

----------------------- Page 82-----------------------

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_end(account,data):

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

----------------------- Page 83-----------------------

如果觉得《第四章:经典量化策略集锦(第三篇:网格交易—动态调仓策略)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。