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

#大きなデータを取り扱ってみたい！
株価を分析するのって面白そう！

と思い立って調べてみると，海外の株式はPandasのDataReaderで案外簡単にデータとして手に入りますが，
（例えば[Google finance](https://www.google.com/finance)や[FRED](https://fred.stlouisfed.org/)など）
日本の株価は，案外データとして見つかりません．

Yahoo!ファイナンスから引っ張ってくればいいじゃん！という記事は多いですが，
Yahoo!ファイナンスは[スクレイピングを禁止](https://www.yahoo-help.jp/app/answers/detail/p/546/a_id/93575/~/yahoo%21%E3%83%95%E3%82%A1%E3%82%A4%E3%83%8A%E3%83%B3%E3%82%B9%E6%8E%B2%E8%BC%89%E6%83%85%E5%A0%B1%E3%81%AE%E8%87%AA%E5%8B%95%E5%8F%96%E5%BE%97%EF%BC%88%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0%EF%BC%89%E3%81%AF%E7%A6%81%E6%AD%A2%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99)しているため，こちらから引っ張ってくるわけにもいきません．

モジュールの[jsm](https://pypi.python.org/pypi/jsm/0.19)を使えば…という意見もあるかもしれませんが，こちらもスクレイピングを使用しています．

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

![strock.png](https://qiita-image-store.s3.amazonaws.com/0/192073/9033627a-df3b-ff03-0bd2-c78717804862.png)


#せっかちな人のためのコード
いいから結論だけ教えてくれ！って人のために（がんばってかいた）コードをおいておきます．
細かい点は各自修正をお願いします．


```python:コード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' #使用するフォント名
```

```python:コード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/](http://k-db.com/stocks/)

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

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

![Kabuka.png](https://qiita-image-store.s3.amazonaws.com/0/192073/a940d8d8-d6ca-4a67-5931-f311834b30bd.png)

CSVファイルがこちらにあるので特定のフォルダにダウンロードしておきます．
ちなみにこちらのデータは，上側が日付が新しくなっています．
今回は2015-2017のデータをダウンロードしました．

#データの読み込み
まずはダウンロードしたフォルダを指定します．

```python:コード1
import os
import pandas as pd
import matplotlib.pyplot as plt

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

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

![files.png](https://qiita-image-store.s3.amazonaws.com/0/192073/b8a7f9ec-95ce-2ff9-ecd5-6b3148d64c72.png)

stocks_3672-T_1d_2015
stocks_3672-T_1d_2016
stocks_3672-T_1d_2017
というファイルを用意していますので，
銘柄コードを3672
読み込み開始を2015年
読み込み終了を2017年とします．

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

```ruby:コード2
code = 3672 #オルトプラス
start = 2015
end = 2017

x = []
y = []
```

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

読み込むファイル名を指定し，Pandasのread_csvで読み込みます（和文でエラーがでるため，encodingを指定しています）．
dataの1列目の日付データをiloc[:, 0]で，pd.to_datetimeで日付として読み込み，リストにします．
前述の通り，CSVファイルは上側が日付が新しいので，逆順にして古い日付を上にして空のリストに足していきます．

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


```python:コード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]
```

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

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

```python:コード2
plt.plot(x, y, color="blue", linewidth=1, linestyle="-")
plt.show()
```

![Stock_3672.png](https://qiita-image-store.s3.amazonaws.com/0/192073/a11ce995-630c-4d4b-603c-707637846761.png)

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

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

![Stock_3672_2.png](https://qiita-image-store.s3.amazonaws.com/0/192073/0049b5c1-0ddc-736d-9e1f-c68eea0d0579.png)

#移動平均を追加する
おまけで移動平均を追加してみましょう．

移動平均はPandasのDataFrame.rollingを使用することで簡単に求めることができます．
DataFrame.rollingはその名の通り，DataFrame形式で使用するため，Listを変換しておきます．

```python:コード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](https://qiita-image-store.s3.amazonaws.com/0/192073/9033627a-df3b-ff03-0bd2-c78717804862.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