Life is Like a Boat

忘備録や投資日記、プログラミングに関するメモやtipsなど

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月にかけての決算発表スケジュール(国内株式)を参照しました。

f:id:nerimplo:20190926121509p:plain

さらに決算発表日の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']

f:id:nerimplo:20190926131305p:plain

同じ要領で二期間の騰落率(終値ベースで)を計算するAPIを使い(以前自作していました)、セルの値として入れてみるとこのようなデータフレームになりました。

f:id:nerimplo:20191028100834p:plain

決算発表後の騰落率がプラスであれば、ポジティブサプライズ、そうでなければネガティブサプライズと定義してパターン分けできそうです。

- +ve -ve
2営業日前 村田 任天堂、トヨタ、SBG、JT
2営業日後 任天堂 村田、トヨタ、SBG、JT