zoukankan      html  css  js  c++  java
  • zipline

    zipline

    程序的整体运行逻辑:

    一个回测框架至少应该包括回测环境的配置,回测的事件触发,回测的事件处理,回测循环这样的几个模块

    使用conda安装zipline

    $ conda create -n env_zipline python=3.5
    
    $ conda activate env_zipline     # 激活虚拟环境
    
    $ conda install -c quantopian zipline   # 安装zipline
    
    $ conda install -c 3dhubs matplotlib    # 安装matplotlib
    
    $ python zipline-script.py run --help    # 另类的启动方式,目前没有办法直接使用zipline run启动
    
    # 注:没有安装成功可以去官方下载安装包的地方找下载指令   https://anaconda.org/
    # conda换源  conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
    

    数据包

    从csv文件中提取数据

    1.将文件按照指定的格式处理,编辑用户目录下 .zipline中的extension.py文件进行注册

    2.执行zipline ingest -b 注册的时候使用的文件名

    3.使用zipline bundles 查看是否写入成功

    4.清除不需要的数据,要加上时间限制

    # clean everything older than <date>
    $ zipline clean [-b <bundle>] --before <date>
    
    # clean everything newer than <date>
    $ zipline clean [-b <bundle>] --after <date>
    
    # keep everything in the range of [before, after] and delete the rest
    $ zipline clean [-b <bundle>] --before <date> --after <after>
    
    # clean all but the last <int> runs
    $ zipline clean [-b <bundle>] --keep-last <int>
    

    zipline_chinese项目

    zipline项目中保存数据的时候是读取csv文件成df对象,然后将df对象保存在mongo中,最后需要使用的数据格式类型是panel类型,为啥会使用panel类型,直接使用字典保存数据,格式{“合约名" : 对应时间段的合约信息}

    交易日历

    什么是交易日历

    交易日历代表单个市场交换的时间信息,事件信息由两部分组成, session and opens/close

    session代表连续的分钟,需要注意的是,session标签不应该被视为特定的事件,

    为什么要关系交易日历

    TradingCalendar类

    建立自己的TradingCalendar的交易所,需要的属性有:

    Name of the Exchange      # 交易所名称
    Timezone      # 时区
    Open Time      # 开放时间
    Close Time      # 关闭时间
    Regular & Ad hoc Holidays      # 定期和特殊假期
    Special Opens & Close      # 特殊开放和关闭
    
    

    建立自定义交易日历

    zipline的目录结构

    ├── ci    -  持续集成相关
    ├── conda - 生成conda 包先关
    ├── docs - 文档
    │   ├── notebooks - notebook代码
    │   └── source  - 教程和what’s new
    ├── etc - 依赖配置和一些 hook shell 脚本
    ├── tests - 测试代码
    ├── zipline - 代码主目录
    │   ├── __init__.py - 集中引入包内容
    │   ├── __main__.py - 主程序入口
    │   ├── _protocol.pyx - current, history, can_trade 之类的一些数据操作接口的实现
    │   ├── _version.py - 版本管理相关的
    │   ├── algorithm.py - 策略算法的主逻辑抽象,算法最后会被实例化为TradingAlgorithm的实例或者继承它, 并且里面进行了主要的api的定义,zipine的 cli会调用它的run方法启动回测
    │   ├── api.py 常用api
    │   ├── api.pyi 常用api说明
    │   ├── assets - 资产类抽象 里面封装了常用的资产如股票Equity,期货Funtrue, 作为Asset的子类,并且封装了其数据库操作(这里是sqlite)
    │   ├── data - 数据相关,所有的数据操作封装为dataportal 
    │   │   ├── __init__.py
    │   │   ├── _adjustments.pyx - 除权除息等信息的读取
    │   │   ├── _equities.pyx - 从bcolz里面获取行情的索引的抽象
    │   │   ├── _minute_bar_internal.pyx - 分钟bar相关的索引
    │   │   ├── bar_reader.py - BarReader接口定义
    │   │   ├── benchmarks.py - 从雅虎获取基准数据
    │   │   ├── bundles - 官方的提供的data bundle 
    │   │   ├── continuous_future_reader.py 
    │   │   ├── data_portal.py DataPortal定义,整合了所有的reader,writer,等,是biplane获取数据的入口,提供reader,writer数据的简单高层封装
    │   │   ├── dispatch_bar_reader.py - 结合trading calendar 读取asset的bar信息
    │   │   ├── history_loader.py  - asset 历史信息的获取, 包括附加复权信息
    │   │   ├── loader.py - loader 封装了基准信息和国债收益率曲线
    │   │   ├── minute_bars.py - 分钟线reader/writer相关的抽象
    │   │   ├── resample.py - 把分钟线数据resample为日线数据
    │   │   ├── session_bars.py -  SessionBarReader
    │   │   ├── treasuries.py - 国债收益率曲线
    │   │   ├── treasuries_can.py - 加拿大国债收益率曲线
    │   │   └── us_equity_pricing.py - 主要是针对Equity的日线读取,adjustment数据读取,
    │   ├── dispatch.py - 分发逻辑
    │   ├── errors.py - 异常的抽象
    │   ├── examples - 一些例子
    │   ├── finance - 主要抽象了交易和财务相关的逻辑,这些接口大多会出现在zipline或者quantopian的代码策略代码里,可以进行import 
    │   │   ├── __init__.py 
    │   │   ├── asset_restrictions.py - 资产交易限制
    │   │   ├── blotter.py - 账号?
    │   │   ├── cancel_policy.py - 取消策略
    │   │   ├── commission.py - 佣金
    │   │   ├── constants.py - 一些常亮定义
    │   │   ├── controls.py - 分控相关
    │   │   ├── execution.py - 订单类型
    │   │   ├── order.py - 订单逻辑
    │   │   ├── performance - 收益
    │   │   ├── risk - 风险相关
    │   │   ├── slippage.py - 滑点
    │   │   ├── trading.py - TradingEnvironment, SimulationParameters的抽象,如果使用自己的loader, TradingCalendar 则需要自己初始化这个对象 
    │   │   └── transaction.py - Transaction - 交易的抽象
    │   ├── gens - 应该是集合了大部分的generator , 主要是回测过程的generator
    │   │   └── tradesimulation.py - 回测主要过程的generator
    │   ├── lib - 一些主要用的的数据结构和算法
    │   ├── pipeline - pipeline相关的逻辑
    │   ├── protocol.py - Order Account, Portfolio, Position等的抽象
    │   ├── resources - etc相关的一些资源
    │   ├── sources - 基准数据源等
    │   ├── test_algorithms.py - 测试策略...
    │   ├── testing - 测试
    │   ├── utils - 一些工具类, 其中 run_algo.py, tradingcalendar.py 相关的需要重点关注下
    

    zipline的整体架构

    from zipline.algorithm import TradingAlgorithm
    # 量化策略的抽象,既可以通过初始化传入构造上参数的方式,也可以通过继承的方式构造,其中zipline命令行主要的运行入口逻辑 run 方法也在这个类中
    
    from zipline.finance.trading import TradingEnvironment
    # 构造运行环境,主要是benchmark和国债利率曲线等信息,对于美国的市场,这个类基本上不太需要关注,但是对于国内的市场,我们需要构建自己的TradingEnvironment
    
    from trading_calendars import TradingCalendar
    # 交易日历的抽象,这个类非常重要,无论是在构建数据的过程还是运行的过程,都可以用到
    
    from zipline.data.data_portal import DataPortal
    # 数据中心的抽象,可以通过这个入口获取很多不同类型的数据
    
    from zipline.gens.tradesimulation import AlgorithmSimulator
    # 使用generator的方式,表述了策略运行过程的主循环。如果说TradingAlgorithm更像是代表了策略本身,那么AlgorithmSimulator更像是策略的执行器,尤其要关注的是他的transform方法
    

    有返回结果的测试代码

    #-*- coding: utf-8 -*-
    from datetime import datetime
    from zipline.algorithm import TradingAlgorithm
    from zipline.finance.trading import TradingEnvironment
    from zipline.api import order, record, symbol, history
    from zipline.finance import trading
    from zipline.utils.factory import create_simulation_parameters
    import pandas as pd
    import numpy as np
     
    n = 0
    # Define algorithm
    def initialize(context):
        context.asset = symbol('AAPL')
        print "initialization"
        pass
     
    def handle_data(context, data):
        global n
        print "handle", n
        print data.history(context.asset, 'price', 1, '1d')#close price
        # print history(1, '1d', 'price').mean()
        n += 1
        order(symbol('AAPL'), 10)
        record(AAPL=data.current(symbol('AAPL'), 'price'))
     
    def analyze(context=None, results=None):
        import matplotlib.pyplot as plt
        # Plot the portfolio and asset data.
        ax1 = plt.subplot(211)
        results.portfolio_value.plot(ax=ax1)
        ax1.set_ylabel('Portfolio value (USD)')
        ax2 = plt.subplot(212, sharex=ax1)
        results.AAPL.plot(ax=ax2)
        ax2.set_ylabel('AAPL price (USD)')
     
        # Show the plot.
        plt.gcf().set_size_inches(18, 8)
        plt.show()
    
        # 本地化工作开始
    def load_t(trading_day, trading_days, bm_symbol):
        # dates = pd.date_range('2001-01-01 00:00:00', periods=365, tz="Asia/Shanghai")
        bm = pd.Series(data=np.random.random_sample(len(trading_days)), index=trading_days)
        tr = pd.DataFrame(data=np.random.random_sample((len(trading_days), 7)), index=trading_days,
                          columns=['1month', '3month', '6month', '1year', '2year', '3year', '10year'])
        return bm, tr
    trading.environment = TradingEnvironment(load=load_t, bm_symbol='^HSI', exchange_tz='Asia/Shanghai')
     
    # 回测参数设置
    sim_params = create_simulation_parameters(year=2014,
        start=pd.to_datetime("2001-01-01 00:00:00").tz_localize("Asia/Shanghai"),
        end=pd.to_datetime("2001-09-21 00:00:00").tz_localize("Asia/Shanghai"),
        data_frequency="daily", emission_rate="daily")  # 原始版本是上面这样的,代码里面是交易日历,然而,如何产生交易日历呢?
     
     
    # setting the algo parameters
    algor_obj = TradingAlgorithm(initialize=initialize, handle_data=handle_data,
                                 sim_params=sim_params, env=trading.environment, analyze=analyze
                                 )
    # data format definition
    parse = lambda x: datetime.date(datetime.strptime(x, '%Y/%m/%d'))
     
    # data generator
    data_s = pd.read_csv('AAPL.csv', parse_dates=['Date'], index_col=0, date_parser=parse)
    print data_s
    data_c = pd.Panel({'AAPL': data_s})
     
    perf_manual = algor_obj.run(data_c)
    # Print
    perf_manual.to_csv('myoutput.csv')
    

    资料网址

    # 雪球网,四章讲解,基础入门
    https://xueqiu.com/9842090891/120038584
        
    https://xueqiu.com/9842090891/120143058
        
    https://xueqiu.com/9842090891/121068329
        
    https://xueqiu.com/9842090891/121427527
        
    # zipline官网教程
    https://www.zipline.io/index.html
        
    # 详解zipline的架构
    https://rainx.gitbooks.io/-zipline/content/
    
  • 相关阅读:
    Python异常捕捉try except else finally有return时执行顺序探究
    为什么在Python的线程内调用sys.exit()时不退出?
    Hadoop集群上用户使用crontab时候失败
    记一次--------spark 读 mysql 报错no suitable driver
    通用权限sql设计
    union all 对结果进行分类展示
    雷达图
    常用语句
    oracle中计算两个日期的相差天数、月数、年数、小时数、分钟数、秒数等
    icell设计器发送邮件不成功
  • 原文地址:https://www.cnblogs.com/whkzm/p/13167698.html
Copyright © 2011-2022 走看看