同花顺Supermind量化交易 风险控制建模--网格交易—动态调仓策略

651 阅读5分钟

市场上股票的价格总是在不断的上下波动,投资者通过低买高卖获利。第三篇将向大家介绍网格交易,一个动态的调仓策略,有效解决仓位和价位控制。

第三篇:网格交易—动态调仓策略

导语:市场上股票的价格总是在不断的上下波动,投资者通过低买高卖获利。第三篇将向大家介绍网格交易,一个动态的调仓策略,有效解决仓位和价位控制。

一、策略阐述

窥探网格交易

  “追涨杀跌”与“高抛低吸”是两种完全不同的交易方式,也是大家听到较多的两个炒股词汇。顾名思义,“追涨杀跌”就是股价上涨买入,股价下跌卖出。“高抛低吸”就是股价下跌买入,股价上涨卖出。

  但是纯粹的“高抛低吸”只是概念,根本无法形成一个交易系统。而且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量化交易 风险控制建模--网格交易—动态调仓策略