-
This C++ app does not require any external libraries. It does read in data from an excel s/h.
-
It is built with Visual C++ 2017 Community Edition. x64. Only debug mode has been tested.
-
It has two SABR related computations in function: SABR_BlackVol_InitialAlpha
- 'Obloj2008' Method in Obloj 2008
- 'hagan2002' Original Hagan's method in Hagan et. al. 2002
-
This SABR model does an initial fit of beta rho nu using method of a local calibration algorithm.
-
It has a '/doc' subdirectory with related pdfs embedded in spreadsheet, plus a few more.
-
It has an excel interface, to read in parameter data from a spreadsheet, needed for C++ calculations.
-
This C++ console app ported his VB code over to C++.
-
His Excel spreadshet is titled "Swaption_Volatility_SABR_Calibration.xls" See his worksheet titled "Copyright and Disclaimer"
-
This C++ console app reads in data from his spreadsheet. Then duplicates computations found on his worksheet 'SABR(Implied Alpha)'
-
This C++ console app has output that can be compared to Changwei Xiong's spreadsheet output on worksheet 'SABR(Implied Alpha)'
+ This code needs some cleanup. It was meant as a quick study.
+ Excel s/h was tested with Excel 2007 on Windows 10 Business
+ Excel s/h do not close if app is interrupted during debug.
+ Excel s/h is not that stable, with this xlsread....
+ Excel s/h has two addins:
+ Solver
+ If problems, google, how delete this Addin and then reinstall.
+ EDate for 2007 is available via Analysis Tool Pack Add for Excel 2007,
+ Decimal accuracy between Excel and C++ is off...not sure why.
+ This app does not yet promise to always close excel s/h. This has to be reviewed.
+ If run of this app is interrupted, an excel s/h will not be cleaned up. Have to add some code.
- Swaption_Volatility_SABR_Calibration.xls MUST BE CLOSED.
- Verify that this line is in 'Command Arguments" passed to app via VS properties, in debug mode. $(ProjectDir)Swaption_Volatility_SABR_Calibration.xls
- If that has problems then uncomment line in main, and type in your path to that s/h.
- //wchar_t* XLSPATH = L"H:\github\workdir.2018\SABR.NelderMead_Studies_2\Swaption_Volatility_SABR_Calibration.xls";
- and comment out this line:
- wchar_t* XLSPATH = (wchar_t*)argv[1];
======
=======
-
Fetching data from spreadsheet.... I added some formatting in Readme.md
-
=================Excel Input Local Calibration for NelderMead: Beta, Rho Nu ===========
| Beta | Rho | Nu |---------------------- | ------------------------ | --------------------- | 0.56000000000000005 | -0.01000000000000000 | 0.34599999999999997
-
=================Excel Input Fixed Rates ===========
| Fixed Rates | ----------- | 0.035257595 | 0.041738169 | 0.042418148
-
================= Excel Input MktVol ( SABR Implied Alpha Worksheet) ===========
| -200 | -100 |-------------------- | ------------------------ | 0.27410000000000001 | 0.21270000000000000 | 0.20929999999999999 | 0.16990000000000000 | 0.18420000000000000 | 0.14940000000000001 | 0.18140000000000001 | 0.14760000000000001
================= Excel Input K ===========
| -200.00000000000000000 | -100.00000000000000000
================= Excel Input StrikeRates_K ( Data Worksheet) ===========
| -200 | -100
|-------------------- | ------------------------
| 0.01525759459242056 | 0.02525759459242056
| 0.02173816907673853 | 0.03173816907673853
| 0.02241814840263004 | 0.03241814840263003
| 0.01925608289916845 | 0.02925608289916845
================= Excel Input ATMmktVol ( Data Worksheet) ===========
| 1 yr | 2 yr
|-------------------- | ------------------------
| 0.21500000000000000 | 0.21900000000000000
| 0.21600000000000000 | 0.21299999999999999
| 0.20899999999999999 | 0.20499999999999999
| 0.20000000000000001 | 0.19600000000000001
================= SABR Model Output: NelderMead Iterations to Converge =========== ================= for each row of SABR parameters ===========
| Loops per row for NelderMead to converge on values for alpha, beta, rho and nu.
| -----------------------------------------
| Row 0 Count 93
| Row 1 Count 115
| Row 2 Count 104
| Row 3 Count 124
================= SABR Model Output: Beta Rho Nu (via NelderMead's RunFunction/MyFunction) ===========
| beta | rho | Nu
|-------------------- | ---------------------- | ----------------------
| 0.56321204711218043 | -0.01319411793721832 | 0.34591921732199021
| 0.56305676412278327 | -0.02290658753951835 | 0.30525247364584918
| 0.59977120409842088 | -0.15816151757678021 | 0.25428353284912453
| 0.62201488699163354 | -0.17437854011038034 | 0.21155171237474185
================= SABR Model Output: Alpha (via NelderMead's RunFunction/MyFunction) ===========
| alpha |
| ----------- |
| 0.041294239 |
| 0.035201727 |
| 0.033891166 |
| 0.035117295 |
================= SABR Model Output: SABR volatilities (via NelderMead's RunFunction/MyFunction) ===========
| -200 | -100
|-------------------- | ------------------------
| 0.27407554051058425 | 0.21280701292774060
| 0.20927971575906210 | 0.16996182736375970
| 0.18418457013227427 | 0.14946216745150520
| 0.18138201330104567 | 0.14768012006332795