Edited at

日本株式のデータをスクレイピングなしで取得・リストにしたい


大きなデータを取り扱ってみたい!

株価を分析するのって面白そう!

と思い立って調べてみると,海外の株式はPandasのDataReaderで案外簡単にデータとして手に入りますが,

(例えばGoogle financeFREDなど)

日本の株価は,案外データとして見つかりません.

Yahoo!ファイナンスから引っ張ってくればいいじゃん!という記事は多いですが,

Yahoo!ファイナンスはスクレイピングを禁止しているため,こちらから引っ張ってくるわけにもいきません.

モジュールのjsmを使えば…という意見もあるかもしれませんが,こちらもスクレイピングを使用しています.

本記事は,スクレイピングなしでデータを取得し,ひとつのリストとすることを目的とします.

strock.png


せっかちな人のためのコード

いいから結論だけ教えてくれ!って人のために(がんばってかいた)コードをおいておきます.

細かい点は各自修正をお願いします.


コード1

import os

import pandas as pd
import matplotlib.pyplot as plt

os.chdir("C:\\Users\\Kuma_T\\stock") #ファイルの場所を指定,先にデータを入れておく

plt.rcParams['figure.figsize'] = [10, 5]
plt.rcParams['xtick.direction'] = 'in'#x軸の目盛線が内向き('in')か外向き('out')か双方向か('inout')
plt.rcParams['ytick.direction'] = 'in'#y軸の目盛線が内向き('in')か外向き('out')か双方向か('inout')
plt.rcParams['xtick.major.width'] = 1.0 #x軸主目盛り線の線幅
plt.rcParams['ytick.major.width'] = 1.0 #y軸主目盛り線の線幅
plt.rcParams['font.size'] = 12 #フォントの大きさ
plt.rcParams['axes.linewidth'] = 1.0 # 軸の線幅edge linewidth。囲みの太さ
plt.rcParams['font.family'] = 'Times New Roman' #使用するフォント名



コード2

code = 3672 #オルトプラス

start = 2015
end = 2017

x = []
y = []

for n in range (start, end+1):
file_name = 'stocks_'+str(code)+'-T_1d_%d.csv' %n #ファイル名を指定
data = pd.read_csv(file_name, header=0, encoding='cp932') #日本語が読めないのでencodingを指定
a =list(pd.to_datetime(data.iloc[:,0], format='%Y-%m-%d')) #そのまま読み込むと日付を認識できないのでdatetimeで
x += a[::-1] #リスト内を逆順にするため[::-1]を適用し,xのリストに足していく
b = list(data.iloc[:,4])
y += b[::-1]

z = pd.DataFrame(y)#DataFrameに変換
sma75 = pd.DataFrame.rolling(z, window=75,center=False).mean()
sma25 = pd.DataFrame.rolling(z, window=25,center=False).mean()

plt.plot(x, y, color="blue", linewidth=1, linestyle="-")
plt.plot(x, sma25, color="g", linewidth=1, linestyle="-", label="SMA25")
plt.plot(x, sma75, color="r", linewidth=1, linestyle="-", label="SMA75")

plt.title("Alt Plus ("+str(code)+")", fontsize=16, fontname='Times New Roman')
plt.xlabel("Year-Month", fontsize=14, fontname='Times New Roman') # x軸のタイトル
plt.ylabel("Stock price", fontsize=14, fontname='Times New Roman') # y軸のタイトル

plt.legend(loc="best")

plt.show()



データの準備

個別銘柄株価データ

http://k-db.com/stocks/

こちらにアクセスすると,日本の株式のデータがCSVファイルで手に入ります.

試しにオルトプラス(3672)を見てみると,

Kabuka.png

CSVファイルがこちらにあるので特定のフォルダにダウンロードしておきます.

ちなみにこちらのデータは,上側が日付が新しくなっています.

今回は2015-2017のデータをダウンロードしました.


データの読み込み

まずはダウンロードしたフォルダを指定します.


コード1

import os

import pandas as pd
import matplotlib.pyplot as plt

os.chdir("C:\\Users\\Kuma_T\\stock") #ファイルの場所を指定,先にデータを入れておく


次に保存したCSVファイルを読み込んでいきます.

files.png

stocks_3672-T_1d_2015

stocks_3672-T_1d_2016

stocks_3672-T_1d_2017

というファイルを用意していますので,

銘柄コードを3672

読み込み開始を2015年

読み込み終了を2017年とします.

次に空のリストを作っておきます.


コード2

code = 3672 #オルトプラス

start = 2015
end = 2017

x = []
y = []


ループ関数の中を書いていきます.

読み込むファイル名を指定し,Pandasのread_csvで読み込みます(和文でエラーがでるため,encodingを指定しています).

dataの1列目の日付データをiloc[:, 0]で,pd.to_datetimeで日付として読み込み,リストにします.

前述の通り,CSVファイルは上側が日付が新しいので,逆順にして古い日付を上にして空のリストに足していきます.

同様に4列目の終値も空のリストに足していきます.


コード2

for n in range (start, end+1):

file_name = 'stocks_'+str(code)+'-T_1d_%d.csv' %n #ファイル名を指定
data = pd.read_csv(file_name, header=0, encoding='cp932') #日本語が読めないのでencodingを指定
a =list(pd.to_datetime(data.iloc[:,0], format='%Y-%m-%d')) #そのまま読み込むと日付を認識できないのでdatetimeで
x += a[::-1] #リスト内を逆順にするため[::-1]を適用し,xのリストに足していく
b = list(data.iloc[:,4])
y += b[::-1]

これで目的の株価のデータをリスト型で得ることができました.


グラフ化して確認

ここまできたらグラフ化して確認しましょう.


コード2

plt.plot(x, y, color="blue", linewidth=1, linestyle="-")

plt.show()

Stock_3672.png

無事にグラフができています.

注意点としては,逆順で読み込んでいないと以下のようになってしまいます.

Stock_3672_2.png


移動平均を追加する

おまけで移動平均を追加してみましょう.

移動平均はPandasのDataFrame.rollingを使用することで簡単に求めることができます.

DataFrame.rollingはその名の通り,DataFrame形式で使用するため,Listを変換しておきます.


コード2

z = pd.DataFrame(y)#DataFrameに変換

sma75 = pd.DataFrame.rolling(z, window=75,center=False).mean()
sma25 = pd.DataFrame.rolling(z, window=25,center=False).mean()

plt.plot(x, y, color="blue", linewidth=1, linestyle="-")
plt.plot(x, sma25, color="g", linewidth=1, linestyle="-", label="SMA25")
plt.plot(x, sma75, color="r", linewidth=1, linestyle="-", label="SMA75")


今回は25日移動平均と75日移動平均を追加しています.

strock.png


最後に

スクレイピングなしで,日本株式のリストを取得できました.

今回はオルトプラス(3672)を使ってみましたが,個別の銘柄で試してみてください.

今度はこちらのデータを使って解析してみたいと思います.

最後におことわりですが,筆者は株もプログラミングもまだまだビギナーです.

何かあればコメントをお願いします.


以下参考にした記事などの紹介

Pythonで機械学習を使った株価予測のコードを書こう

http://www.stockdog.work/entry/2017/02/09/211119

【Python/jsm】日本企業の株価データを銘柄ごとに取得

https://algorithm.joho.info/programming/python/jsm-get-japan-stock/

Python の jsm モジュール で 株価(原系列)時系列データ 取得 して、出力した折れ線グラフを Gmailに添付してメール配信

http://qiita.com/HirofumiYashima/items/471a2126595d705e58b8

Python pandas で日本の株価情報取得とローソク足チャート描画

http://sinhrks.hatenablog.com/entry/2015/02/04/002258

過去のデータからビッグデータ分析で株価を予測する

http://qiita.com/ynakayama/items/420ebe206e34f9941e51

第1回 pandasで株価をスクレイピング 〜S◯I証券風のチャートを描いてみる〜

http://www.stockdog.work/entry/2016/08/26/170152


個別株ではないですが、株式投資の新記事を書きました。

「このゲーム(積立投資)には必勝法がある -持株会ゲーム-」

https://qiita.com/Kuma_T/items/667e1b0178a889cc42f7