在ipython运行,结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
In [8]: pf.create_returns_tear_sheet(data) <IPython.core.display.HTML object> <IPython.core.display.HTML object>
In [9]: ret = pf.create_returns_tear_sheet(data) <IPython.core.display.HTML object> <IPython.core.display.HTML object>
pf.plot_drawdown_periods(data)
import matplotlib.pyplot as plt
plt.show()
|
-
查看支持的函数:
['APPROX_BDAYS_PER_MONTH', 'FACTOR_PARTITIONS', 'FigureCanvasAgg', 'FuncFormatter', 'MM_DISPLAY_UNIT', 'Markdown', 'OrderedDict', 'STAT_FUNCS_PCT', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', '_seaborn', '_version', 'axes_style', 'capacity', 'create_capacity_tear_sheet', 'create_full_tear_sheet', 'create_interesting_times_tear_sheet', 'create_perf_attrib_tear_sheet', 'create_position_tear_sheet', 'create_returns_tear_sheet', 'create_round_trip_tear_sheet', 'create_simple_tear_sheet', 'create_txn_tear_sheet', 'customize', 'datetime', 'deprecate', 'display', 'division', 'ep', 'figure', 'gridspec', 'interesting_periods', 'matplotlib', 'np', 'patches', 'pd', 'perf_attrib', 'plot_annual_returns', 'plot_capacity_sweep', 'plot_cones', 'plot_daily_turnover_hist', 'plot_daily_volume', 'plot_drawdown_periods', 'plot_drawdown_underwater', 'plot_exposures', 'plot_gross_leverage', 'plot_holdings', 'plot_long_short_holdings', 'plot_max_median_position_concentration', 'plot_monthly_returns_dist', 'plot_monthly_returns_heatmap', 'plot_monthly_returns_timeseries', 'plot_perf_stats', 'plot_prob_profit_trade', 'plot_return_quantiles', 'plot_returns', 'plot_rolling_beta', 'plot_rolling_returns', 'plot_rolling_sharpe', 'plot_rolling_volatility', 'plot_round_trip_lifetimes', 'plot_sector_allocations', 'plot_slippage_sensitivity', 'plot_slippage_sweep', 'plot_turnover', 'plot_txn_time_hist', 'plotting', 'plotting_context', 'plt', 'pos', 'pytz', 'round_trips', 'show_and_plot_top_positions', 'show_perf_stats', 'show_profit_attribution', 'show_worst_drawdown_periods', 'sns', 'sp', 'tears', 'time', 'timer', 'timeseries', 'txn', 'utils', 'warnings', 'wraps']
-
报错:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()
解决办法:pf.create_returns_tear_sheet()的参数是pd.series,不能是pd.dataframe
-
报错:
AttributeError: ‘numpy.int64’ object has no attribute ‘to_pydatetime’
解决办法:
1
|
pip install git+https://github.com/quantopian/pyfolio
|
-
empyrical github
-
empyrical API列表
-
pyfolio github
-
pyfolio文档
-
Portfolio and Risk Analytics in Python with pyfolio
-
backtrader pyfolio分析器介绍
最近使用markdown写文档越来越多了,有些成体系的文章希望逐步整理成小册子或者小文档,不排除后面有时间了整理成书籍。
于是调研了下专门用于制作电子书类文档的工具,之前听说比较多的是gitbook和Read the Docs。不过gitbook的开源版本2018年末就不更新了,尝试折腾了挺久都不好使。于是网上找到了几个候选:mdbook、bookdown、mkdocs、gohugo、和peach。mdbook则是用rust语言实现的, 只有一个单独的命令行程序,能够实时渲染,最近开发迭代还比较多。
bookdown是r语言实现的,依赖于RStudio集成环境制作;mkdocs是python实现的,gohugo和peach是go语言实现的。由于mdbook尝试了下能够比较好的满足我的需求,其他就没有深入去尝试了,感兴趣的读者可以自己去试试。
-
下载链接
,支持windows, mac, linux。
下载解压后,将mdbook放到/usr/local/bin下即可使用
-
mac可以使用brew安装,安装的版本可能不是最新,但比较方便
1 2 3 4
|
mkdir my-quant-book cd my-quant-book mdbook init # 会提示输入文档标题 mdbook serve
|
http://localhost:3000/
就可以看到书籍了。
在my-quant-book下生成了book和src两个文件夹和book.toml一个配置文件。
在src目录下自动生成了SUMMARY.md和chapter_1.md 2个markdown文件。chapter_1.md和普通markdown文件一样,SUMMARY.md比较特殊,用来表示文档包含那些文件以及他们的顺序是咋样的。
mdbook服务默认启动端口是3000,如果需要更改端口,可以使用-p参数,如
mdbook serve -p 3001
将端口改为3001。
其他跟markdown一样正常编辑就好了。不知道markdown语法的可以参考我的另外一篇《markdown实战》文章。
-
mdbook使用说明
-
mdbook summary文件说明
-
用bookdown制作图书
-
mkdocs
-
gohugo、mdbook和peach比拼
-
TA-Lib
– 交易软件开发广泛使用的技术分析lib,包括了200多个技术指标,如MACD, RSI等
-
ta-lib for python
– python封装的ta-lib。python封装的ta-lib,使用Cython和Numpy高效实现,比使用SWIG接口的原始版本快2-4倍
https://mrjbq7.github.io/ta-lib/install.html
进python使用
import talib
没有报错的话,表明安装成功。
官方 document
,文档中对各个函数的输入、输出,以及在 Backtrader 中特有的绘图参数、返回的 lines 属性等信息都做了介绍和说明。TA-Lib 指标函数的调用形式为 bt.talib.xxx,跟直接使用ta-lib区别不大 :
1 2 3 4 5 6 7 8
|
class TALibStrategy(bt.Strategy): def __init__(self): # 计算 5 日均线 bt.talib.SMA(self.data.close, timeperiod=5) bt.indicators.SMA(self.data, period=5) # 计算布林带 bt.talib.BBANDS(self.data, timeperiod=25) bt.indicators.BollingerBands(self.data, period=25)
|
-
TA-Lib官网
-
Ta-lib函数列表
-
ta-lib for python
-
ta-lib python安装
-
backtrader ta-lib技术指标api
最近很多人在咨询 SKA 框架的情况,整理了一些资料,欢迎交流沟通~
Testing Ad Attributions with a Downloaded Profile
. 各个事件有最长归因时间窗口,超过该窗口发生的转化无法归因到对应的事件上,具体如下。
广告网络展示了一个StoreKit渲染的广告
用户有30天的时间窗口来安装 app
广告网链展示了一个浏览广告
用户有24小时窗口来安装 app
用户安装了 app
用户有60天窗口来启动 app
用户启动 app 且 app 调用了
registerAppForAdNetworkAttribution()
函数
设备在24小时定时器到期后在0-24小时内随机发送安装-验证回传信号
用户启动 app 且 app 调用了
updateConversionValue
函数
设备在最后一次调用updateConversionValue函数的24小时定时器到期后在0-24小时内随机发送安装-验证回传信号
-
IDFV - Identifier For Vendor(应用开发商标识符)
-
IDFA - Identifier For Advertising(广告标识符)
-
mmp - mobile measure partner (移动成效衡量合作伙伴)
-
SKAdNetwork类说明
-
registerAppForAdNetworkAttribution函数说明
-
updateConversionValue函数说明
-
接收广告归因
-
SKStoreProductParameterAdNetworkCampaignIdentifier
– 广告网络计划标记符
-
匹配式归因,链路式归因以及IOS SKAdNetwork归因说明
-
appsflyer公众号
-
https://www.zhihu.com/people/richard-zhu/posts
-
博客:
https://rchardzhu.github.io/
backtrader
是一个用于回测和交易的python框架,它功能丰富,可以让你聚焦在设计可重用的交易策略、指标和分析上,而不用花大量时间在构建基础框架上面。
-
github开源,策略编写简单快速
-
安装方便,除了matplotlib外,不依赖其他外部lib
-
支持ib等券商实时交易
-
数据来源支持csv文件,在线数据源或pandas格式,同时支持多数据来源、多策略
-
支持TA-lib指标,方便支持自定义指标的开发,集成pyfolio分析模块等
-
支持品种多,运行速度快:pandas 矢量运算、多策略并行运算
-
gpl 3.0授权,更改框架需要开源
-
画图界面风格比较老旧
-
框架代码抽象比较多,使用了大量的元编程,学习比较费劲
1 2 3 4
|
pip install backtrader git clone https://github.com/mementum/backtrader.git cd samples/commission-schemes python commission-schemes.py --plot
|
-
https://www.zhihu.com/people/richard-zhu/posts
-
博客:
https://rchardzhu.github.io/
-
backtrader github
-
backtrader官方文档
-
rqalpha
是
米筐量化
开源的从数据获取、算法交易、回测引擎、实盘模拟、实盘交易到数据分析的程序化交易框架。跟quantopian开源的
zipline
从api到本地运行方式都比较类似
-
rqalpha简单易学,能很快上手
-
rqalpha具有灵活的配置方式和比较强大的扩展性,可以比较容易地定制
-
rqalpha所有的策略都可以直接在
Ricequant
上进行回测和实盘模拟,并且可以通过微信和邮件实时推送交易信号
-
rqalpha不支持港美股回测&交易,可以自定义支持,但成本不小
-
rqalpha仅限非商业使用,如需商业使用,需要联系官方
-
Ricequant实盘模拟需要开通企业版
-
rqalpha本身支持不同周期的回测和实盘交易,但是目前只免费开放A股市场日线数据,如果用户需要做分钟回测或者更细级别的回测可以在 Ricequant上进行,也通过实现数据层接口函数来使用自己的数据
申请链接
)或者付费购买了米筐数据服务,可以使用 RQDatac 在每日盘后即时更新回测数据,更新命令如下:
$ rqalpha update-bundle
-
运行以下命令,将会在指定目录生成一个examples文件夹,其中包含几个有趣的样例策略:
$ rqalpha examples -d ./
1 2
|
$ cd examples $ rqalpha run -f rsi.py -s 2020-01-01 -e 2021-01-01 -o result.pkl --plot --progress --account stock 100000
|
-
绘制回测结果:如果运行完回测后,还需要再次绘制回测结果,可以运行以下命令:
$ rqalpha plot result.pkl
-
-
行情数据 - 五十行代码接入 tushare 行情数据
完善了tushare mod接口,增加了对tspro接口的支持,参见
rqalpha_mod_tushare
-
-
https://www.zhihu.com/people/richard-zhu/posts
-
博客:
https://rchardzhu.github.io/
-
rqalpha github
-
rqalpha介绍
-
zipline和rqalpha对比
-
rqalpha扩展事件源
-
rqalpha扩展数据源
-
rqalpha策略示例
-
rqalpha基础api
-
VeighNa
– 基于Python的开源量化交易系统开发框架, 之前叫vnpy,最近改名叫VeighNa了,官网是
https://www.vnpy.com
, 对应的产品是VeighNa Studio。 不是
http://www.vnpy.cn
,其对应的产品是VN Trader 。百度搜vnpy出来的是
https://www.vnpy.cn。
不要搞混了,这两之前在打官司。 VeighNa定位是量化交易平台,提供从交易API对接到策略自动交易的完整解决方案,对接了国内外诸多不同类型的金融市场:证券、期货、期权、外汇、数字货币等。有回测功能,但支持较弱。
python发行版
,其内置了最新版的VeighNa框架以及VeighNa Station量化管理平台,无需手动安装。 对ubuntu支持其次,对mac支持最弱。
安装后,在
VeighNa社区论坛
注册获得VeighNa Station账号密码(论坛账号密码即是)
Mac安装: bash install_osx.sh
mac在开始安装vn.py之前,需要先手动安装几个特殊的库,打开Terminal后执行以下命令:
1 2
|
brew install ta-lib // 不安装这个,会提示talib/_ta_lib.c:601:10: fatal error: 'ta-lib/ta_defs.h' file not found pip install TA-Lib
|
talib,是Technical Analysis Library的简称,是一种广泛用在程序化交易中进行金融市场数据的技术分析的函数库。它提供了多种技术分析的函数,方便我们量化投资中编程工作
因为mac上不支持ctp接口,所以要注释掉ctp接口,否则运行会报错
https://github.com/vnpy/vnpy
这个代码库中,但python很容易造成依赖包冲突,导致软件不能正常工作,从2.x某个版本起,vnpy开始分拆成N个代码库,好处是你只需要安装你需要的依赖,不容易造成依赖包冲突,不好的是拆的太细代码库太多了,维护起来较麻烦。
下面按如下顺序对vn.py各个功能进行说明:数据、存储、交易、回测、rpc、event、策略。
-
对接各类数据服务的适配器接口
-
对接tushare
–tushare api参考
tushare通用行情接口
-
对接tqsdk
-
对接米筐RQData
–实现类: RqdataClient
Demo: 从rqdata获取历史行情,操作步骤:
1) 初始化rqdataClient
2) 构造请求对象
3) 从rqdata获取数据
4) 将数据保存到本地数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
from vnpy.trader.rqdata import RqdataClient from vnpy.trader.object import HistoryRequest
# 初始化rqdataClient rqdata_client = RqdataClient() rqdata_client.init()
# 构造请求对象 history_req = HistoryRequest( symbol='C2105', exchange=Exchange('DCE'), start=datetime(2021,1,1), end=datetime(2021,2,1), interval=Interval.DAILY )
# 从rqdata获取数据 ret_data = rqdata_client.query_history(history_req)
#将数据保存到本地数据库 database_manager.save_bar_data(ret_data)
|
-
data_manager
:历史数据管理模块,通过树形目录查看数据库中已有的数据概况,选择任意时间段数据查看字段细节,支持CSV文件的数据导入和导出。
一句话概括:用好database_manager这个对象,提供了如下方法:
1 2 3 4 5
|
def load_bar_data( self, symbol: str, exchange: Exchange, interval: Interval, start: datetime, end: datetime) -> List[BarData] def load_tick_data(self, symbol: str, exchange: Exchange, start: datetime, end: datetime ) -> List[TickData]: def get_bar_overview(self) -> List[BarOverview] def delete_bar_data( self, symbol: str, exchange: Exchange, interval: Interval ) -> int: def delete_tick_data(self, symbol: str, exchange: Exchange ) -> int:
|
-
data_recorder
:行情记录模块,基于图形界面进行配置,根据需求实时录制Tick或者K线行情到数据库中,用于策略回测或者实盘初始化
-
对接各类数据库的适配器接口
在量化中,研究策略和实盘交易,都离不开数据。如果要提升回测速度,那么就需要搭建本地数据库。
vn.py数据库结构:DbBarData表示K线数据表映射对象,对应数据库的db_bar_data集合;DbTickData表示TICK数据表映射对象,对应对应数据库的db_tick_data; DbBarOverview表示K线汇总数据表映射对象,对应数据库的db_bar_overview。
通过对象database_manager实现,该对象通过抽象工厂模式,根据实际情况调用具体的数据库实现类。相关类: BaseDatabase。 存入数据库database_manager.save_bar_data(bars);从csv导入,import_data_from_csv, output_data_to_csv;从RQData查询, download_bar_data。
-
对接sqlite
–基于peewee开发的SQLite数据库接口,无需另外安装配置数据库软件。SqliteDatabase类继承自BaseDatabase
-
对接mysql
–基于peewee开发的MySQL数据库接口。MysqlDatabase类继承自BaseDatabase
-
对接mongodb
–基于pymongo开发的MongoDB数据库接口
-
vnpy.gateway覆盖国内外所有交易品种的交易接口
对应接口交易接口Gateway类的query_history函数,实现历史数据的下载
-
对接futu
–基于futu-api开发的富途证券港股、美股交易接口。使用时需要注意本接口只支持限价单。FutuGateway类继承自BaseGateway。参考
futu api文档
。适用于港美股、期权等
-
对接ib
–封装InteractiveBrokers交易接口,connect, close, subscribe, send_order, query_account, query_position, query_history,底层使用EClient接口。适用于全球证券、期货、期权、贵金属等
-
对接ctp
–基于CTP期货版的6.5.1接口封装开发,接口中自带的是【穿透式实盘环境】的dll文件。适用于国内期货、期权
-
对接中泰XTP
–适用于国内证券(A股)、ETF期权
-
RPC服务(rpc):跨进程通讯接口,用于分布式架构。
使用zmq进行消息传递
-
cta_backtester
:CTA策略回测模块,无需使用Jupyter Notebook,直接使用图形界面直接进行策略回测分析、参数优化等相关工作
1 2 3 4 5 6
|
backtester_engine.start_downloading( vt_symbol, interval, start, end )
|
BacktesterEngine 封装了BacktestingEngine,还有init_rqdata。ib有query_history(),futu, tiger没有该接口
-
rpc & webtrader
-
web_trader
:Web服务模块,针对B-S架构需求设计,实现了提供主动函数调用(REST)和被动数据推送(Websocket)的Web服务器
-
rpc_service
:RPC服务模块,允许将某一进程启动为服务端,作为统一的行情和交易路由通道,允许多客户端同时连接,实现多进程分布式系统
-
事件驱动引擎
-
event
作为事件驱动型交易程序的核心,使用Queue和Timer来实现
-
开箱即用的各类量化策略交易应用(app):
-
cta_strategy
:CTA策略引擎模块,在保持易用性的同时,允许用户针对CTA类策略运行过程中委托的报撤行为进行细粒度控制(降低交易滑点、实现高频策略)
-
spread_trading
:价差交易模块,支持自定义价差,实时计算价差行情和持仓,支持半自动价差算法交易以及全自动价差策略交易两种模式
-
option_master
:期权交易模块,针对国内期权市场设计,支持多种期权定价模型、隐含波动率曲面计算、希腊值风险跟踪等功能
-
portfolio_strategy
:组合策略模块,面向同时交易多合约的量化策略(Alpha、期权套利等),提供历史数据回测和实盘自动交易功能
-
algo_trading
:算法交易模块,提供多种常用的智能交易算法:TWAP、Sniper、Iceberg、BestLimit等
-
script_trader
:脚本策略模块,针对多标的组合类交易策略设计,同时也可以直接在命令行中实现REPL指令形式的交易,不支持回测功能
-
paper_account
:本地仿真模块,纯本地化实现的仿真模拟交易功能,基于交易接口获取的实时行情进行委托撮合,提供委托成交推送以及持仓记录
-
chart_wizard
:K线图表模块,基于RQData数据服务(期货)或者交易接口获取历史数据,并结合Tick推送显示实时行情变化
-
portfolio_manager
:交易组合管理模块,以独立的策略交易组合(子账户)为基础,提供委托成交记录管理、交易仓位自动跟踪以及每日盈亏实时统计功能
-
excel_rtd
:Excel RTD(Real Time Data)实时数据服务,基于pyxll模块实现在Excel中获取各类数据(行情、合约、持仓等)的实时推送更新
-
risk_manager
:风险管理模块,提供包括交易流控、下单数量、活动委托、撤单总数等规则的统计和限制,有效实现前端风控功能
-
-
https://www.zhihu.com/people/richard-zhu/posts
-
博客:
https://rchardzhu.github.io/
-
vnpy项目文档
-
Veighna量化
-
Tkinter
– Tcl/Tk的python接口,python标准库自带不需单独安装。但界面相对简陋,基础组件不全,框架功能相对较弱,使用不多
-
wxPython
– wxWidgets的python封装接口
-
PySimpleGUI
– 对tkinter, Qt, WxPython等python gui框架的进一步封装
-
PyQt
– Riverbank Computing公司发布的对QT框架的python封装,GPL授权
-
PySide
– QT官方发布的QT python封装,LGPL授权,可以闭源发布。 qt官方给出的
Pyside和PyQt差异
,除了包名、工具名外,大部分差别不大
从目前使用情况来看,PyQt使用的比较多,但PyQt是GPL授权,而PySide是LGPL授权,其功能与PyQt区别不大,但可以闭源发布。量化软件vnpy最新版使用的就是pyside6,下文主要介绍pyside6。
-
Using Qt Designer
.设计存储在.ui文件中,是基于XML格式的文档. 可以使用pyside6-uic在编译时将设计转换成python/c++代码。
-
可以使用QtUiTools模块里面的类来直接加载ui文件
-
从Designer或QtCreator用QUiLoader和pyside6-uic使用.ui文件
-
Using .qrc Files (pyside6-rcc)
– Qt资源系统是一个可以用来在应用程序中存储二进制文件的机制,这些文件可以嵌入到应用程序并且可以被QFile类和QIcon、QPixmap类的构造函数来访问,文件名用:/来开始。最常见的使用情况时自定义的图片、图标、字体等
-
Qt Linguist和它相关的工具可以用来提供应用程序多语言的翻译功能,参考
Translating Applications
-
Qt Widgets应用使用一个依赖于底层平台的默认主题。在某些情况,存在一些系统范围的配置可以用来修改Qt主题,也可以自己的widgets并为每个组件提供一个自定义的style. 参考
Styling the Widgets Application
-
QML是一个声明式语言,可以让你比传统语言(c++)更快的开发应用程序。由于它的声明特性,非常适合设计应用程序的UI。在QML,一个用户界面被指定为带有属性的对象树
-
一个PySide6/QML应用程序由至少2个不同的文件组成–一个是QML描述的用户界面文件,另外一个是用于load QML文件的python文件。QtQml和QtQuick模块提供了基于QML的UI的必要功能
-
Shiboken 擅长Qt相关的binding生成,这意味着任何Qt/C++项目可以很容易暴露给python。另外,Shiboken也提供了对于非Qt的c++项目的支持
-
费用工具教程
-
更多pyside示例
–在pyside6安装环境site-packages/PySide6/examples目录下,包括3d、画图、多媒体、网络、数据可视化等多个分类
-
vnpy qt
-
https://www.zhihu.com/people/richard-zhu/posts
-
博客:
https://rchardzhu.github.io/
-
为什么很多Python开发者写GUI不用Tkinter,而要选择PyQt和wxPython或其他?
-
PyQt和PySide的历史渊源
-
Qt for Python官方完整教程
-
Qt for Python快速开始
– pyside6快速开始
-
pyside概念篇
-
pyside所有模块
-
pyside教程
–包括Qt Widgets、Quick/QML、General Applications基础教程
-
将应用程序分发到其他系统/平台
– 使用fbs、PyInstaller、cx_Freeze、briefcase、py2exe、Nuitka等工具打包python程序
-
模型/视图编程
-
fbs
– fbs解决了常见的打包和部署问题,基于Python和Qt, fbs是Electron的一个轻量级替代品
-
electron
– 非python。使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序
-
electron-vue
– 非python。 使用vue构建electron应用的模版项目
Latex 是功能非常强大的排版工具,
MacTeX 2021
有4Gb 大小,之前装过觉得用处不大,这次决定装一个mini版本
BasicTex
,不用gui的话,功能也够用了
BasicTex
官网手动下载pkg文件手动安装。或者使用homebrew安装。
使用 homebrew 安装非常简单,只需一条命令即可。
$brew install basictex
安装完还不能直接使用,还需要把 texlive 添加到环境变量中,才能找到相关的命令。
$export PATH=/usr/local/texlive/2021basic/bin/universal-darwin/:$PATH
执行
$xelatex
不报错的话,说明环境安装成功。
然后就是安装相关的包,以及更新包。
sudo tlmgr update --self
安装包的时候速度慢的话推荐使用
清华的CTAN 镜像
。
billryan/resume
或
xdanaux/moderncv
。
以billryan/resume 为例,git clone下载到本地后,使用git switch zh_CN 切换到中文分支。
执行:
$xelatex resume-zh_CN.tex
编译失败,会提示缺少某些包。使用tlmgr安装对应的包即可。
比如:
$sudo tlmgr install xifthen ifmtarg titlesec enumitem nth
安装完成后,继续xelatex编译即可,会生成resume-zh_CN.pdf 文件。
如果只是偶尔使用一下xelatex,也可以考虑试下xelatex云编译器
cloud compiler LaTeX to PDF
-
https://www.zhihu.com/people/richard-zhu/posts
-
博客:
https://rchardzhu.github.io/