nprogram’s blog

気ままに、プログラミングのトピックについて書いていきます

pandasを使って株価情報を取得しましょう

はじめに

pandasを使うと、webページの表(tableタグ)のスクレイピングが簡単にできます。

環境

  • Windows version : 1903 (Windows 10 Home)
  • conda version : 4.7.12
  • conda-build version : 3.18.8
  • python version : 3.7.3.final.0
  • selenium : 3.141.0

手順

(1) 必要なモジュールをインストールします

conda install pandas

conda install beautifulsoup4

conda install html5lib

(2) コードをjupyter notebookに入力します

import pandas as pd
tables = pd.read_html('https://info.finance.yahoo.co.jp/ranking/?kd=4', flavor='bs4', header=0)

first_five_data = tables[0].head()
last_five_data = tables[0].drop(len(tables[0])-1).tail()

display(first_five_data.append(last_five_data))

f:id:nprogram:20191022231420p:plain

コード説明

pandasのread_htmlメソッドを用いて、webページの表(tableタグ)のスクレイピングを行います。

上記のメソッドを呼び出すとページ内の表をすべて取得しDataFrameのリストとして返します。今回の場合は表が1つしかないため、tables[0]で表データを参照できます

read_html型の戻り値は、リスト(<class 'list'>)を作成します。引数はの意味は以下のとおりです。

# flavor
## 解析に使用するパッケージ種別
# 引数 : header
# 表タイトルに指定する行番号
tables = pd.read_html('https://info.finance.yahoo.co.jp/ranking/?kd=4', flavor='bs4', header=0)

以下のコードで表の最初の5行分のデータを表示します。

display(tables[0].head())

f:id:nprogram:20191022223757p:plain

以下のコードで表の最後の5行分のデータを表示します。しかし、最終行にゴミデータが入っています。

display(tables[0].tail())

f:id:nprogram:20191022223923p:plain

上記のように最終行にゴミがある場合は、dropメソッドを呼び出し、最後の行を指定して削除した後に、最後の5行を取り出せば問題ありません。

tables[0].drop(50).tail()

f:id:nprogram:20191022230954p:plain

上記のコードは以下でも代用できます

display(tables[0].drop(len(tables[0])-1).tail())

csvファイルに保存・csvファイルから読み込み

次に取得した情報をcsvファイルに保存しましょう。csvファイルに保存することで、取得したデータを永続化できます。

前回で、dropメソッドで不要な行を削除しましたが、今回は別な方法で削除します。

tables[0][:-1].to_csv("./stock_data_list.csv")

df_csv = pd.read_csv('./stock_data_list.csv', index_col=0)
display(df_csv.head().append(df_csv.tail()))

以下のコードで、一番目のテーブルの最後の行を除去して、csvファイルとして保存します。

[:-1]で最初の行から最後から一行を意味します。ここで、0行目はタイトル行です。

次のread_csv関数で、0行目をインデックス行(タイトル行)(index_col=0)と判断して、csvファイルをリードして、DataFrameに変換します。

Yahooサイトから、株価情報を取得します

Yahooサイトはスクレイピングでの高速アクセスを禁止しています。

そのため、高速アクセスを禁止するため、一度の処理の間にはウェイト(スリープ)を必ず入れたいと思います

参考リンク

あとがき

株価の予想をAIを用いて実行できるようにしたいです。まずは、スクレイピング(ネットから情報を取得)をマスターしたいと思います。

ただ、スクレイピングは国内サイトの場合、規制が厳しいです。海外のサイトから株価情報を取得することも考慮したいと思います。

機械学習で未来を予測する - scikit-learn の決定木で未来の株価を予測 - Qiita

pythonで東証から株価をAPI取得して、データをChartに表示させる - Qiita