经典量化模型分享之【网格交易策略】(附源码)



  • 针对不同的品种、特性各位自行修改研究。加密币可以使用cctx接口配合。

    知乎介绍

    网格交易需要相对较多的资金,原则上在任何点位进入都可以,但资金管理很重要。如果目前的点位难以判断高低,以操作1只股票为例,第一次可以投入一半的资金,然后做好股价下跌50%的准备。具体操作是,画好5%的固定网格,把股票数分为10份,每上涨5%卖出1份股票,每下跌5%买入1份股票,这样手中的股票可以应付股价单边上涨10个5%,资金可以应付单边下跌10个5%。中间如有反复,每次对冲获利大约是总资金的1/20的4%(手续费按1%计算)。总体看,如果1个月有10次对冲,月盈利是(1/20)0.0410=2%,年收益在25%以上。保守说,即使股价波动很小,每个月对冲2次,结果也不比银行差。从目前中国市场看,没有什么股票的波动性会这么差。如果操作指数基金更好,不愁没有波动,手续费还少。
      上述策略还可以优化。比如,可以同时采用大网格(例如10%)和小网格,还可以把网格划分得更细,例如2.5%甚至1.25%,但对冲差价不应少于5%。总之,以捕捉到更多的波动为佳。这样一来,只要股价在设定范围内波动,就不断有差价可赚。至于投入建设网格的钱,我们可以不去管股票的浮动盈亏,相当于我们投资建设一个提款机,似乎没有拆了的必要。
      选股以波动大的大盘股和指数基金为上,这样的系统风险较小,例如中国人寿和平安,目前股价不过腰斩而已,决不会出现从100跌到10的情况。如果出现股价单边上涨几倍的情况,年收益已经在短短时间内达到,轻易不要再追。资金多时可以同时操作几只股票,这样资金的利用率更高,但风险是同时下跌很多时没钱买入。

    基础源码

    
    # coding=utf-8
    from __future__ import print_function, absolute_import, unicode_literals
    
    import numpy as np
    import pandas as pd
    from gm.api import *
    
    '''
    本策略首先计算了过去300个价格数据的均值和标准差
    并根据均值加减1和2个标准差得到网格的区间分界线,
    并分别配以0.3和0.5的仓位权重
    然后根据价格所在的区间来配置仓位(+/-40为上下界,无实际意义):
    (-40,-3],(-3,-2],(-2,2],(2,3],(3,40](具体价格等于均值+数字倍标准差)
    [-0.5, -0.3, 0.0, 0.3, 0.5](资金比例,此处负号表示开空仓)
    回测数据为:SHFE.rb1801的1min数据
    回测时间为:2017-07-01 08:00:00到2017-10-01 16:00:00
    '''
    
    
    def init(context):
        context.symbol = 'SHFE.rb1801'
        # 订阅SHFE.rb1801, bar频率为1min
        subscribe(symbols=context.symbol, frequency='60s')
        # 获取过去300个价格数据
        timeseries = history_n(symbol=context.symbol, frequency='60s', count=300, fields='close', fill_missing='Last',
                               end_time='2017-07-01 08:00:00', df=True)['close'].values
        # 获取网格区间分界线
        context.band = np.mean(timeseries) + np.array([-40, -3, -2, 2, 3, 40]) * np.std(timeseries)
        # 设置网格的仓位
        context.weight = [0.5, 0.3, 0.0, 0.3, 0.5]
    
    
    def on_bar(context, bars):
        bar = bars[0]
        # 根据价格落在(-40,-3],(-3,-2],(-2,2],(2,3],(3,40]的区间范围来获取最新收盘价所在的价格区间
        grid = pd.cut([bar.close], context.band, labels=[0, 1, 2, 3, 4])[0]
        # 获取多仓仓位
        position_long = context.account().position(symbol=context.symbol, side=PositionSide_Long)
        # 获取空仓仓位
        position_short = context.account().position(symbol=context.symbol, side=PositionSide_Short)
        # 若无仓位且价格突破则按照设置好的区间开仓
        if not position_long and not position_short and grid != 2:
            # 大于3为在中间网格的上方,做多
            if grid >= 3:
                order_target_percent(symbol=context.symbol, percent=context.weight[grid], order_type=OrderType_Market,
                                     position_side=PositionSide_Long)
                print(context.symbol, '以市价单开多仓到仓位', context.weight[grid])
            if grid <= 1:
                order_target_percent(symbol=context.symbol, percent=context.weight[grid], order_type=OrderType_Market,
                                     position_side=PositionSide_Short)
                print(context.symbol, '以市价单开空仓到仓位', context.weight[grid])
        # 持有多仓的处理
        elif position_long:
            if grid >= 3:
                order_target_percent(symbol=context.symbol, percent=context.weight[grid], order_type=OrderType_Market,
                                     position_side=PositionSide_Long)
                print(context.symbol, '以市价单调多仓到仓位', context.weight[grid])
            # 等于2为在中间网格,平仓
            elif grid == 2:
                order_target_percent(symbol=context.symbol, percent=0, order_type=OrderType_Market,
                                     position_side=PositionSide_Long)
                print(context.symbol, '以市价单全平多仓')
            # 小于1为在中间网格的下方,做空
            elif grid <= 1:
                order_target_percent(symbol=context.symbol, percent=0, order_type=OrderType_Market,
                                     position_side=PositionSide_Long)
                print(context.symbol, '以市价单全平多仓')
                order_target_percent(symbol=context.symbol, percent=context.weight[grid], order_type=OrderType_Market,
                                     position_side=PositionSide_Short)
                print(context.symbol, '以市价单开空仓到仓位', context.weight[grid])
        # 持有空仓的处理
        elif position_short:
            # 小于1为在中间网格的下方,做空
            if grid <= 1:
                order_target_percent(symbol=context.symbol, percent=context.weight[grid], order_type=OrderType_Market,
                                     position_side=PositionSide_Short)
                print(context.symbol, '以市价单调空仓到仓位', context.weight[grid])
            # 等于2为在中间网格,平仓
            elif grid == 2:
                order_target_percent(symbol=context.symbol, percent=0, order_type=OrderType_Market,
                                     position_side=PositionSide_Short)
                print(context.symbol, '以市价单全平空仓')
            # 大于3为在中间网格的上方,做多
            elif grid >= 3:
                order_target_percent(symbol=context.symbol, percent=0, order_type=OrderType_Market,
                                     position_side=PositionSide_Short)
                print(context.symbol, '以市价单全平空仓')
                order_target_percent(symbol=context.symbol, percent=context.weight[grid], order_type=OrderType_Market,
                                     position_side=PositionSide_Long)
                print(context.symbol, '以市价单开多仓到仓位', context.weight[grid])
    
    
    if __name__ == '__main__':
        '''
        strategy_id策略ID,由系统生成
        filename文件名,请与本文件名保持一致
        mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST
        token绑定计算机的ID,可在系统设置-密钥管理中生成
        backtest_start_time回测开始时间
        backtest_end_time回测结束时间
        backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
        backtest_initial_cash回测初始资金
        backtest_commission_ratio回测佣金比例
        backtest_slippage_ratio回测滑点比例
        '''
        run(strategy_id='strategy_id',
            filename='main.py',
            mode=MODE_BACKTEST,
            token='token_id',
            backtest_start_time='2017-07-01 08:00:00',
            backtest_end_time='2017-10-01 16:00:00',
            backtest_adjust=ADJUST_PREV,
            backtest_initial_cash=10000000,
            backtest_commission_ratio=0.0001,
            backtest_slippage_ratio=0.0001)
    

    0_1530058647784_2.jpg



  • 简单又神奇的策略,就是这么简单,可是又很难弄,如果只是手动操作 估计会累死,,


 








  • 0_1558330551804_TIM截图20190520133517.png

    点击进入课程地址 适用人群

    面向对数字货币程序化感兴趣的初学者,需要有一定的实盘交易和简单的计算机基础。

    课程概述
    数字货币交易市场由于其特殊性越来越受到量化交易者的关注,实际上程序化交易已经是数字货币的主流,对冲做市等策略无时无刻不在活跃着市场。而编程基础薄弱的初学者想要进入这一领域,面对众多的交易所和多变的API,困难重重。发明者(FMZ)量化平台(原BotV)是目前最大的数字货币量化社区和平台,4年多来帮助成千上万的初学者走向了量化交易之路。
    本课程由发明者量化平台官方提供,将涵盖以下内容:
    1.数字货币量化交易简介(已更新)
    2.JavaScript快速入门(已更新)
    3.发明者量化交易平台使用指南(已更新)
    4.发明者量化交易平台编程指南(已更新)
    5.量化交易策略范例详解(已更新)

    据说后面会更新python 的相关入门教程。课程很便宜,适合对量化不懂想有个概念的群体学习。

    如果要说自己拥有一套盈利的量化策略,还是要走很长的学习路。各位加油!

    讨论群:482548322

    阅读更多
  • FXKUNLUN 昆仑国际操盘团队 2019年3月收益报告ℹ 观摩账户地址 (本观摩账户为FX110监管实盘账户-平台KVB昆仑国际) 💹 KVB开户地址 点击链接 ⏺ 4月份 净值收益 9.9% ⏺ 4月份 资金最大回撤率 0.82% ⏺ 4月份 交易准确率 80.08%

    0_1556673557669_1.png

    0_1556673565305_2.png

    0_1556673571653_3.png

    0_1556673578903_4.png

    阅读更多

暂无主题。