FpML to QuantLib 外滙美式選擇權估值
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 外滙美式選擇權估值相关推荐
- 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 ...
- java冒泡排序找最大的值_(13)數組操作:遍歷、輸出最大值、冒泡排序、選擇排序,java已有的排序方法、折半查找...
1.數組遍歷 /* * 獲取數組中元素,遍歷 */ int []y=new y[3]; for(int i=0;i { System.out.println("y["+i+&quo ...
- 創業團隊基建工具選擇
工欲善其事,必先利其器. 工匠想要使他的工作做好,一定要先讓工具鋒利.要做好一件事,準備工作非常重要. 一個優秀的創業團隊也需要優秀的工具作為支撐,本文將會把曾經我用過的一些好工具介紹給大家. 首先, ...
- Csharp: Winform 顏色選擇器 Color convert RGB and RGB convert Color
/// <summary>/// 選擇顏色/// </summary>/// <param name="sender"></param&g ...
- Android小項目之---吃飯選哪?--》選擇對話框(附源碼)
還記得早先我們做的記算器的例子嗎?當中的驗證判斷用到了對話框,今天我們來做一個不一樣的對話框,要做的這個小例子是一個可供選擇效果的對話框 即層層迭迭的Alert Dialog:界面方面我們擺放一個Bu ...
- android 仿ios timepicker,android:TimePicker仿照IOS時間選擇器,可自定義選擇器
背景: 項目要求寫一個選擇器:不僅僅是單純的時間,還包括自定義部分. 搜了很久,搜出來只用一個自定義view.java類,再簡單封裝下的選擇器: 貼下源碼:public class PickerVie ...
- 空位補零,你會選擇哪種方式?
隨便寫著玩的... using System; namespace KiloNet { class test { static void Main(string[] ...
- stagefright框架(三)-選擇Video Decoder
在<Stagefright (1) – Video Playback的流程>中,我們並沒有詳述Stagefright是如何根據影片檔的類型來選擇適合的video decoder,現在,就讓 ...
- 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" ...
最新文章
- activiti5/6 系列之--BpmnModel使用
- [转] Gradle: 此时不应有 Androidandroid-studiosdk oolslib\find_java.exe。解决方法
- [Asp.net MVC]Asp.net MVC5系列——第一个项目
- Android开源项目分类汇总[转]
- c#.net连接access操作类(转)
- C# .NET 根据Url链接保存Image图片到本地磁盘
- pat1035. Password (20)
- rs.open select * from bbs,conn,1,1 参数说明
- 我在使用vector时候遇到的二逼问题
- 搞笑证件生成php源码,搞笑证件生成器下载
- 正规表达式与有限自动机
- 课后作业-阅读任务-阅读提问-4
- C#随机不重复给数组赋值1-100并排序
- docker 下使用 Hyperf(win10)
- 锐捷客户端了解网络架构
- c语言程序设计高校饭卡系统,C语言课程设计-学生饭卡管理系统(45页)-原创力文档...
- 博弈 - SG函数和SG定理
- 全国计算机等级考试二级Python(2021年9月)备考笔记 第六天
- 辅导作业很“崩溃”?猿辅导教你三招告别怒吼式教育
- 手机虚拟化--人人都只用手机了
热门文章
- 1. THE REAL-TIME VOLUMETRIC CLOUDSCAPES OF HORIZON ZERO DAWN
- 全向移动平台android版手机控制器——UI界面设计
- 2020 嵌入式系统原理与应用技术(第2版) 期末复习 【整理】 习题2
- MySQL之MyCat
- 影响CRM定价的因素
- 中文自然语言处理--基于 textCNN 的电影推荐系统
- word中如何在表格上方加入一行以及英文如何设置自动断字
- 硅谷领军行动:两大诺贝尔得主同时空降,黑石摩根解密晋级风控,斯坦福专家点睛区块链全图谱...
- 图像插值——线性差值
- 巧用flashback database实现灵活的数据切换