V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
a499492580
V2EX  ›  推广

10 分钟带你开启量化交易之旅

  •  1
     
  •   a499492580 · 2017-10-25 15:21:37 +08:00 · 6426 次点击
    这是一个创建于 2586 天前的主题,其中的信息可能已经有所发展或是发生改变。

    10 分钟带你开启量化交易之旅

    对于大部分人来说,量化交易是非常陌生与神秘的。本篇文章将带你开启量化交易之旅!
      本篇文章内容摘要:1.理解量化策略的基本框架。2.学会编写一个简单的量化交易策略。3.学会将量化交易策略绑定实盘模拟交易,并实时收到交易策略的买卖信号

    1.理解量化策略的基本框架

    通常情况下,完整的量化交易策略至少需要确定两件事:

        A.交易标的,即买什么
        B.确定交易时机,即怎么买卖

      让我们来设计一个简单完整的量化交易策略:

       策略交易标的:贵州茅台;
       策略交易时机:5 日均线与 20 日均线金叉时,买入; 5 日均线与 20 日均线死叉时,卖出。

    2.学会编写一个简单的量化交易策略

    第一步:打开 MindGo 量化交易平台,先在上方导航栏点击“我的策略”—“策略编译”,再点击蓝色按钮“+新建策略”,接着点击已创建的策略进入策略编译器页面,如下:


    温馨提示:“回测列表”下方三个按钮,可以设置编译器字体大小,背景颜色,开启全屏编译,查看 API 文档,如下:

    第二步:理解量化交易策略框架对应的代码框架。

    def initialize(account):
        #初始化函数:确定交易标的
    def handle_data(account,data):	
        #定时运行函数:确定交易时机
    

    框架理解
       1.def initialize(account)与 def handle_data(account,data)是两个函数,函数格式固定为:def 函数名(参数),其中 def 后面带空格键,函数末尾必须带冒号。
       2.def initialize(account)函数是初始化函数,只运行一次,确定初始化条件; def handle_data(account,data)函数是定时运行函数,平台默认该函数定时运行。日级策略,每日 9:30 ;分钟级策略,交易期间内的每分钟。
       3.“#”后面为注释内容,用于注释代码,便于编写和阅读。

    第三步:确定交易标的:account.security = '600519.SH'。

    温馨提示
       1.account 是账户对象,该对象存放所有账户相关信息,持仓、可用现金、资产盈亏。
       2.account.security 是在账户对象下,设置 security 变量,存放在账户内,这里我们需要确定交易标的,即:account.security = '600519.SH'。

    def initialize(account):
        account.security = '600519.SH'#已确定交易标的
    def handle_data(account,data):	
        #定时运行函数:确定交易时机
    

    第四步:确定交易时机,即为:5 日均线与 20 日均线金叉时,买入; 5 日均线与 20 日均线死叉时,卖出。

    从交易时机出发,我们需要计算交易标的 5 日和 20 日均线,那么 5、20 日均线需要用历史行情数据的收盘价来计算。

      整个流程即:获取历史行情 20 日的收盘价数据———计算 5、20 日均线———判断 5、20 日均线,进行买卖交易。

       A.获取历史行情 20 日的收盘价数据

         1.找到函数历史数据函数:data.attribute_history()

         2.填写函数参数,获取到数据

          i.交易标的,即:获取那个股票的数据。

          ii.数据字段:'close'收盘价,即:获取那个数据。

          iii.输入历史长度,即:获取多长时间的数据。

          iv.获取数据的时间步长,即:获取日线级步长数据。

          v.最终结果即为:data.attribute_history(account.security, ['close'], 20, '1d')。

         3.将获取到的数据储存,便于计算,即:close=data.attribute_history(account.security, ['close'], 20, '1d')。

    #获取证券过去 20 日的收盘价数据			
    close = data.attribute_history(account.security, ['close'], 20, '1d')
    

    B.计算 5、20 日均线

         1.获取数据值,即:close.values。values 可以直接获取储存中的数据值,格式为 close.values。温馨提示:close 是我们刚才获取的数据,但是数据有股票、时间、数值,我们直接用 values 获取值用于计算即可。

         2.选取数据长度,即:close.values[-5:]。[]用于取值,我们之前获取 20 个数据,但 5 日均线只需要过去 5 日的收盘价,因此[-5:]即为获取倒数第五个到最后一个数据。温馨提示:

          i.[:]是获取所有数据。

          ii.[:x]是从第一个获取到第 x 个,不包括第 x 个。

          iii.[x:y]是从第 x 个到第 y 个,包括 x,但不包括 y。

          iv.[-x:]获取倒数第 x 个到最后一个数据。

         3.计算均值,即 close.values[-5:].mean(),赋值给 MA5。同理 MA20=close.values.mean(),即对所有值取平均,相当于 MA20=close.values[:].mean()。

    #计算五日均线价格		
    MA5 = close.values[-5:].mean()			
    #计算二十日均线价格			
    MA20 = close.values.mean()	
    

    C.判断 5、20 日均线,进行买卖交易

         1.if 判断条件,即为 if MA5 > MA20:。温馨提示 if 判断函数的格式为 if +添加判断+:,其中 if 后面必须带一个空格键,其次末尾必须带冒号。

         2.当 MA5 小于 MA20 时,我们再对持仓市值判断,如果有持仓,那么持仓市值必然大于 0,需要进行卖出交易,我们直接通过 account 账户对象来获取持仓市值,即为:account.positions_value。

         3.下单买入交易

          i.当触发 MA5 大于 MA20 时,我们需要买入股票,这时候我们可以使用order_value 下单函数,该函数以金额下单。

          ii.输入下单函数的参数,order_value 函数需要输入两个参数:

           1.下单的股票,即为 account.security,我们之前将交易标的传入进去,可以直接用。

           2.下单的金额,即 account.cash,这里的 account 是账户对象,我们从账户中获取可用资金,即为 account.cash。

          iii.触发条件后程序提醒,当代码执行完下单函数后,我们用 log.info()来打印日志,这样我们也可以看到程序下单了。

          温馨提示:log.info()内你可以直接输入中文,例如:log.info('条件满足!买入贵州茅台啦!')

        if MA5 > MA20:			
            #使用所有现金买入证券			
            order_value(account.security,account.cash)	
            #记录这次买入			
            log.info("买入 %s" % (account.security))
    

    4.下单卖出交易

          i.当触发 MA5 小于 MA20 时,我们需要卖出股票,这时候我们可以使用order_target 下单函数,该函数以目标股数下单。

          ii.输入下单函数的参数,order_target 函数需要输入两个参数:

           1.下单的股票,即为 account.security,我们之前将交易标的传入进去,可以直接用。

           2.下单的目标股数,即 0,因为我们需要将持仓股票卖出,卖到 0 股为止。

          iii.触发条件后程序提醒,当代码执行完下单函数后,我们同 log.info()来打印日志,这样我们也可以看到程序下单了。

        #如果五日均线小于二十日均线,并且目前有头寸			
        if MA5 < MA20 and account.positions_value > 0:			
            #卖出所有证券			
            order_target(account.security,0)			
            #记录这次卖出			
            log.info("卖出 %s" % (account.security))
    

    最终结果

    # 双均线策略
    # 策略逻辑:当五日均线与二十日均线金叉时买入,当五日均线与二十日均线死叉时卖出。
    
    #初始化账户			
    def initialize(account):			
        #设置要交易的证券(600519.SH 贵州茅台)			
        account.security = '600519.SH'			
     			
    #设置买卖条件,每个交易频率(日 /分钟 /tick )调用一次			
    def handle_data(account,data):			
        #获取证券过去 20 日的收盘价数据			
        close = data.attribute_history(account.security, ['close'], 20, '1d')			
        #计算五日均线价格		
        MA5 = close.values[-5:].mean()			
        #计算二十日均线价格			
        MA20 = close.values.mean()			
        #如果五日均线大于二十日均线			
        if MA5 > MA20:			
            #使用所有现金买入证券			
            order_value(account.security,account.cash)			
            #记录这次买入			
            log.info("买入 %s" % (account.security))			
        #如果五日均线小于二十日均线,并且目前有头寸			
        if MA5 < MA20 and account.positions_value > 0:			
            #卖出所有证券			
            order_target(account.security,0)			
            #记录这次卖出			
            log.info("卖出 %s" % (account.security))
    

    第五步 回测量化交易策略

    通过以上 4 步,我们已经完成了量化交易策略编写,那么接下来我们需要进行量化交易策略回测。
       A.首先,我们尝试去跑通整个历史行情,排查代码错误
       i.右上角设置回测历史长度,设置资金,设置交易频率

        ii.点击左上角“编译运行”按钮,右边出现量化交易策略在历史行情中的表现情况

       B.当量化交易策略能跑通整个历史行情后,我们可以确定该代码正确无误,随后点击右上角蓝色按钮“进行回测”。页面跳转至回测页面,如下:

    3.学会将量化交易策略绑定实盘模拟交易,并实时收到交易策略的买卖信号


    1.在回测显示结果页面,右上角点击蓝色按钮开启仿真交易.如下图:



       2.在账户类型一栏,有股票型、期货型、混合型三种交易账户,选择股票型账户如下图:



       3.为账户选择相应的资金配置,一旦确定就无法更改,如下图:



       4.至此,我们成功开启了模拟交易。点击模拟交易账户下绑定的策略,开启交易信号实时推送,即可将策略的买卖信号发送至同花顺手机 APP 上。如下图:

       5.您可以为您模拟交易账户重命名、删除账户、暂停策略运行、发布策略至社区、重启策略、查看策略运行日志、查看策略代码。注意:重启按钮只会在策略运行错误后显示,如果策略运行正常,显示暂停按钮。如下图:



       6.您可以查看您的模拟交易账户详细情况:交易明细、持仓、盈亏情况、账户风险指标等等



       7.当您的模拟交易策略运行出错时,您可以在模拟交易账户的状态栏看到“错误”提示,如下图:



       8.策略运行出错还可能跟系统有关,如果你没发现代码层面的错误,直接点击重启按钮,策略就会继续运行啦。


    12 条回复    2017-10-26 11:44:25 +08:00
    zander
        1
    zander  
       2017-10-25 15:50:21 +08:00 via Android
    怎么买卖都不是事,关键是策略。
    a499492580
        2
    a499492580  
    OP
       2017-10-25 15:53:39 +08:00
    @zander 是的 好的策略才是王道
    CcChen
        3
    CcChen  
       2017-10-25 16:04:03 +08:00
    不错。值得收藏。兄弟是在基金公司上班的?
    a499492580
        4
    a499492580  
    OP
       2017-10-25 16:25:02 +08:00
    @CcChen 欢迎使用 MINDGO 量化交易平台
    wwttc
        5
    wwttc  
       2017-10-25 18:00:39 +08:00
    写的好详细
    lhx2008
        6
    lhx2008  
       2017-10-25 18:13:53 +08:00 via Android
    不错不错
    CcChen
        7
    CcChen  
       2017-10-25 19:26:23 +08:00
    @a499492580 随便找了几个股票试了一下。。。这玩意在今年操作的收益还不如不操作的收益高。。。
    kendetrics
        8
    kendetrics  
       2017-10-25 19:32:39 +08:00
    同花顺旗下。。
    Actrace
        9
    Actrace  
       2017-10-26 05:34:21 +08:00
    模拟怎么解决实时的不确定性问题。
    你卖的时候别人也有可能卖啊。
    4linuxfun
        10
    4linuxfun  
       2017-10-26 08:25:26 +08:00
    主要还是策略,最近也开始看量化方面的东西,MA5,MA10 交叉是入门级别的交易手段,如果股票在下跌阶段再用 ma5、ma10 交叉去交易,是不是要亏出血啊
    a499492580
        11
    a499492580  
    OP
       2017-10-26 11:42:19 +08:00
    @CcChen 哈哈 看行情的 还有就是看交易标的
    a499492580
        12
    a499492580  
    OP
       2017-10-26 11:44:25 +08:00
    @Actrace 仿真模拟的吧,毕竟实盘代价大
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2664 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 05:02 · PVG 13:02 · LAX 21:02 · JFK 00:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.