Python 株・投資

TOPIXのCSVファイルをダウンロードしてPythonで読み込みする

投稿日:

スポンサードリンク

はじめに

TOPIXの時系列データを使ってPythonで読み込み&簡単な解析を試みました。今回株価+Pythonでは非常に役に立つPandasを使用してみました。

HYPER SBIのダウンロード

SBI証券の出しているHYPER SBIを使ってTOPIXの20年分日足のCSVファイルをダウンロードしてきます。このHYPER SBIはSBI証券が提供している取引ツールでSBIに登録していないと残念ながら使えません。また、登録していたとしても特定の条件を満たさなければ無料で使うことはできません。使用する場合「HYPER SBIの一部ご利用無料条件/無料期間を変更いたしました」などご一読ください。

説明は公式の「時系列データを確認/ダウンロードする」に記載されていますが、こちらでもたどった手順を紹介します。

TOPIXのダウンロード

HYPER SBIを起動したら「チャート」のところをクリックします。

検索ダイアログが出てくるので何も考えず検索を押します。

一覧が出てくるのでなんでもいいので選んでOKを押すとチャート画面が出てきます。

チャート画面で「指標」、「国内」を選択してTOPIXを選んだら「時系列」を押します。

ちなみに国内ではTOPIXだけでなく日経平均やマザーズ、JASDAQなどがあります。

また、海外ではNYダウやS&P500、NASDAQ、上海総合指数などがあります。

時系列データが出たら日付を変更して検索を押します。昔にしすぎても最大20年分までしか検索できないようです。そして、検索結果の時系列データが出たらCSV出力して任意の名前で保存します。

PythonでのCSV読み込み

Pythonの動作環境はAnacondaに付属してくるJupyter Notebookを使いました。以下に記述するスクリプトは全てJupyter Notebookに記載してPython3.6で動作させたものです。Jupyter Notebookでなくとも最近ではGoogle Colabのようなクラウドサービスもあるのでそちらを使うのでも良いと思います。

ファイル形式の変換

Pandasの機能を使って先ほどダウンロードしてきたTOPIXのCSVファイルを読み込みます。ダウンロードしてきた元々のファイルはSJISだったのでサクラエディタなどのテキストエディタを使ってUTF-8に文字コードを直しておきます。

CSVファイルの読み込み&グラフ化

CSVファイルをPandasのDataFrameで読み込んでグラフ化します。csvモジュールで読むこともできますが、株価のような列数の多い表はDataFrame自体が表形式のようになっているのでPandasを使ったほうが断然使いやすいです。

まずは必要なモジュールをインポートしてきてPandasのread_csvで先ほどのCSVチャートをDataFrameとして読み込みます。

import numpy as np
import pandas as pd
from pandas import DataFrame
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

# CSVファイルをDataFrame形式で読み込む
topix_dframe = pd.read_csv('./topix_TimeChart.csv')

読み込みが終わったらチャート描画のための前処理を行います。列名が日本語なので英語に日付のフォーマットが「yyyymmdd」になっているのを「yyyy-mm-dd」に、そして、ダウンロードしてきたファイルは最新順にデータが入っていますが、描画や後段の移動平均線算出の関係上、データ順序が古い順になるように逆にします。

# 列名を英語に変更する
topix_dframe = topix_dframe.rename(columns={'日付':'Date', '高値': 'High', '安値': 'Low', '始値': 'Open', '終値': 'Close', '出来高': 'Volume'})

def date_apply(x):
    x = str(x)
    return x[0:4]+"-"+x[4:6]+"-"+x[6:8]

# 日付のフォーマットを変更する(yyyy-mm-dd)
topix_dframe["Date"] = topix_dframe["Date"].apply(date_apply)

# 順序を古い順になるよう逆にする
topix_dframe = topix_dframe[::-1]

そして、移動平均線や前日比を出します。

# 移動平均線(25日、75日)を出す
ma_day = [25,75]
for ma in ma_day:
    column_name = 'MA {}'.format(ma)
    topix_dframe[column_name] = topix_dframe['Close'].rolling(ma).mean()

# 前日比(%)を出す
topix_dframe['Change'] = topix_dframe['Close'].pct_change()*100

チャートを描画します。描画の際は日足(終値)だけでなく先ほど作成した移動平均線も描画します。

# TOPIXの20年チャートを描画する
ax = topix_dframe.plot(x='Date',y='Close',legend=True,figsize=(10,4))
topix_dframe.plot(x='Date',y='MA 25',legend=True,figsize=(10,4), ax=ax)
topix_dframe.plot(x='Date',y='MA 75',legend=True,figsize=(10,4), ax=ax)
plt.xlabel('date')
plt.ylabel('yen')
plt.legend(title='TOPIX Chart')

無事にできました。やはりTOPIXは長い目で見るとおおよそ800円~1,800円あたりのレンジ相場になっており、現在はピークから下がり始めたように見えます。しかしこれから先はレンジ通りに下がっていくのか、バブルでブレークして上昇していくのか私にはわかりません。

全体の傾向はわかりましたが、グラフがギチギチに詰まっていて見づらいため最新のデータのみ抽出してみることにします。

# TOPIXの1000日チャートを描画する
recent_topix_dframe = topix_dframe[-1000:-1]
ax = recent_topix_dframe.plot(x='Date',y='Close',legend=True,figsize=(10,4))
recent_topix_dframe.plot(x='Date',y='MA 25',legend=True,figsize=(10,4), ax=ax)
recent_topix_dframe.plot(x='Date',y='MA 75',legend=True,figsize=(10,4), ax=ax)
plt.xlabel('date')
plt.ylabel('yen')
plt.legend(title='TOPIX Chart')

できました。わりと見やすくできたのではないかと思います。
また、先ほど前日比を出したのでそれをヒストグラム化して値動きの動向を確認します。

# 前日比のヒストグラムを描画する
sns.distplot(topix_dframe['Change'], bins=100)
plt.xlabel('change(%)')
plt.ylabel('count')
plt.legend(title='topix change histgram')
topix_dframe['Change'].mean()
topix_dframe['Change'].std()

当然と言えば当然ですが、ほぼ平均0(正確には0.006)の綺麗な正規分布になりました。標準偏差を計算したところおよそ1.36%でしたので68%のデータは±1.36%の値動きに収まるということになります。

まとめ

HYPER SBIを使ってダウンロードしてきたTOPIXのCSVファイルをPythonで読み込んでグラフ化しました。Panadsを覚えておくとグラフ化やその後の色々な解析が簡単にできるようになるためとても便利です。

スポンサードリンク
Amazonリンク
参考:mementoo.info

-Python, 株・投資

Copyright© めめんと , 2020 All Rights Reserved Powered by AFFINGER5.