在Python中使用QuantLib
Quantlib简介
相比TA-Lib在技术分析领域的地位,QuantLib在金融工程领域的地位可以说有过之而无不及。
参考其官方网站,QuantLib中包含的的模块如下(其中个人感觉国内比较有用的添加了中文注释):
Currencies and FX rates(货币相关)
Date and time calculations(日期和时间计算)
Calendars
Day counters
Design patterns
Financial instruments
Finite-differences framework
Lattice methods
Math tools
1-D Interpolations and corresponding traits
One-dimensional solvers
Optimizers(优化器)
Monte Carlo framework (蒙特卡洛模拟框架)
Numeric types
Output manipulators
Pricing engines(定价引擎)
Asian option engines(亚式期权)
Barrier option engines(障碍期权)
Basket option engines(篮子期权)
Cap/floor engines
Cliquet option engines
Forward option engines(远期期权)
Quanto option engines
Swaption engines
Vanilla option engines(普通期权)
QuantLib macros
Debugging macros
Numeric limits
Short-rate modelling framework(短期利率建模框架)
Stochastic processes(随机过程)
Term structures(期限结构)
Utilities
作为期权交易员,作者本人比较关注的是期权定价引擎和日历模块。接下来国内预计将会推出的大商所豆粕期权和郑商所白糖期权都是美式期权,在每天连续交易时段中定价比较适合的是二叉树模型。相比较于闭式解的BS模型,基于数值模拟的二叉树模型的运算量提高了一个数量级,因此高效的定价引擎对于这些商品期权的交易员而言十分重要。QuantLib使用C++开发,并通过SWIG包装对其他语言提供调用API,足以满足连续交易对性能的需求。
其他的亚式期权、障碍期权定价引擎等,则适合国内OTC期权市场的参与者(无论做市商还是买方机构),毕竟这是一个“货物出柜、概不退换”的市场,想要不被对手坑就得保证自己也能有奇异期权定价能力。
QuantLib在Python中的安装
QuantLib功能强大的同时安装也较为复杂,其官方网站仅提供了源代码,需要用户自行编译,完成后还需要编译QuantLib的SWIG封装从而实现Python调用。
除了官方提供的SWIG封装外,Enthought公司在Github上还有一个名为pyql的Cython封装项目,号称速度更快,API设计更Pythonic,但是这里作者提醒:
除非真的特别喜好折腾,否则轻易不要跳pyql的坑!安装过程相当复杂(涉及到修改QuantLib的C++源代码),pyql在github上的安装教程中的步骤也有一些错误,作者跳坑后花了两周都没爬出来,老老实实回去用SWIG封装了。
下面开始一步步的介绍安装步骤:
参考Python量化交易平台开发教程系列3-vn.py项目中API封装的编译中的步骤,安装好Anaconda、Visual Studio和Boost,假设Anaconda的安装路径为D:\Anaconda,Boost的安装路径为D:\boost_1_60_0。
在这里下载QuantLib和Quantlib-SWIG,注意请选择两者都有的版本(在作者写这篇教程时,两者都有的最新版本号是1.7),将下载的zip文件分别解压缩,假设路径为D:\QuantLib-1.7和D:\QuantLib-SWIG-1.7。
在这里下载SWIG(swigwin-3.0.8),并解压缩放到D:\swigwin-3.0.8。
设置以下环境变量(不会的请参考设置环境变量):
- QL_DIR:D:\QuantLib-1.7
- myanaconda:D:\Anaconda
- myboost:D:\boost_1_60_0
- myswig:D:\swigwin-3.0.8
- myqlswig:D:\QuantLib-SWIG-1.7
编译安装QuantLib,打开cmd,切换到D盘(输入D:,因为上面的所有文件夹都在D盘),点击窗口左上角的图标,选择“编辑->粘贴“,将下方的批处理命令复制到cmd中运行(可以一次性全部复制,也可以逐行复制运行,注意全部复制时,若运行到某一步卡住,可以尝试按回车执行这一步的命令):
REM 这里使用的是VS2013REM 打开VS命令行工具来设置编译所需的环境变量 "%VS120COMNTOOLS%\VsDevCmd.bat"REM 切换到QuantLib代码所在的文件夹 cd %QL_DIR%REM 把boost库添加到include和library路径中,并且指定VSC+=使用这些路径 set INCLUDE=%myboost%;%INCLUDE% set LIB=%myboost%\lib32-msvc-12.0;%LIB% set UseEnv=trueREM 使用msbuild来编译QuantLib REM 这个要花一段时间(几十分钟到若干小时) msbuild /p:AdditionalLibPaths="%myboost\lib" /p:Configuration=Release /p:Platform=Win32 QuantLib_vc12.sln
编译安装QuantLib-SWIG,将下方的批处理命令复制到cmd中运行(运行方法和上一步相同):
REM 把编译工具设置为使用VS2013 set VS100COMNTOOLS=%VS120COMNTOOLS% set VS90COMNTOOLS=%VS120COMNTOOLS%REM 打开VS命令行工具来设置编译所需的环境变量 "%VS120COMNTOOLS%\VsDevCmd.bat"REM 切换到QuantLib-SWIG下面的Python文件夹下 cd %myqlswig%\PythonREM 创建setup.cfg echo [build] > setup.cfg echo compiler=msvc >> setup.cfgREM 设置路径和环境变量 set PATH=%myanaconda%;%myanaconda%\scripts;%myswig%;%PATH% set INCLUDE=%myboost%;%INCLUDE% set LIB=%myboost%\lib32-msvc-12.0;%LIB%REM 编译QuantLib-SWIG的Python接口 REM 只有当swig的.i文件发生变化时,才需要先执行wrap命令 python setup.py wrap python setup.py build python setup.py install
接下来可以尝试运行D:\QuantLib-SWIG-1.7\Python\examples目录下的一些例子,没有报错则说明安装成功
有社区成员发现TA-Lib的下载网站上也有QuantLib的安装包,不想折腾以上步骤的用户可以尝试(作者并未测试过,大家请自行折腾)。
vn.py和QuantLib
相比较于TA-Lib,QuantLib由于其主要针对复杂衍生品,适用的人群会相对窄一些,举两个例子:
商品期权的CTA策略交易
前文已经提到过国内的商品期权将会主要采用美式期权的合约设计,在定价方面需要使用二叉树模型。商品期权的最小价格变动通常比其标的物本身更小(相同的价格变动对应的TICK跳动更多),所以会比其标的物更适合交易CTA类的策略。
但是同时因为期权的非线性特征,在做多时可以采用买入看涨和卖出看跌两种方法(做空也一样有两种:买入看跌和卖出看涨),具体的选择就需要参考当时的波动率水平,而QuantLib的速度足以满足CTA类策略对于低延时的要求。
场外期权交易系统
越来越多的国内买方机构(券商资管、信托、基金和私募等)开始参与到OTC期权的市场,OTC期权以灵活著称,不但可交易的品种更多(沪深300、中证500、黄金、铜等),可供选择的期权类型也更多(灵活到期时间、奇异期权)。
目前大部分机构依旧采用传统的EXCEL来记录和管理,通常需要手动输入行情数据(也可以使用Wind接口接入实时行情),使用较为麻烦也无法做到实时的一些交易对冲。同时由于EXCEL VBA的局限性,对于障碍期权等奇异期权,买家往往无法自己进行估值,必须依赖于OTC做市商给出的数字。
结合vn.py和QuantLib,交易员可以构建连通场内外的期权交易系统,使用数据库而不是EXCEL来管理持仓和风险,并基于实时行情来计算当前持仓的希腊值敞口,结合场内的期货和现货(ETF、股票等)来实现日内对冲,从而真正实现三维立体的交易模式。
在Python中使用QuantLib相关推荐
- 如何优雅的在python中暂停死循环?
死循环 有时候在工作中可能会遇到要一直执行某个功能的程序,这时候死循环就派上用途了,python中死循环的具体形式大致如下 while True:run_your_code() 结束死循环 通常我们结 ...
- 关于python中的dict和defaultdict
dict 在Python中如果访问字典中不存在的键,会引发KeyError异常,所以一般当我们比如统计一句话的词频时候,我们总是使用这样的处理方式: strings = ('puppy', 'kitt ...
- python中的新式类与旧式类的一些基于descriptor的概念(上)
python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2.2.1 静态方法 2.2.2 类方法 2.3 新式类(n ...
- Python中yield和yield from的用法
yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...
- Python中正则表达式用法 重点格式以这个为准_首看_各种问题
20210811 https://www.jb51.net/article/101258.htm 一.惰性模式的概念: 此模式和贪婪模式恰好相反,它尽可能少的匹配字符以满足正则表达式即可,例如: va ...
- 逗号分隔的字符串转换为Python中的列表 split
将逗号分隔的字符串转换为Python中的列表 给定一个字符串: 它是由逗号分隔的几个值的序列: mStr = '192.168.1.1,192.168.1.2,192.168.1.3' 如何将字符串转 ...
- [翻译]Python中yield的解释
问题: Python中yield关键字的作用是什么?它做了什么? 例如,我想理解以下代码 def node._get_child_candidates(self, distance, min_dist ...
- 全面理解Python中的类型提示(Type Hints)
众所周知,Python 是动态类型语言,运行时不需要指定变量类型.这一点是不会改变的,但是2015年9月创始人 Guido van Rossum 在 Python 3.5 引入了一个类型系统,允许开发 ...
- python中break和continue的区别
python中break和continue的区别 break 结束for 或者while 循环 后面还没循环到的 不再循环 continue 当满足某种条件时结束当前值的循环 后面没有循环的继续循环 ...
- 通过带Flask的REST API在Python中部署PyTorch
通过带Flask的REST API在Python中部署PyTorch 在本文中,将使用Flask来部署PyTorch模型,并用讲解用于模型推断的 REST API.特别是,将部署一个预训练的Dense ...
最新文章
- bug诞生记——临时变量、栈变量导致的双杀
- 【微信小程序企业级开发教程】小程序的配置详解
- python3安装哪个版本-python2和python3哪个版本新
- python工程师-如何面试Python后端工程师?
- python类中方法的执行顺序-python 函数或者类 代码的执行顺序
- [问题解决] File /struts-tags not found
- ​通俗理解神经网络BP反向传播算法
- 大分区表高并发性能提升100倍?阿里云 RDS PostgreSQL 12 解读
- 如何提高写前端的效率?干货,快进!
- 三星Galaxy S4 刷入CWM Recovery和获取ROOT教程
- ks 曲线_ROC曲线与KS曲线的理解
- 硬盘无刷电机驱动,适用于四线的无刷马达。
- 精准面试突击55:delete、drop、truncate有什么区别?
- JavaExcel模板下载(多sheet)
- PhotoShop学习篇
- 【03】Linux笔记
- uni-app的由来
- 机壳地与数字地_模拟地的关系
- 基于SRGAN实现图像超分辨率重建或复原
- Oracle的行列转换
热门文章
- SIGIR 2016信息检索精选论文
- java 类 程序_在java中编写程序,定义一个学生类
- Labview保存keysight示波器图像
- Google商业奥秘:免费的商业模式下的盈利奥秘
- Scrapy框架爬取智联招聘网站上海地区python工作第一页(90条)
- Python爬取天气数据,并每天定时发送到QQ邮箱
- 【Linux服务器】Docker安装
- 联想mk100支持Linux,联想MK300固件升级(解决WIN10兼容问题)
- hdu1050Moving Tables
- mapengpeng1999@163.com Web开发简介