Volo di notte

お勉強の成果メモや日常のこと

日本取引所グループのオプション理論価格等情報のPandas読み込み~整形まで

金融工学のお勉強に公開データを使ってブラックショールズ方程式のお勉強。お勉強開始にあたってデータ準備まで。使っている技術の詳細は以下の本で。

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

まずは、いつものライブラリ読み込み。

%matplotlib inline
# %matplotlib notebook
import sqlite3
import pandas as pd
from matplotlib import pylab as plt
import numpy as np

from datetime import datetime
import dateutil

あとでcsv読み込み時に使う便利関数。

def strip(text):
    try:
        return text.strip()
    except AttributeError:
        return text

データ準備

オプション理論価格等情報 | 日本取引所グループから入手した2017年2月10日の終値データ。 色々入っているけど2017年3月限の原資産:日経225のオプション取引データだけ使う。

Pandasへデータ読み込み

  1. データ本体と別に配布されているヘッダー情報をもとに自分でヘッダーを起こして名前をつける
  2. 読み込み中にテキストデータの空白をトリムする
# ヘッダー名 (変数名順)
#     商品コード, 商品タイプ, 限月, 権利行使価格, 予備
#     プットオプション: 銘柄コード, 終値, 予備, 理論価格, ボラティリティ
#     コールオプション: 銘柄コード, 終値, 予備, 理論価格, ボラティリティ
#     原資産終値, 基準ボラティリティ
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 = pd.read_csv('./ose20170210tp.csv',names=colName,
                 converters = {'CODE' : strip,
                               'TYPE' : strip})
df.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 = df.query("MATURITY == 201703 & CODE==\"NK225E\"")\
    .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[["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[["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 < 22000 & STRIKE >= 14000")
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 2017/03 / 2017/2/10 close")
fig.patch.set_facecolor('white') 
plt.show()

f:id:Chachay:20170212223312p:plain

理論価格とか基準ボラティリティって何だろうね。

参考:

chachay.hatenablog.com