-
Notifications
You must be signed in to change notification settings - Fork 94
/
quantlib-tutorial.html
464 lines (424 loc) · 20.9 KB
/
quantlib-tutorial.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
<!DOCTYPE html>
<html lang="zh"
>
<head>
<title>在Python中使用QuantLib - vn.py</title>
<!-- Using the latest rendering mode for IE -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="/images/favicon.png" rel="icon">
<link rel="canonical" href="/quantlib-tutorial.html">
<meta name="author" content="用Python的交易员" />
<meta name="description" content="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(定价引擎 ..." />
<meta property="og:site_name" content="vn.py" />
<meta property="og:type" content="article"/>
<meta property="og:title" content="在Python中使用QuantLib"/>
<meta property="og:url" content="/quantlib-tutorial.html"/>
<meta property="og:description" content="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(定价引擎 ..."/>
<meta property="article:published_time" content="2016-03-15" />
<meta property="article:section" content="文章" />
<meta property="article:author" content="用Python的交易员" />
<!-- Bootstrap -->
<link rel="stylesheet" href="/theme/css/bootstrap.readable.min.css" type="text/css"/>
<link href="/theme/css/font-awesome.min.css" rel="stylesheet">
<link href="/theme/css/pygments/monokai.css" rel="stylesheet">
<link rel="stylesheet" href="/theme/css/style.css" type="text/css"/>
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "//hm.baidu.com/hm.js?e8c7573f82d43fa50c895a8e28c49ceb";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
</head>
<body>
<div class="navbar navbar-default navbar-fixed-top" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a href="/" class="navbar-brand">
<img src="/images/favicon.png" width=""/> vn.py </a>
</div>
<div class="collapse navbar-collapse navbar-ex1-collapse">
<ul class="nav navbar-nav">
<li><a href="/pages/quickstart.html">
Quick Start
</a></li>
<li><a href="/pages/blog.html">
日志
</a></li>
<li><a href="/pages/screenshot.html">
截图
</a></li>
<li><a href="/pages/community.html">
社区
</a></li>
<li><a href="/pages/api.html">
API接口
</a></li>
<li><a href="/pages/download.html">
下载
</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li><a href="/archives.html"><i class="fa fa-th-list"></i><span class="icon-label">Archives</span></a></li>
</ul>
</div>
<!-- /.navbar-collapse -->
</div>
</div> <!-- /.navbar -->
<!-- Banner -->
<style>
#banner{
background-image:url("/images/banner.png");
}
</style>
<div id="banner">
<div class="container">
<div class="copy">
<h1>vn.py</h1>
<p class="intro">Developed by traders, for traders.</p>
</div>
</div>
</div><!-- End Banner -->
<div class="container">
<div class="row">
<div class="col-sm-9">
<section id="content">
<article>
<header class="page-header">
<h1>
<a href="/quantlib-tutorial.html"
rel="bookmark"
title="Permalink to 在Python中使用QuantLib">
在Python中使用QuantLib
</a>
</h1>
</header>
<div class="entry-content">
<div class="panel">
<div class="panel-body">
<footer class="post-info">
<span class="label label-default">Date</span>
<span class="published">
<i class="fa fa-calendar"></i><time datetime="2016-03-15T16:25:42+08:00"> 2016-03-15(周二)</time>
</span>
</footer><!-- /.post-info --> </div>
</div>
<h2>Quantlib简介</h2>
<p>相比TA-Lib在技术分析领域的地位,QuantLib在金融工程领域的地位可以说有过之而无不及。</p>
<p>参考其<a href="http://quantlib.org/reference/modules.html">官方网站</a>,QuantLib中包含的的模块如下(其中个人感觉国内比较有用的添加了中文注释):</p>
<blockquote>
<ul>
<li>
<p>Currencies and FX rates(货币相关)</p>
</li>
<li>
<p>Date and time calculations(日期和时间计算)</p>
</li>
<li>
<p>Calendars </p>
</li>
<li>
<p>Day counters </p>
</li>
<li>
<p>Design patterns </p>
</li>
<li>
<p>Financial instruments</p>
</li>
<li>
<p>Finite-differences framework</p>
</li>
<li>
<p>Lattice methods </p>
</li>
<li>
<p>Math tools</p>
</li>
<li>
<p>1-D Interpolations and corresponding traits </p>
</li>
<li>
<p>One-dimensional solvers </p>
</li>
<li>
<p>Optimizers(优化器)</p>
</li>
<li>
<p>Monte Carlo framework (蒙特卡洛模拟框架)</p>
</li>
<li>
<p>Numeric types </p>
</li>
<li>
<p>Output manipulators </p>
</li>
<li>
<p>Pricing engines(定价引擎)</p>
</li>
<li>
<p>Asian option engines(亚式期权)</p>
</li>
<li>
<p>Barrier option engines(障碍期权)</p>
</li>
<li>
<p>Basket option engines(篮子期权)</p>
</li>
<li>
<p>Cap/floor engines </p>
</li>
<li>
<p>Cliquet option engines </p>
</li>
<li>
<p>Forward option engines(远期期权)</p>
</li>
<li>
<p>Quanto option engines </p>
</li>
<li>
<p>Swaption engines </p>
</li>
<li>
<p>Vanilla option engines(普通期权)</p>
</li>
<li>
<p>QuantLib macros </p>
</li>
<li>
<p>Debugging macros </p>
</li>
<li>
<p>Numeric limits </p>
</li>
<li>
<p>Short-rate modelling framework(短期利率建模框架)</p>
</li>
<li>
<p>Stochastic processes(随机过程)</p>
</li>
<li>
<p>Term structures(期限结构)</p>
</li>
<li>
<p>Utilities</p>
</li>
</ul>
</blockquote>
<p>作为期权交易员,作者本人比较关注的是期权定价引擎和日历模块。接下来国内预计将会推出的大商所豆粕期权和郑商所白糖期权都是美式期权,在每天连续交易时段中定价比较适合的是二叉树模型。相比较于闭式解的BS模型,基于数值模拟的二叉树模型的运算量提高了一个数量级,因此高效的定价引擎对于这些商品期权的交易员而言十分重要。QuantLib使用C++开发,并通过SWIG包装对其他语言提供调用API,足以满足连续交易对性能的需求。</p>
<p>其他的亚式期权、障碍期权定价引擎等,则适合国内OTC期权市场的参与者(无论做市商还是买方机构),毕竟这是一个“货物出柜、概不退换”的市场,想要不被对手坑就得保证自己也能有奇异期权定价能力。</p>
<h2>QuantLib在Python中的安装</h2>
<p>QuantLib功能强大的同时安装也较为复杂,其官方网站仅提供了源代码,需要用户自行编译,完成后还需要编译QuantLib的SWIG封装从而实现Python调用。</p>
<p>除了官方提供的SWIG封装外,Enthought公司在Github上还有一个名为pyql的Cython封装项目,号称速度更快,API设计更Pythonic,但是这里作者提醒:</p>
<blockquote>
<p>除非真的特别喜好折腾,否则轻易不要跳pyql的坑!安装过程相当复杂(涉及到修改QuantLib的C++源代码),pyql在github上的安装教程中的步骤也有一些错误,作者跳坑后花了两周都没爬出来,老老实实回去用SWIG封装了。</p>
</blockquote>
<p>下面开始一步步的介绍安装步骤:</p>
<ol>
<li>
<p>参考<a href="http://vnpy.org/2015/03/12/20150312_Python%E9%87%8F%E5%8C%96%E4%BA%A4%E6%98%93%E5%B9%B3%E5%8F%B0%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B%E7%B3%BB%E5%88%973-vn.py%E9%A1%B9%E7%9B%AE%E4%B8%ADAPI%E5%B0%81%E8%A3%85%E7%9A%84%E7%BC%96%E8%AF%91/">Python量化交易平台开发教程系列3-vn.py项目中API封装的编译</a>中的步骤,安装好Anaconda、Visual Studio和Boost,假设Anaconda的安装路径为<strong>D:\Anaconda</strong>,Boost的安装路径为<strong>D:\boost_1_60_0</strong>。</p>
</li>
<li>
<p>在<a href="https://sourceforge.net/projects/quantlib/files/QuantLib/">这里</a>下载QuantLib和Quantlib-SWIG,注意请选择两者都有的版本(在作者写这篇教程时,两者都有的最新版本号是1.7),将下载的zip文件分别解压缩,假设路径为<strong>D:\QuantLib-1.7</strong>和<strong>D:\QuantLib-SWIG-1.7</strong>。</p>
</li>
<li>
<p>在<a href="http://www.swig.org/">这里</a>下载SWIG(swigwin-3.0.8),并解压缩放到<strong>D:\swigwin-3.0.8</strong>。</p>
</li>
<li>
<p>设置以下环境变量(不会的请参考<a href="http://jingyan.baidu.com/article/3ea51489e1c2b752e61bbad0.html">设置环境变量</a>):</p>
<ul>
<li>QL_DIR:D:\QuantLib-1.7</li>
<li>myanaconda:D:\Anaconda</li>
<li>myboost:D:\boost_1_60_0</li>
<li>myswig:D:\swigwin-3.0.8</li>
<li>myqlswig:D:\QuantLib-SWIG-1.7</li>
</ul>
</li>
<li>
<p>编译安装QuantLib,打开cmd,切换到D盘(输入D:,因为上面的所有文件夹都在D盘),点击窗口左上角的图标,选择“编辑->粘贴“,将下方的批处理命令复制到cmd中运行(可以一次性全部复制,也可以逐行复制运行,注意全部复制时,若运行到某一步卡住,可以尝试按回车执行这一步的命令):</p>
<div class="highlight"><pre><span></span>REM 这里使用的是VS2013
REM 打开VS命令行工具来设置编译所需的环境变量
<span class="s2">"%VS120COMNTOOLS%\VsDevCmd.bat"</span>
REM 切换到QuantLib代码所在的文件夹
<span class="nb">cd</span> %QL_DIR%
REM 把boost库添加到include和library路径中,并且指定VSC+<span class="o">=</span>使用这些路径
<span class="nb">set</span> <span class="nv">INCLUDE</span><span class="o">=</span>%myboost%<span class="p">;</span>%INCLUDE%
<span class="nb">set</span> <span class="nv">LIB</span><span class="o">=</span>%myboost%<span class="se">\l</span>ib32-msvc-12.0<span class="p">;</span>%LIB%
<span class="nb">set</span> <span class="nv">UseEnv</span><span class="o">=</span><span class="nb">true</span>
REM 使用msbuild来编译QuantLib
REM 这个要花一段时间(几十分钟到若干小时)
msbuild /p:AdditionalLibPaths<span class="o">=</span><span class="s2">"%myboost\lib"</span> /p:Configuration<span class="o">=</span>Release /p:Platform<span class="o">=</span>Win32 QuantLib_vc12.sln
</pre></div>
</li>
<li>
<p>编译安装QuantLib-SWIG,将下方的批处理命令复制到cmd中运行(运行方法和上一步相同):</p>
<div class="highlight"><pre><span></span>REM 把编译工具设置为使用VS2013
<span class="nb">set</span> <span class="nv">VS100COMNTOOLS</span><span class="o">=</span>%VS120COMNTOOLS%
<span class="nb">set</span> <span class="nv">VS90COMNTOOLS</span><span class="o">=</span>%VS120COMNTOOLS%
REM 打开VS命令行工具来设置编译所需的环境变量
<span class="s2">"%VS120COMNTOOLS%\VsDevCmd.bat"</span>
REM 切换到QuantLib-SWIG下面的Python文件夹下
<span class="nb">cd</span> %myqlswig%<span class="se">\P</span>ython
REM 创建setup.cfg
<span class="nb">echo</span> <span class="o">[</span>build<span class="o">]</span> > setup.cfg
<span class="nb">echo</span> <span class="nv">compiler</span><span class="o">=</span>msvc >> setup.cfg
REM 设置路径和环境变量
<span class="nb">set</span> <span class="nv">PATH</span><span class="o">=</span>%myanaconda%<span class="p">;</span>%myanaconda%<span class="se">\s</span>cripts<span class="p">;</span>%myswig%<span class="p">;</span>%PATH%
<span class="nb">set</span> <span class="nv">INCLUDE</span><span class="o">=</span>%myboost%<span class="p">;</span>%INCLUDE%
<span class="nb">set</span> <span class="nv">LIB</span><span class="o">=</span>%myboost%<span class="se">\l</span>ib32-msvc-12.0<span class="p">;</span>%LIB%
REM 编译QuantLib-SWIG的Python接口
REM 只有当swig的.i文件发生变化时,才需要先执行wrap命令
python setup.py wrap
python setup.py build
python setup.py install
</pre></div>
</li>
<li>
<p>接下来可以尝试运行<strong>D:\QuantLib-SWIG-1.7\Python\examples</strong>目录下的一些例子,没有报错则说明安装成功</p>
</li>
</ol>
<p>有社区成员发现TA-Lib的<a href="http://www.lfd.uci.edu/~gohlke/pythonlibs/">下载网站</a>上也有QuantLib的安装包,不想折腾以上步骤的用户可以尝试(作者并未测试过,大家请自行折腾)。</p>
<h2>vn.py和QuantLib</h2>
<p>相比较于TA-Lib,QuantLib由于其主要针对复杂衍生品,适用的人群会相对窄一些,举两个例子:</p>
<p><strong>商品期权的CTA策略交易</strong></p>
<p>前文已经提到过国内的商品期权将会主要采用美式期权的合约设计,在定价方面需要使用二叉树模型。商品期权的最小价格变动通常比其标的物本身更小(相同的价格变动对应的TICK跳动更多),所以会比其标的物更适合交易CTA类的策略。</p>
<p>但是同时因为期权的非线性特征,在做多时可以采用买入看涨和卖出看跌两种方法(做空也一样有两种:买入看跌和卖出看涨),具体的选择就需要参考当时的波动率水平,而QuantLib的速度足以满足CTA类策略对于低延时的要求。</p>
<p><strong>场外期权交易系统</strong></p>
<p>越来越多的国内买方机构(券商资管、信托、基金和私募等)开始参与到OTC期权的市场,OTC期权以灵活著称,不但可交易的品种更多(沪深300、中证500、黄金、铜等),可供选择的期权类型也更多(灵活到期时间、奇异期权)。</p>
<p>目前大部分机构依旧采用传统的EXCEL来记录和管理,通常需要手动输入行情数据(也可以使用Wind接口接入实时行情),使用较为麻烦也无法做到实时的一些交易对冲。同时由于EXCEL VBA的局限性,对于障碍期权等奇异期权,买家往往无法自己进行估值,必须依赖于OTC做市商给出的数字。</p>
<p>结合vn.py和QuantLib,交易员可以构建连通场内外的期权交易系统,使用数据库而不是EXCEL来管理持仓和风险,并基于实时行情来计算当前持仓的希腊值敞口,结合场内的期货和现货(ETF、股票等)来实现日内对冲,从而真正实现三维立体的交易模式。</p>
</div>
<!-- /.entry-content -->
</article>
</section>
</div>
<div class="col-sm-3" id="sidebar">
<aside>
<section class="well well-sm">
<ul class="list-group list-group-flush">
<li class="list-group-item"><h4><i class="fa fa-home fa-lg"></i><span class="icon-label">Social</span></h4>
<ul class="list-group" id="social">
<li class="list-group-item"><a href="http://github.com/vnpy/vnpy"><i class="fa fa-github-square fa-lg"></i> Github</a></li>
</ul>
</li>
<li class="list-group-item"><h4><i class="fa fa-external-link-square fa-lg"></i><span class="icon-label">Links</span></h4>
<ul class="list-group" id="links">
<li class="list-group-item">
<a href="http://www.vnpie.com" target="_blank">
官方论坛 - 维恩的派
</a>
</li>
<li class="list-group-item">
<a href="http://github.com/vnpy/vnpy/tree/master/vn.trader" target="_blank">
交易平台
</a>
</li>
<li class="list-group-item">
<a href="http://github.com/vnpy/vnpy/tree/master/vn.event" target="_blank">
事件引擎
</a>
</li>
<li class="list-group-item">
<a href="http://github.com/vnpy/vnpy/tree/master/vn.ctp" target="_blank">
CTP接口
</a>
</li>
<li class="list-group-item">
<a href="http://github.com/vnpy/vnpy/tree/master/vn.xspeed" target="_blank">
飞创接口
</a>
</li>
<li class="list-group-item">
<a href="http://github.com/vnpy/vnpy/tree/master/vn.femas" target="_blank">
飞马接口
</a>
</li>
<li class="list-group-item">
<a href="http://github.com/vnpy/vnpy/tree/master/vn.ksotp" target="_blank">
金仕达期权接口
</a>
</li>
<li class="list-group-item">
<a href="http://github.com/vnpy/vnpy/tree/master/vn.ksgold" target="_blank">
金仕达黄金接口
</a>
</li>
<li class="list-group-item">
<a href="http://github.com/vnpy/vnpy/tree/master/vn.sgit" target="_blank">
飞鼠接口
</a>
</li>
<li class="list-group-item">
<a href="http://github.com/vnpy/vnpy/tree/dev/vn.qdp" target="_blank">
QDP接口
</a>
</li>
<li class="list-group-item">
<a href="http://github.com/vnpy/vnpy/tree/master/vn.oanda" target="_blank">
OANDA接口
</a>
</li>
<li class="list-group-item">
<a href="http://github.com/vnpy/vnpy/tree/master/vn.ib" target="_blank">
IB接口
</a>
</li>
<li class="list-group-item">
<a href="http://github.com/vnpy/vnpy/tree/master/vn.shzd" target="_blank">
直达期货接口
</a>
</li>
<li class="list-group-item">
<a href="http://github.com/vnpy/vnpy/tree/master/vn.okcoin" target="_blank">
OKCoin接口
</a>
</li>
<li class="list-group-item">
<a href="http://github.com/vnpy/vnpy/tree/master/vn.datayes" target="_blank">
通联数据接口
</a>
</li>
<li class="list-group-item">
<a href="http://github.com/vnpy/vnpy/tree/master/vn.demo" target="_blank">
开发DEMO
</a>
</li>
</ul>
</li>
</ul>
</section>
</aside>
</div>
</div>
</div>
<footer>
<div class="container">
<hr>
<div class="row">
<div class="col-xs-10">© 2017 用Python的交易员
· Powered by <a href="https://github.com/DandyDev/pelican-bootstrap3" target="_blank">pelican-bootstrap3</a>,
<a href="http://docs.getpelican.com/" target="_blank">Pelican</a>,
<a href="http://getbootstrap.com" target="_blank">Bootstrap</a> </div>
<div class="col-xs-2"><p class="pull-right"><i class="fa fa-arrow-up"></i> <a href="#">Back to top</a></p></div>
</div>
</div>
</footer>
<script src="/theme/js/jquery.min.js"></script>
<!-- Include all compiled plugins (below), or include individual files as needed -->
<script src="/theme/js/bootstrap.min.js"></script>
<!-- Enable responsive features in IE8 with Respond.js (https://github.com/scottjehl/Respond) -->
<script src="/theme/js/respond.min.js"></script>
<script src="/theme/js/bodypadding.js"></script>
</body>
</html>