金融工学のお勉強に公開データを使ってブラックショールズ方程式のお勉強。お勉強開始にあたってデータ準備まで。使っている技術の詳細は以下の本で。
- Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理
- 作者: Wes McKinney, et al.
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/12/26
リファレンス環境
- Windows 10
- Python 3.6.0
- Anaconda 4.3 - 5.0.1
- Pandas 0.19.2
Jupyter起動~ライブラリ読み込み
%matplotlib inline
# %matplotlib notebook
import pandas as pd
import requests, zipfile, io, dateutil
from datetime import datetime
便利関数定義
あとでcsv読み込み時に使う便利関数
def strip(text):
try:
return text.strip()
except AttributeError:
return text
データ準備
オプション理論価格等情報 | 日本取引所グループから入手した2017年2月10日の終値データ。 色々入っているけど2017年3月限の原資産:日経225のオプション取引データだけ使う。
ファイル取得~展開
2018年1月12日のデータを取得して、csvを展開します。
# 取得する日付
DL_Date = "20180112"
# 対象とする限月
MatMon = "201802"
# オプション理論価格等情報
# 利用ガイド:http://www.jpx.co.jp/markets/derivatives/option-price/01.html
# 一覧: http://www.jpx.co.jp/markets/derivatives/option-price/index.html
url = "http://www.jpx.co.jp/markets/derivatives/option-price/data/%s.zip"
file = "ose%stp"%DL_Date
r = requests.get(url%file)
z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall()
Pandasへデータ読み込み
- データ本体と別に配布されているヘッダー情報をもとに自分でヘッダーを起こして名前をつける
- 読み込み中にテキストデータの空白をトリムする
# ヘッダー名 (変数名順)
# 商品コード, 商品タイプ, 限月, 権利行使価格, 予備
# プットオプション: 銘柄コード, 終値, 予備, 理論価格, ボラティリティ
# コールオプション: 銘柄コード, 終値, 予備, 理論価格, ボラティリティ
# 原資産終値, 基準ボラティリティ
colName = ("CODE","TYPE","MATURITY","STRIKE", "RSV",
"PUT_CODE", "PUT_PRICE", "PUT_RSV", "PUT_TPRICE", "PUT_VOLATILITY",
"CALL_CODE","CALL_PRICE","CALL_RSV","CALL_TPRICE","CALL_VOLATILITY",
"F225_PRICE", "Base_VOL")
df_raw = pd.read_csv(file+".csv", names=colName,
converters = {'CODE' : strip,
'TYPE' : strip})
df_raw.head()
読み込んだデータの確認。
CODE | TYPE | MATURITY | STRIKE | RSV | PUT_CODE | PUT_PRICE | PUT_RSV | PUT_TPRICE | PUT_VOLATILITY | CALL_CODE | CALL_PRICE | CALL_RSV | CALL_TPRICE | CALL_VOLATILITY | F225_PRICE | Base_VOL | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | NK225E | OOP | 201703 | 11000.0 | 182031018 | 0.0 | 0.0 | 0.94 | 0.674892 | 192031018 | 8350.0 | 0.0 | 8372.22 | 0.792450 | 19378.93 | 0.1717 | |
1 | NK225E | OOP | 201703 | 11250.0 | 182031218 | 0.0 | 0.0 | 0.99 | 0.652465 | 192031218 | 0.0 | 0.0 | 8122.22 | 0.763183 | 19378.93 | 0.1717 | |
2 | NK225E | OOP | 201703 | 11500.0 | 182031518 | 0.0 | 0.0 | 1.03 | 0.627990 | 192031518 | 7850.0 | 0.0 | 7872.21 | 0.734523 | 19378.93 | 0.1717 | |
3 | NK225E | OOP | 201703 | 11750.0 | 182031718 | 1.0 | 0.0 | 1.07 | 0.603704 | 192031718 | 0.0 | 0.0 | 7622.20 | 0.706439 | 19378.93 | 0.1717 | |
4 | NK225E | OOP | 201703 | 12000.0 | 182032018 | 0.0 | 0.0 | 1.10 | 0.579896 | 192032018 | 0.0 | 0.0 | 7372.20 | 0.678904 | 19378.93 | 0.1717 |
データ整形
2017年3月限の日経225オプションだけ抜き出し。ついでに要らない列を削除してスッキリ。
df_raw = df_raw.query("MATURITY == %s & CODE==\"NK225E\""%MatMon)\
.drop(['RSV','PUT_RSV','CALL_RSV','PUT_CODE','CALL_CODE','CODE','TYPE','MATURITY'], 1)
- PUTとCALLが分かれてしまっているので、データを正規化。
- CALL列がTRUEのときCALLのデータ、FLASEのとき、PUTのデータとする。
- 行使価格も14000円以上、22000円未満に絞る
df_p = df_raw[["STRIKE","PUT_PRICE","PUT_TPRICE", "PUT_VOLATILITY","F225_PRICE", "Base_VOL"]]\
.rename(columns={'PUT_PRICE': 'OP_PRICE', 'PUT_TPRICE':'OP_TPRICE', 'PUT_VOLATILITY':'OP_VOL'})
df_p['CALL'] = False
df_c = df_raw[["STRIKE","CALL_PRICE","CALL_TPRICE", "CALL_VOLATILITY","F225_PRICE", "Base_VOL"]]\
.rename(columns={'CALL_PRICE': 'OP_PRICE', 'CALL_TPRICE':'OP_TPRICE', 'CALL_VOLATILITY':'OP_VOL'})
df_c['CALL'] = True
df = df_p.append(df_c).query("OP_PRICE > 1.0 & STRIKE < 25000 & STRIKE >= 22000")
del (df_p,df_c)
df.head()
CALLとPUTで共通の列名に変更。
STRIKE | OP_PRICE | OP_TPRICE | OP_VOL | F225_PRICE | Base_VOL | CALL | |
---|---|---|---|---|---|---|---|
17 | 15250.0 | 2.0 | 1.53 | 0.318070 | 19378.93 | 0.1717 | False |
18 | 15500.0 | 2.0 | 2.00 | 0.306616 | 19378.93 | 0.1717 | False |
19 | 15750.0 | 3.0 | 2.56 | 0.294521 | 19378.93 | 0.1717 | False |
20 | 16000.0 | 3.0 | 3.00 | 0.279297 | 19378.93 | 0.1717 | False |
21 | 16250.0 | 5.0 | 5.00 | 0.275828 | 19378.93 | 0.1717 | False |
データの可視化
オプション価格情報をPUT, CALL別にプロット
cmap = plt.get_cmap('rainbow')
fig, ax = plt.subplots()
for i, (key, group) in enumerate(df.groupby(['CALL']), start=1):
ax = group.plot(ax=ax, kind='Scatter', x='STRIKE', y='OP_PRICE',color=cmap(i / 2.0),label = "CALL" if key else "PUT")
plt.title(u"MAT %s / %s close"%(MatMon, DL_Date))
fig.patch.set_facecolor('white')
plt.show()
理論価格とか基準ボラティリティって何だろうね。
No comments:
Post a Comment