Pandasを使って営業日ベースで騰落率を調べる
例えば、トヨタ、ソフトバンク、任天堂、村田製作所、日本たばこ産業で構成されるポートフォリオがあるとします。ここからそれぞれの企業の四半期決算発表日前後の株価の騰落率を調べてみようと思います。
Pandasでこのようなデータフレームを作ります。
txt = """7974,任天堂,20190731 7203,トヨタ自動車,20190802 9984,ソフトバンクグループ,20190807 6981,村田製作所,20190731 2914,日本たばこ産業,20190731""" companies = [] for row in txt.split('\n'): d = {} r = row.split(',') code, name = r[0], r[1] d['code']=r[0] d['name']=r[1] d['t']=r[2] companies.append(d) df = pd.DataFrame(companies).set_index('code')
このようなデータフレームになります。日付はSBI証券から7~8月にかけての決算発表スケジュール(国内株式)を参照しました。
さらに決算発表日の2営業日前後の日付を取得します。
例えばGW期間直前や月曜日に決算発表をする場合、営業日ベースで考えると土日祝日を考慮する必要があります。
特に今年は譲位に伴う特別な祝日がGW期間中にありましたし、昨年まで休日だった上皇陛下の誕生日(12月23日)は休日ではなくなります。
私の知る限り、Pythonのdatetime周りのライブラリーで最新の日本の祝日を考慮してくれるものはないと思います。(あったら教えてください!)
date.weekday()で土日判定は可能なので、休日判定のためには総務省の祝日csvファイルを使うのがいいと思います。 このcsvは2020年までの休日が含まれているので、来年のどこかの時点で2021年分を取得して休日リストをアップデートしてあげる必要があります。
いろいろ試してみて結局、営業日APIを自作してHeroku Appにしてみました。
2019年9月26日の15営業日後を知りたい場合、クエリパラメータでfromとnを指定してあげます。
https://aio-business-days.herokuapp.com/biz?from=20190926&n=15
レスポンスはこのようにしてます。2019年9月26日の10営業日後の日付は10月18日。
{"date": "20191018", "from": "20190926", "n": "15"}
話をデータフレームに戻すと決算発表日のtがわかっているので前後2営業日の日付を取得します。 上記APIを叩くための関数を作り、それを呼び出した戻り値をデータフレームのセルの値にしてあげます。
df['t-2']='' df['t+2']='' BASE_URL = 'https://aio-business-days.herokuapp.com/biz?from={0}&n={1}' def get_date(t,n): res = requests.get(BASE_URL.format(t,n)) return res.json() for idx, row in df.iterrows(): value = get_date(row['t'],-2) df.at[idx,'t-2']=value['date'] for idx, row in df.iterrows(): value = get_date(row['t'],2) df.at[idx,'t+2']=value['date']
同じ要領で二期間の騰落率(終値ベースで)を計算するAPIを使い(以前自作していました)、セルの値として入れてみるとこのようなデータフレームになりました。
決算発表後の騰落率がプラスであれば、ポジティブサプライズ、そうでなければネガティブサプライズと定義してパターン分けできそうです。
- | +ve | -ve |
---|---|---|
2営業日前 | 村田 | 任天堂、トヨタ、SBG、JT |
2営業日後 | 任天堂 | 村田、トヨタ、SBG、JT |