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

  • 9
    いいね
  • 3
    コメント

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

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

と思い立って調べてみると,海外の株式は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