zipline

Posted whkzm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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/

以上是关于zipline的主要内容,如果未能解决你的问题,请参考以下文章

zipline

Zipline Beginner Tutorial

zipline-- 开发指南

zipline install instruction

自建zipline的databundle

text ZIPLINE MSMP 6.00