Life is Like a Boat

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

日経平均の月足データをPandasのDataframeにする

Monthlyのパフォーマンスを日経と比較して見たい時や指標と日経の相関見てみたいなという時に月次の225のデータがあると何かと便利です。

どこかのサイトでデータ用意してくれないかなと調べていたところ、ありがたいことに、本家のサイトからcsv形式でダウンロードできるじゃないですか。

HighとLowも用意してあるのでありがたいです。

https://indexes.nikkei.co.jp/nkave/historical/nikkei_stock_average_monthly_jp.csv

以下、ダウンロードからDataframe化するまでのソースです。

import pandas as pd
import io
import requests
from datetime import datetime
import re

NIKKEI_MONTHLY_DATA_URL = 'https://indexes.nikkei.co.jp/nkave/historical/nikkei_stock_average_monthly_jp.csv'


data = requests.get(NIKKEI_MONTHLY_DATA_URL).content.decode('shift-jis')
nikkei_monthly_df = pd.read_csv(io.StringIO(data))
nikkei_monthly_df

#rename columns
nikkei_monthly_df = nikkei_monthly_df.rename(columns={
    'データ日付': 'date',
    '終値': 'Close', '始値': 'Open', '高値': 'High', '安値': 'Low'})

#データ日付欄(rename後はdate)をdatetimeにする
pattern = re.compile(r'([12]\d{3}/(0[1-9]|1[0-2])/(0[1-9]|[12]\d|3[01]))')
nikkei_monthly_df.date = list(map(lambda x : datetime.strptime(x, '%Y/%m/%d') if pattern.match(x) else x, nikkei_monthly_df.date))
nikkei_monthly_df = nikkei_monthly_df.dropna(thresh=3)

nikkei_monthly_df = nikkei_monthly_df.set_index('date')
nikkei_monthly_df

f:id:nerimplo:20180707221901p:plain

Plotlyでチャートを描画するとこんな感じになります。PlotlyのCandleStickチャートはOpen, High, Low, Closeを指定するだけでいいので直感的です。

f:id:nerimplo:20180707232651p:plain

from plotly.offline import init_notebook_mode, iplot
import plotly.graph_objs as go

init_notebook_mode(connected=True)

trace = go.Candlestick(x=nikkei_monthly_df.index,
                       open=nikkei_monthly_df.Open,
                       high=nikkei_monthly_df.High,
                       low=nikkei_monthly_df.Low,
                       close=nikkei_monthly_df.Close)

layout = go.Layout(
    xaxis = dict(
        rangeslider = dict(
            visible = False
        )
    ),
    yaxis = dict(exponentformat="none")
)

data = [trace]
fig = go.Figure(data=data,layout=layout)
iplot(fig, filename='simple_candlestick')

デフォルトだとy軸が20kと表示されてしまうのでyaxis = dict(exponentformat="none")をセットしてあげます。