在本篇中,我们将介绍Q宽客常用工具之一:函数插值。接着将函数插值应用于一个实际的金融建模场景中:波动率曲面构造。

通过本篇的学习您将学习到:

  1. 如何在scipy中使用函数插值模块:interpolate
  2. 波动率曲面构造的原理;
  1. interpolate运用于波动率曲面构造。

1. 如何使用scipy做函数插值

函数插值,即在离散数据的基础上补插连续函数,估算出函数在其他点处的近似值的方法。在scipy中,所有的与函数插值相关的功能都在scipy.interpolate模块中

from scipy import interpolate

dir(interpolate)[:5]

['Akima1DInterpolator','BPoly','BarycentricInterpolator','BivariateSpline','CloughTocher2DInterpolator']

作为介绍性质的本篇,我们将只关注interpolate.spline的使用,即样条插值方法:

  • xk离散的自变量值,为序列
  • yk对应xk的函数值,为与xk长度相同的序列
  • xnew需要进行插值的自变量值序列
  • order样条插值使用的函数基德阶数,为1时使用线性函数
Interpolate a curve at new points using a spline fitParameters----------xk, yk : array_likeThe x and y values that define the curve.xnew : array_likeThe x values where spline should estimate the y values.order : intDefault is 3.kind : stringOne of {'smoothest'}conds : Don't knowDon't knowReturns-------spline : ndarrayAn array of y values; the spline evaluated at the positions `xnew`.

1.1 三角函数(np.sin)插值

一例胜千言!让我们这里用实际的一个示例,来说明如何在scipy中使用函数插值。这里的目标函数是三角函数:

f(x)=sin(x)

假设我们已经观测到的f(x)在离散点x=(1,3,5,7,9,11,13)的值:

1.1 三角函数(np.sin)插值一例胜千言!让我们这里用实际的一个示例,来说明如何在scipy中使用函数插值。这里的目标函数是三角函数:f(x)=sin(x)
假设我们已经观测到的f(x)在离散点x=(1,3,5,7,9,11,13)的值:


首先我们使用最简单的线性插值算法,这里面只要将spline的参数order设置为1即可:

xnew = np.linspace(1.0,13.0,500)
ynewLinear = interpolate.spline(x,y,xnew,order = 1)
ynewLinear[:5]
array([ 0.84147098,  0.83304993,  0.82462888,  0.81620782,  0.80778677])

最后我们获得真实的 sin(x) 的值:

ynewReal = np.sin(xnew)
ynewReal[:5]

让我们把所有的函数画到一起,看一下插值的效果。对于我们这个例子中的目标函数而言,由于本身目标函数是光滑函数,则越高阶的样条插值的方法,插值效果越好。

pylab.figure(figsize = (16,8))
pylab.plot(xnew,ynewReal)
pylab.plot(xnew,ynewLinear)
pylab.plot(xnew,ynewCubicSpline)
pylab.scatter(x,y, s = 160, marker='x', color = 'k')
pylab.legend([u'真实曲线', u'线性插值', u'样条插值', u'$f(x)$离散点'], prop = font)
pylab.title(u'$f(x)$不同插值方法拟合效果:线性插值 v.s 样条插值', fontproperties = font)

2. 函数插值应用 —— 期权波动率曲面构造


市场上期权价格一般以隐含波动率的形式报出,一般来讲在市场交易时间,交易员可以看到类似的波动率矩阵(Volatilitie Matrix):

import pandas as pd
pd.options.display.float_format = '{:,>.2f}'.format
dates = [Date(2015,3,25), Date(2015,4,25), Date(2015,6,25), Date(2015,9,25)]
strikes = [2.2, 2.3, 2.4, 2.5, 2.6]
blackVolMatrix = np.array([[ 0.32562851,  0.29746885,  0.29260648,  0.27679993],[ 0.28841840,  0.29196629,  0.27385023,  0.26511898],[ 0.27659511,  0.27350773,  0.25887604,  0.25283775],[ 0.26969754,  0.25565971,  0.25803327,  0.25407669],[ 0.27773032,  0.24823248,  0.27340796,  0.24814975]])
table = pd.DataFrame(blackVolMatrix * 100, index = strikes, columns = dates, )
table.index.name = u'行权价'
table.columns.name = u'到期时间'
print u'2015年3月3日10时波动率矩阵'
table

交易员可以看到市场上离散值的信息,但是如果可以获得一些隐含的信息更好:例如,在2015年6月25日以及2015年9月25日之间,波动率的形状会是怎么样的?

2.1 方差曲面插值

我们并不是直接在波动率上进行插值,而是在方差矩阵上面进行插值。方差和波动率的关系如下:

Var(K,T)=σ(K,T)2T

所以下面我们将通过处理,获取方差矩阵(Variance Matrix):

evaluationDate = Date(2015,3,3)
ttm = np.array([(d - evaluationDate) / 365.0 for d in dates])
varianceMatrix = (blackVolMatrix**2) * ttm
varianceMatrix
array([[ 0.00639109,  0.0128489 ,  0.02674114,  0.04324205],[ 0.0050139 ,  0.01237794,  0.02342277,  0.03966943],[ 0.00461125,  0.01086231,  0.02093128,  0.03607931],[ 0.00438413,  0.0094909 ,  0.02079521,  0.03643376],[ 0.00464918,  0.00894747,  0.02334717,  0.03475378]])

这里的值varianceMatrix就是变换而得的方差矩阵。

下面我们将在行权价方向以及时间方向同时进行线性插值,具体地,行权价方向:

Var(K,t)=K2−KK2−K1Var(K1,t)+K−K1K2−K1Var(K2,t)

时间方向:

Var(K)=t2−tt2−t1Var(K,t1)+t−t1t2−t1Var(K,t2)

这个过程在scipy中可以直接通过interpolate模块下interp2d来实现:

  • ttm 时间方向离散点
  • strikes 行权价方向离散点
  • varianceMatrix 方差矩阵,列对应时间维度;行对应行权价维度
  • kind = 'linear' 指示插值以线性方式进行

interp = interpolate.interp2d(ttm, strikes, varianceMatrix, kind = 'linear')

array([ 0.00639109])
最后我们获取整个平面上所有点的方差值,再转换为波动率曲面。
sMeshes = np.linspace(strikes[0], strikes[-1], 400)
tMeshes = np.linspace(ttm[0], ttm[-1], 200)
interpolatedVarianceSurface = np.zeros((len(sMeshes), len(tMeshes)))
for i, s in enumerate(sMeshes):for j, t in enumerate(tMeshes):interpolatedVarianceSurface[i][j] = interp(t,s)interpolatedVolatilitySurface = np.sqrt((interpolatedVarianceSurface / tMeshes))
print u'行权价方向网格数:', np.size(interpolatedVolatilitySurface, 0)
print u'到期时间方向网格数:', np.size(interpolatedVolatilitySurface, 1)
行权价方向网格数:
400 到期时间方向网格数: 200
选取某一个到期时间上的波动率点,看一下插值的效果。这里我们选择到期时间最近的点:2015年3月25日:
pylab.figure(figsize = (16,8))
pylab.plot(sMeshes, interpolatedVolatilitySurface[:, 0])
pylab.scatter(x = strikes, y = blackVolMatrix[:,0], s = 160,marker = 'x', color = 'r')
pylab.legend([u'波动率(线性插值)', u'波动率(离散)'], prop = font)
pylab.title(u'到期时间为2015年3月25日期权波动率', fontproperties = font)


最终,我们把整个曲面的图像画出来看看:

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cmmaturityMesher, strikeMesher = np.meshgrid(tMeshes, sMeshes)
pylab.figure(figsize = (16,9))
ax = pylab.gca(projection = '3d')
surface = ax.plot_surface(strikeMesher, maturityMesher, interpolatedVolatilitySurface*100, cmap = cm.jet)
pylab.colorbar(surface,shrink=0.75)
pylab.title(u'2015年3月3日10时波动率曲面', fontproperties = font)
pylab.xlabel("strike")
pylab.ylabel("maturity")
ax.set_zlabel(r"volatility(%)")

更多开源源码请点击

量化分析师的Python日记【Q Quant兵器谱之函数插值】相关推荐

  1. 量化分析师的Python日记 系列

    量化分析师的Python日记 系列 转发,原作者 薛昆Kelvin 为方便学习,整理一下学习材料.持续更新. [第1天:谁来给我讲讲Python?] https://uqer.io/community ...

  2. 量化分析师的Python日记-CSDN公开课-专题视频课程

    量化分析师的Python日记-7882人已学习 课程介绍         以完全初学者的角度入手来认识Python这个在量化领域日益重要的语言. 课程收益     课程先从介绍Python本身一些基本 ...

  3. 量化分析师的Python日记【Q Quant兵器谱之偏微分方程2】

    这是量化分析师的偏微分方程系列的第二篇,在这一篇中我们将解决上一篇显式格式留下的稳定性问题.本篇将引入隐式差分算法,读者可以学到: 隐式差分格式描述 三对角矩阵求解 如何使用scipy加速算法实现 在 ...

  4. 量化分析师的Python日记【Q Quant兵器谱之二叉树】

    通过之前几天的学习,Q Quant们应该已经熟悉了Python的基本语法,也了解了Python中常用数值库的算法.到这里为止,小Q们也许早就对之前简单的例子不满意,希望能在Python里面玩票大的!O ...

  5. 量化分析师的Python日记【Q Quant 之初出江湖】

    本篇中,作为Quant中的Q宗(P Quant 和 Q Quant 到底哪个是未来?),我们将尝试把之前的介绍的工具串联起来,小试牛刀. 您将可以体验到: 如何使用python内置的数学函数计算期权的 ...

  6. python量化分析系列(第一篇)_量化分析师的 Python 日记 [第 1 天:谁来给我讲讲 Python?]...

    45 条回复 • 2016-05-25 11:10:23 +08:00 1 2015-04-08 21:42:42 +08:00 这里竟然有Quant 2 2015-04-08 22:49:51 +0 ...

  7. 量化分析师的Python日记【Q Quant兵器谱 -之偏微分方程1】

    从今天开始我们将进入一个系列 -- 偏微分方程.作为这一系列的开篇,我们以热传导方差为引子,引出: 如何提一个偏微分方程的初边值问题: 利用差分格式将偏微分方程离散化: 显示差分格式: 显示差分格式的 ...

  8. 量化分析师的Python日记【Q Quant兵器谱之偏微分方程3的具体金融学运用】

    欢迎来到 Black - Scholes - Merton 的世界!本篇中我们将把第11天学习到的知识应用到这个金融学的具体方程之上! import numpy as np import math i ...

  9. 量化分析师的python日记_量化分析师的Python日记【第1天:谁来给我讲讲Python?】...

    "谁来给我讲讲Python?" 作为无基础的初学者,只想先大概了解一下Python,随便编个小程序,并能看懂一般的程序,那些什么JAVA啊.C啊.继承啊.异常啊通通不懂怎么办,于是 ...

最新文章

  1. linux进程间通信:POSIX 消息队列 ----异步通信
  2. netbios 网上基本输入输出系统 简介
  3. ubuntu下安装各种软件
  4. [知乎回答] 前端是否要学习 Node.js?
  5. 解决Eclipse的Team菜单中没有SVN选项的问题
  6. 前端学习(1996)vue之电商管理系统电商系统之美化步骤条
  7. 织梦留言板guestbook.htm加入头部导航
  8. idea 添加servlet依赖_详解如何使用IntelliJ IDEA新建一个Servlet项目
  9. ASP.net在页面所有内容生成后、输出内容前对页面内容进行操作
  10. 嗯....零乱知识点map和字符串转换的
  11. Exchange 2007 474 问题解决方法
  12. STM32学习记录0003——STM32芯片解读
  13. Django表单系统
  14. 倍福--和威伦触摸屏通信
  15. 计算机ps基础知识教案范文,计算机制图软件ps教案内页.doc
  16. 厦门大学国家奖学金答辩PPT模板
  17. 一文解决scrapy带案例爬取当当图书
  18. 模型实践 | Alphafold 蛋白质结构预测
  19. 2021-2027全球与中国5G独立组网非独立组网基础设施市场现状及未来发展趋势
  20. 霹雳吧啦Wz语义分割学习笔记P5

热门文章

  1. facebook google qq企业邮箱 登陆
  2. GBASE8S的HAC高可用配置
  3. linux的xml文件格式,linux – 如何将非UTF-8格式的xml文件转换为符合UTF-8的xml
  4. HTML怎么把图片颜色加深,怎么把Photoshop的图片整体颜色加深?
  5. PageRank网页排名算法
  6. Linux高级命令进阶(week1_day2)--技术流ken
  7. 信息系统项目管理师考试法律法规、行业标准、政策资料
  8. 管理鸡汤之管理定律分类解读
  9. 记录学习技巧--如何翻阅或学习英文文档
  10. Centos7 安装DB2