10 分钟带你开启量化交易之旅 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
a499492580
V2EX    推广

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

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

    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     Solana     2491 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 00:19 PVG 08:19 LAX 17:19 JFK 20:19
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86