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的主要内容,如果未能解决你的问题,请参考以下文章