FpML to QuantLib 外滙美式選擇權估值

Non-Copylefted 2019 Alvin Cho. Provided ‘AS IS’. 7 May 2019.
Any quantitative method used in this file may not 100% correct for some reasons. Please use after you fully understand them.
版權沒有, 歡迎使用, 沒有任何保證. 裡面使用的估值方法可以因為任何理由不正確或是不適用你的情況, 請完全理解再使用.

FpML 解析

from lxml import etree

利用 etree.parse 將 xml 檔案載入並 parse. 這個文檔是 FpML 5.11 Comfirmation View 裡的 fx-ex10-amer-opt.zml. 將 FpML.org 下載的最新版規格壓後就可以找到. 此 FpML 文檔的詳細說明請參考 FpML 範例詳解: 外滙美式選擇權 fx-ex10-amer-opt.xml

fp=etree.parse('FpML/confirmation/products/fx-derivatives/fx-ex10-amer-opt.xml')

Confirmation View 的 namespace 一律是這個, 在任何 xpath 搜尋都需要指定 namespace.
在 FpML 裡面 namespace 用得不是很複雜, 同一個 view 裡的都用一樣

ns={"ns":"http://www.fpml.org/FpML-5/confirmation"}
asset=fp.xpath('//ns:trade/*',namespaces=ns)[1].tag

找到 tag 為 trade 的 node, 裡面有交易的細節. 第二個子節點就是這筆交易的產品. 這個文檔是做 fxOption

asset
'{http://www.fpml.org/FpML-5/confirmation}fxOption'
exercise=fp.xpath('//ns:fxOption/ns:americanExercise | //ns:fxOption/ns:europeanExercise',namespaces=ns)[0].tag

判斷這個外滙選擇權是美式還是歐式. 此產品是美式, 也就是在到期日之前都可以行權.

exercise
'{http://www.fpml.org/FpML-5/confirmation}americanExercise'
commencementDate=fp.xpath('//ns:americanExercise/ns:commencementDate//ns:unadjustedDate/text()',namespaces=ns)[0]

權利開始日期, 這個日期對估值不是很重要.

commencementDate
'2001-12-04'
expiryDate=fp.xpath('//ns:expiryDate/text()',namespaces=ns)[0]

其他要素一一提出

expiryDate
'2002-06-04'
businessCenter=fp.xpath('//ns:expiryTime/ns:businessCenter/text()',namespaces=ns)[0]
businessCenter
'USNY'
putCurrency=fp.xpath('//ns:putCurrencyAmount/ns:currency/text()',namespaces=ns)[0]
putCurrency
'AUD'
putCurrencyAmount=fp.xpath('//ns:putCurrencyAmount/ns:amount/text()',namespaces=ns)[0]
putCurrencyAmount
'75000000'
callCurrency=fp.xpath('//ns:callCurrencyAmount/ns:currency/text()',namespaces=ns)[0]
callCurrency
'USD'
callCurrencyAmount=fp.xpath('//ns:callCurrencyAmount/ns:amount/text()',namespaces=ns)[0]
putCurrencyAmount
'75000000'
strike=fp.xpath('//ns:strike/ns:rate/text()',namespaces=ns)[0]
strike
'0.4920'
strikeQuoteBasis=fp.xpath('//ns:strike/ns:strikeQuoteBasis/text()',namespaces=ns)[0]
strikeQuoteBasis
'CallCurrencyPerPutCurrency'

到這裡我們結束了 lxml 的工作, 要進入到 QuantLib 的世界了

QuantLib 估值

from QuantLib import *
e=expiryDate.split('-')
e
['2002', '06', '04']

使用 QuantLib 的日期, 不但是估值過程需要, 對一些節假日調整和工作日計算也很有用.

expiry=Date(int(e[2]),int(e[1]),int(e[0]))
expiry
Date(4,6,2002)

日曆在 FpML 和 QuantLib 都處理得很仔細,這是在美國紐約的交易, 使用 QuantLib 內建的美國行事曆.

calendar=UnitedStates()

原本應該用今天的日期, 但這產品早就到期閮, 把估值日定為到期前三十天.

daysToExpiration=Period(-30,Days)
valuationDate=calendar.advance(expiry,daysToExpiration)
valuationDate
Date(22,4,2002)

到美國 FED 提供的數據庫找滙率歷史價格

fredEXCode={'USDEUR':'DEXUSEU', 'CNYUSD':'DEXCNUS', 'JPYUSD':'DEXJPUS', 'USDGBP':'DEXUSUK', 'AUDUSD':'DEXUSAL'}
currencyPair=putCurrency+callCurrency
fred=fredEXCode[currencyPair]

取 253 個資料點, 可以做出 252 個報酬率數據, 用這些數據來計算歷史波動率 volatility. 注意: 這個波動率所計算出來的價格跟市場價會有差距.

volStartDate=calendar.advance(valuationDate,Period(-253,Days))
volStartDate
Date(18,4,2001)

準備好日期之後, 我們要調用 Yahoo 提供的股價歷史數據. 利用 Pandas-datareader

import pandas_datareader.data as pddr
priceData=pddr.DataReader(fred,'fred',str(volStartDate.dayOfMonth())+'/'+str(volStartDate.month())+'/'+str(volStartDate.year()),str(valuationDate.dayOfMonth())+'/'+str(valuationDate.month())+'/'+str(valuationDate.year()))
priceData
DEXUSAL
DATE
2001-04-18 0.4990
2001-04-19 0.5085
2001-04-20 0.5178
2001-04-23 0.5061
2001-04-24 0.5035
2001-04-25 0.5045
2001-04-26 0.5065
2001-04-27 0.5102
2001-04-30 0.5096
2001-05-01 0.5177
2001-05-02 0.5213
2001-05-03 0.5187
2001-05-04 0.5189
2001-05-07 0.5186
2001-05-08 0.5182
2001-05-09 0.5222
2001-05-10 0.5241
2001-05-11 0.5207
2001-05-14 0.5180
2001-05-15 0.5193
2001-05-16 0.5233
2001-05-17 0.5273
2001-05-18 0.5251
2001-05-21 0.5290
2001-05-22 0.5231
2001-05-23 0.5188
2001-05-24 0.5175
2001-05-25 0.5193
2001-05-28 NaN
2001-05-29 0.5166
... ...
2002-03-12 0.5206
2002-03-13 0.5200
2002-03-14 0.5229
2002-03-15 0.5257
2002-03-18 0.5245
2002-03-19 0.5235
2002-03-20 0.5308
2002-03-21 0.5322
2002-03-22 0.5326
2002-03-25 0.5305
2002-03-26 0.5287
2002-03-27 0.5275
2002-03-28 0.5336
2002-03-29 0.5333
2002-04-01 0.5347
2002-04-02 0.5347
2002-04-03 0.5314
2002-04-04 0.5305
2002-04-05 0.5306
2002-04-08 0.5270
2002-04-09 0.5274
2002-04-10 0.5303
2002-04-11 0.5342
2002-04-12 0.5337
2002-04-15 0.5313
2002-04-16 0.5320
2002-04-17 0.5370
2002-04-18 0.5387
2002-04-19 0.5390
2002-04-22 0.5390

264 rows × 1 columns

要估值的 valueDate 設定為先前指定的到期日前三十天

Settings.instance().evaluationDate=valuationDate

好, 所有信息都齊備了, 我們要建立這個期權的基本信息

option=VanillaOption(PlainVanillaPayoff(Option.Call,float(strike)),AmericanExercise(valuationDate,expiry))

以下要進入估階段了. 使用 numpy 的數學公式來計算 volatility. NaN的值未處理

import numpy
priceData['Log_Return']= numpy.log(priceData[fred] / priceData[fred].shift(1) )
volatility=numpy.std(priceData['Log_Return'])*numpy.sqrt(252)
volatility
0.1113899946929118

建立一個常數型的波動率, Day Count 是 Actual/365 Fixed

volatilityTS=BlackVolTermStructureHandle(BlackConstantVol(valuationDate, calendar, volatility, Actual365Fixed()))

下一步是準備 Garman Kohlagen Process 做外滙選擇權估值所需要的兩個貨幣的無風險利率, 定為 0.02 和 0.03 常數

r=0.02
rTS=YieldTermStructureHandle(FlatForward(valuationDate,r,Actual365Fixed()))
f=0.03
fTS=YieldTermStructureHandle(FlatForward(valuationDate,f,Actual365Fixed()))

Spot 價格取歷史數據最後一筆. 它是個 Handle, 跟變數一樣可以調整 Handle 的再重新估值, 以後再詳細說明這部份.

spot=priceData[fred][-1]
spot
0.539
spotHandle=QuoteHandle(SimpleQuote(spot))

再來是建立 Garman Kohlagen Process

gkProcess=GarmanKohlagenProcess(spotHandle, fTS, rTS, volatilityTS)

將 Process 指定給一個 PricingEngine

steps=500
option.setPricingEngine(BinomialVanillaEngine(gkProcess,'crr',steps))

大功告成, 可以估值了!

option.NPV()
0.04700000000000004

這個合約的價值總計

option.NPV()*int(callCurrencyAmount)
1734300.0000000016

本篇結束

FpML to QuantLib 外滙美式選擇權估值相关推荐

  1. FpML to QuantLib 外滙歐式Barrier選擇權估值 fx-ex12-fx-barrier-option.xml

    FpML to QuantLib 外滙歐式Barrier選擇權估值 Non-Copylefted 2019 Alvin Cho. Provided 'AS IS'. 10 May 2019. Any ...

  2. java冒泡排序找最大的值_(13)數組操作:遍歷、輸出最大值、冒泡排序、選擇排序,java已有的排序方法、折半查找...

    1.數組遍歷 /* * 獲取數組中元素,遍歷 */ int []y=new y[3]; for(int i=0;i { System.out.println("y["+i+&quo ...

  3. 創業團隊基建工具選擇

    工欲善其事,必先利其器. 工匠想要使他的工作做好,一定要先讓工具鋒利.要做好一件事,準備工作非常重要. 一個優秀的創業團隊也需要優秀的工具作為支撐,本文將會把曾經我用過的一些好工具介紹給大家. 首先, ...

  4. Csharp: Winform 顏色選擇器 Color convert RGB and RGB convert Color

    /// <summary>/// 選擇顏色/// </summary>/// <param name="sender"></param&g ...

  5. Android小項目之---吃飯選哪?--》選擇對話框(附源碼)

    還記得早先我們做的記算器的例子嗎?當中的驗證判斷用到了對話框,今天我們來做一個不一樣的對話框,要做的這個小例子是一個可供選擇效果的對話框 即層層迭迭的Alert Dialog:界面方面我們擺放一個Bu ...

  6. android 仿ios timepicker,android:TimePicker仿照IOS時間選擇器,可自定義選擇器

    背景: 項目要求寫一個選擇器:不僅僅是單純的時間,還包括自定義部分. 搜了很久,搜出來只用一個自定義view.java類,再簡單封裝下的選擇器: 貼下源碼:public class PickerVie ...

  7. 空位補零,你會選擇哪種方式?

    隨便寫著玩的... using System; namespace KiloNet {     class  test     {         static void Main(string[]  ...

  8. stagefright框架(三)-選擇Video Decoder

    在<Stagefright (1) – Video Playback的流程>中,我們並沒有詳述Stagefright是如何根據影片檔的類型來選擇適合的video decoder,現在,就讓 ...

  9. win rn linux n,Linux上的“快速選擇”(或類似)實現? (而不是排序| uniq -c | sort -rn | head - $ N)...

    PROBLEM: Frequently I face a need to see what are the most-frequently-repeated "patterns" ...

最新文章

  1. activiti5/6 系列之--BpmnModel使用
  2. [转] Gradle: 此时不应有 Androidandroid-studiosdk oolslib\find_java.exe。解决方法
  3. [Asp.net MVC]Asp.net MVC5系列——第一个项目
  4. Android开源项目分类汇总[转]
  5. c#.net连接access操作类(转)
  6. C# .NET 根据Url链接保存Image图片到本地磁盘
  7. pat1035. Password (20)
  8. rs.open select * from bbs,conn,1,1 参数说明
  9. 我在使用vector时候遇到的二逼问题
  10. 搞笑证件生成php源码,搞笑证件生成器下载
  11. 正规表达式与有限自动机
  12. 课后作业-阅读任务-阅读提问-4
  13. C#随机不重复给数组赋值1-100并排序
  14. docker 下使用 Hyperf(win10)
  15. 锐捷客户端了解网络架构
  16. c语言程序设计高校饭卡系统,C语言课程设计-学生饭卡管理系统(45页)-原创力文档...
  17. 博弈 - SG函数和SG定理
  18. 全国计算机等级考试二级Python(2021年9月)备考笔记 第六天
  19. 辅导作业很“崩溃”?猿辅导教你三招告别怒吼式教育
  20. 手机虚拟化--人人都只用手机了

热门文章

  1. 1. THE REAL-TIME VOLUMETRIC CLOUDSCAPES OF HORIZON ZERO DAWN
  2. 全向移动平台android版手机控制器——UI界面设计
  3. 2020 嵌入式系统原理与应用技术(第2版) 期末复习 【整理】 习题2
  4. MySQL之MyCat
  5. 影响CRM定价的因素
  6. 中文自然语言处理--基于 textCNN 的电影推荐系统
  7. word中如何在表格上方加入一行以及英文如何设置自动断字
  8. 硅谷领军行动:两大诺贝尔得主同时空降,黑石摩根解密晋级风控,斯坦福专家点睛区块链全图谱...
  9. 图像插值——线性差值
  10. 巧用flashback database实现灵活的数据切换