从零实现”搭积木式实现策略“的回测系统 part I

对量化交易感兴趣的同学,对于回测系统肯定不陌生。以quantopian为蓝本的回测平台,国内已经一抓一把,那为什么还需要从头实现一个系统?而且,什么是“搭积木式实现策略”呢?

对比现存的量化平台,实现如下价值:

1,市面上量化系统引擎是黑盒(当然大部分是zipline——代码是开源的,但可读性一般),从头实现可以做到知其然更知其所以然。

2,拥有自己的,代码易读性的系统,不用担心策略泄漏。

3,提供一个构架清晰且易扩展的系统。

4,”积木式“写策略,避免市面上那些冗长的模板代码——这个是本系统的亮点之一。

5,下一步会扩展到深度强化学习、机器学习自动调参等。

 系统运行示例

”积木式“策略示例,如下实现“买入并持有”和“均线交叉”策略:

buy_and_hold = Strategy([
        RunOnce(),
        PrintBar(),
        SelectAll(),
        WeighEqually(),
    ], name='买入并持有-基准策略')

    long_expr = 'cross_up(ma(close,5),ma(close,10))'
    flat_expr = 'cross_down(ma(close,5),ma(close,10))'
    ma_cross = Strategy([
        SelectByExpr(long_expr=long_expr, flat_expr=flat_expr),
        WeighEqually(),
    ], name='均线交叉策略')

几乎没有模板代码,没用调用api对不对?是的,就是这样,我们把大量常用的算法都以模块的形式,变成一个小小算法模块,我们按照自己的策略想法,按需把积木搭起来就好了,简单而且不容易出错,基本是不需要调试的!

2018-10-24 17:20:57,898 trading_env.py[line:77] INFO 回测日期从2006-01-03到2006-12-29,一共251期
2018-10-24 17:20:57,902 algos.py[line:53] INFO 当前索引:0,当前日期:2006-01-03
2018-10-24 17:20:57,904 portfolio.py[line:117] INFO 2006-01-03 - 以9.606416839379的价格,买入AAPL:10201股
2018-10-24 17:20:58,576 trading_env.py[line:90] INFO 回测成功完成!
2018-10-24 17:20:58,584 trading_env.py[line:77] INFO 回测日期从2006-01-03到2006-12-29,一共251期
2018-10-24 17:20:58,988 portfolio.py[line:114] INFO 有交易信号,仓位无变化
2018-10-24 17:20:59,063 portfolio.py[line:117] INFO 2006-02-17 - 以9.0332446774576的价格,买入AAPL:10848股
2018-10-24 17:20:59,095 portfolio.py[line:117] INFO 2006-03-02 - 以8.945855199855199的价格,卖出AAPL:10848股
2018-10-24 17:20:59,150 portfolio.py[line:117] INFO 2006-03-17 - 以8.3097112084849的价格,买入AAPL:11663股
2018-10-24 17:20:59,165 portfolio.py[line:117] INFO 2006-03-21 - 以7.9434464861808的价格,卖出AAPL:11663股
2018-10-24 17:20:59,231 portfolio.py[line:117] INFO 2006-04-03 - 以8.0513981938073的价格,买入AAPL:11499股
2018-10-24 17:20:59,305 portfolio.py[line:117] INFO 2006-04-18 - 以8.5101929512198的价格,卖出AAPL:11499股
2018-10-24 17:20:59,330 portfolio.py[line:117] INFO 2006-04-25 - 以8.5037672543373的价格,买入AAPL:11477股
2018-10-24 17:20:59,387 portfolio.py[line:117] INFO 2006-05-11 - 以8.758224850885401的价格,卖出AAPL:11477股
2018-10-24 17:20:59,511 portfolio.py[line:117] INFO 2006-06-23 - 以7.5604749519822的价格,买入AAPL:13267股
2018-10-24 17:20:59,534 portfolio.py[line:117] INFO 2006-06-30 - 以7.3599932092473的价格,卖出AAPL:13267股
2018-10-24 17:20:59,598 portfolio.py[line:117] INFO 2006-07-21 - 以7.8033662941417的价格,买入AAPL:12500股
2018-10-24 17:20:59,653 portfolio.py[line:117] INFO 2006-08-10 - 以8.2338879852711的价格,卖出AAPL:12500股
2018-10-24 17:20:59,672 portfolio.py[line:117] INFO 2006-08-17 - 以8.6862570458011的价格,买入AAPL:11819股
2018-10-24 17:20:59,705 portfolio.py[line:117] INFO 2006-08-29 - 以8.5436065750089的价格,卖出AAPL:11819股
2018-10-24 17:20:59,729 portfolio.py[line:117] INFO 2006-09-05 - 以9.1861762632617的价格,买入AAPL:10978股
2018-10-24 17:20:59,829 portfolio.py[line:117] INFO 2006-10-05 - 以9.6166979543911的价格,卖出AAPL:10978股
2018-10-24 17:20:59,864 portfolio.py[line:117] INFO 2006-10-17 - 以9.5473004280598的价格,买入AAPL:11031股
2018-10-24 17:20:59,913 portfolio.py[line:117] INFO 2006-11-02 - 以10.150030795641的价格,卖出AAPL:11031股
2018-10-24 17:20:59,933 portfolio.py[line:117] INFO 2006-11-09 - 以10.710351563797的价格,买入AAPL:10426股
2018-10-24 17:21:00,018 portfolio.py[line:117] INFO 2006-12-07 - 以11.185853133104的价格,卖出AAPL:10426股
2018-10-24 17:21:00,083 trading_env.py[line:90] INFO 回测成功完成!
买入并持有-基准策略回测结果:
收益率:0.13238072266044898,年化收益率:0.13294173855910207
波动率:0.37579700030919133
夏普比:0.5183433421097418
均线交叉策略回测结果:
收益率:0.18722893513037486,年化收益率:0.18804098388879753
波动率:0.23000639651958077
夏普比:0.8650411884645752

image

背景说明

随着机器学习,人工智能的火热,AI+金融受到了很多关注。alpha go大败李世石之后,master再次完胜柯洁,人们自然而然会想,如果把前沿AI技术应用到“离钱最近”的金融证券投资会取得什么样的效果呢?

Quant涉及很多的基础知识,包括金融学,投资学,经济学,数学,统计学,甚至物理学,心理学等等,Quant系统也很复杂,由从多子系统构成。而量化回测系统(Backtesting)几乎是Quant系统里,最为基础且最为重要的一环。

什么是回测系统?

量化交易,就是计算机按指定的策略,产生特定的交易信号。因为二级市场所有历史数据、财务数据都是可获得的,既然是计算机进行操作,就很容易对整个交易进行复盘。好比我们玩扑克牌或者“狼人杀游戏”,在一局结束,总有自认逻辑严密的人喜欢对游戏过程进行复盘,刚哪里可以做得更好,分析出了什么问题,确保后续如何优先,调整和提高。这就是“回测”系统的价值。

回测系统至少有如下优点:

一、回测系统几乎是无代价的,我们可以调整参数,或者各种创造性的想法,这个系统会告诉你,在过往一段时间(比如一年),假如你真的这么交易了,收益率,风险,最大回撤是多少。这就避免我们花大量真金白银去市场上买教训。

二、更重要的事,节省时间,你可以在几分钟内模拟几个股市周期,穿越牛熊。你如果要想经历几个股市周期,那估计是以10年甚至更长的时间维度来计算,但对于量化回测引擎,几秒钟就可以告诉你结果,且没有产生实质的损失。

量化回测系统对于初学者是神秘的,但其原理并不复杂。此系列文章的目的,就是带着大家,用python从零实现一个量化回测系统。

量化回测系统总体架构一览:

SymbolBroker ——记录单支证券交易详情,包括持仓情况(position),交易佣金(Commission),证券的收盘价(Close)。投资组合(Portfolio)会根据外部给出的交易指令,调用SymbolBroker的接口,去更改该证券的持仓情况,并计算交易所产生的佣金。

Portfolio ——记录整个投资组合交易详情,包含组合的总市值(total),现金余额(cash),交易佣金,同时维护一个SymbolBroker的dict,包含所有的证券的SymbolBroker。每一期,会根据传入的FLAT(平仓)列表,把相应的证券平仓,同时根据需要持仓的证券的比例,将现金余额按指定的比例分配到对应的证券上。

TradingEnv ——交易环境,根据策略(Strategy)产生的指令,调用Portfolio更新持仓组合情况。

DataFeed —— 数据获取,目前支持quandl平台的美股数据。

Strategy —— 策略,执行相应的“积木”模块化的算法集合。

Algo —— 算法基类,用户可以自行定义所需的算法模式。系统已经内置了许多常用的模块,包括执行频率,比如执行一次,按周执行,按月执行;资金分配模块,按信号产生交易指令模块等。

这就是系统的核心组件了,其中TradingEnv是系统的最外层。

 def run_strategy(self):
        done = False
        observation = None
        while not done:
            observation,reward,done,info = self.run_step()
        logger.info('回测成功完成!')


#环境运行一步
def run_step(self):
    '''
    :param actions: 交易指令 {LONG:['AAPL',],FLAT:['BTC']}表示买入AAPL,卖出BTC
    :return: observation,reward,done,info
    '''

    done = self.portfolio.update()
    self.__update_env()
    # 这里strategy会修改env.context
    self.strategy(self.context)
    self.portfolio.step(self.context)


    observation = None
    reward = None
    info = None
    return observation,reward,done,info

项目在github上开源,欢迎star。

代码在github上开源ailabx

image

转载于:https://my.oschina.net/u/3289203/blog/2251908

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值