csv読み込み備忘録

概要

・Numpy, Pandasを使ってcsvを読み込むときの俺様備忘録

ロード対象csvフォーマット

下記pythonコードにも書いてありますが、手元にあったFXデータを使用。
フォーマットは

hogehoge, YYYYMMDD, HH:MM:SS, bid price, ask price

という形。
hogehogeには”USDJPY”といった為替レートの通貨名文字列が格納されてます。
stringとfloatが混在していて少し扱いが面倒。

コード

いつもググってる気がするのでまとめておく
最終的に、リストのリスト形式にしたいと考えているので、各々のロード関数を使った後に変換しています。
pandasで読み込んだ後に、ndarrayに変換するのが最速という結果。
どうやらcsvを読む処理がボトルネックになっているようで、ndarrayへの変換はそこまで時間がかからない様子。

pandasのread_csvはfloatの小数点の処理にクセがあるので、float_precisionを指定する必要あり
なお、float_preicisionはpandas 0.15.1から対応しています。

numpyのloadtxtはリストのリスト形式で返してくるものの、dtypeを指定しなければならないので面倒

genfromtxtはタプルのリストで返してくるので、一旦np.array()でリストのリストに変換している。
dtypeを各列ごとに指定すると処理速度が向上するものの面倒
しかも指定したところでpandasには及ばない

いやはやしかしnumpyのロードはもう少し早くならないものか。

出力結果

配列の中身は出力していません。
pandasが優秀ですね。

参考

What’s New — pandas 0.15.1 documentation
http://pandas.pydata.org/pandas-docs/version/0.15.1/whatsnew.html

Reading Text Tables with Python | Pen and Pants
http://penandpants.com/2012/03/09/reading-text-tables-with-python/

Fastest Python library to read a CSV file – Software Recommendations Stack Exchange
http://softwarerecs.stackexchange.com/questions/7463/fastest-python-library-to-read-a-csv-file

為替オプションデータからボラティリティ・スマイルを構築

概要

・為替オプションのボラティリティデータからボラティリティ・スマイルをキャリブレーションする
・Polynominal in deltaとSABRの2種類を計算

背景

・ボラティリティスマイルの存在
一般的にインプライド・ボラティリティは行使価格により異なる値がマークされており、行使価格とインプライド・ボラティリティを繋げる\( \sigma \left( K \right) \)という関数を見つけることがプライシング、またリスク管理上重要です。
ATMのボラティリティだけ見て、OTMを評価しようとすると痛い目を見ますよということですな。

株式オプションの場合などには、いくつかの行使価格ごとにオプションが存在することから容易に\( \sigma \left( K \right) \)を推定することができる一方、為替オプションの場合には、
・ATMインプライド・ボラティリティ
・リスクリバーサル(10デルタ、25デルタ)
→ コールとプットの差に相当し、スマイルのスキューを表す
・ストラングル(10デルタ、25デルタ)
→ コール + プット – ATMに相当し、スマイルの曲率を表す
の情報のみがマーケットに与えられています。したがって、これらの情報と整合的なようにボラティリティ・スマイル\( \sigma \left( K \right) \)を推定しなければなりません。

今回は参考文献にも記載されているPolynominal in deltaという方法と、SABRの2種類を実際にRを使って計算してみたいと思います。
今回はその中でも、ATMと25デルタの3点の情報を使ってスマイルを構築してみたいと思います。

マーケットには10デルタの情報もあるので、この5点を使ってスマイルを構築するという方法もありますが、それはまた別のお話ということで

前準備、データなど

基本的には参考文献3章に記載されているデータを使用しています。
対象はユーロドルの1年のオプションデータです。
為替オプションの場合、一口にデルタと言っても様々な表現方法があります。ユーロドルの1年の場合にはPip spotという方式になります。この方式に関しては通貨ペアの種類や、年限にも依存するので詳細は参考文献参照ということで汗

pip spotの方式に従う場合、ATMの行使価格はgetATMStrike()関数に記載されているような式で計算することが出来ます。
また、Polynominal in delta、SABRの両手法で共通する部分関してはCalibrationと書いてある以下の部分で計算しています。
具体的にはATMの行使価格、マーケットストラングルの行使価格、オプション価値の総和ですね。

Polynominal in delta

さて上記の情報を元に、キャリブレーションをするわけです。
Polynominal in deltaに関しては名前の通り多項式関数でスマイルを構築します。2次関数でキャリブレーションしますので推定するパラメータはc0, c1, c2となります。
この3つのパラメータと同時に、スマイルストラングルというパラメータ(2つの行使価格)も推定します。

さらに、マーケットでクオートされているATM、リスクリバーサルの情報も満たすように制約条件を加えてあげますと以下の様な感じでしょうか。whileループの中に式番号が振ってありますがこれは参考文献の中で記載されている制約条件に対応しています。

推定結果を見てみますと、

となり、左から、c0, c1, c2, k_25c, k_25pとなります。
c0, c1, c2に関しては参考文献の推定結果と異なりますが、k_25c, k_25pに関してはそれらしい値が推定されていることが分かります。

また、リスクリバーサル、及びストラングルの制約を満たしていることが分かります。
推定されたパラメータからボラティリティ・スマイルを構築してみると以下。

141116_1

SABR

ここで、polynominal in deltaと別の方法である、SABRという方法も試してみます。
あとで分かることですが、polynominal in deltaはdeep out of the moneyで十分なインプライドボラティリティを持たせることが出来ないという欠点があります。
そこを克服する方法がSABRとなるわけですな。
求めるパラメータはalpha, volvol, rho, betaの4つとなります。この中のbetaに関しては外生的に固定値を与えるやり方がオシャレなようでして、参考文献でもbeta = 1で固定しています。今回のコードもそれを踏襲。
また、alpha, volvolは非負制約、rhoは相関係数で[-1, 1]の制約があります。それを満たすように、前者はexpを、後者はtanhをかませています。

で、推定されたパラメータがこちら

ということで、こちらも全く参考文献と同じというわけではありませんが、似たような値が出てきます。

また、結果は割愛しますがSABRでの推定結果もリスクリバーサル、ストラングルの条件を満たしています。
スマイルの形状は以下。

141116_2

両手法の比較

141116_3

ということで、前述しましたように、polynoinal in deltaでは特に行使価格が非常に小さくなった領域におけるインプライド・ボラティリティを十分に与えられていないことが分かります。

参考文献

Foreign Exchange Option Pricing: A Practitioners Guide (The Wiley Finance Series)
http://www.amazon.co.jp/dp/B005YX4VYE