Python

【KDDIの株価をAIで予想】スクレイピング編

Python

菅政権が発足に伴いKDDI(9433)含む、通信業界の株価が暴落しました。KDDIの株価が今度どうなるのか?とお悩みの方は多いはずです。

そこで、KDDIの今後の株価予想をAIで行ってみます。AIを作るためには、データが必要です。

そこでまずは、KDDIの株価をインターネットサイトから取得しデータ化するWebスクレイピングについて解説します。

株価データ提供サイト

まずは、株価データを提供しているサイトを紹介します。スクレイピングを行っていいサイト、ダメなサイトが存在します。kabuoji3はスクレイピングをしていいサイトになります。

株価データ・株主優待情報・先物データ・ランキングデータ・CSVダウンロード無料 | 株式投資メモ・株価データベース
上場全銘柄の個別株価の時系列データ、先物データ、各種ランキングから気配値、逆日歩、株主優待情報まで。株式投資、システムトレードや株価分析に有益な情報を多数配信!CSVダウンロード無料。

スクレイピングが許可されているかを確認するには、robots.txtを確認する必要があります。

robots.txtを確認したところ、rootからスクレイピングを許可してくれているので、ありがたくスクレイピングさせていただきます。(2020年11月1日時点)

https://kabuoji3.com/robots.txt
User-Agent: * 
Allow:/
Sitemap:http://kabuoji3.com/sitemap/sitemap-index.xml

スクレイピング

スクレイピングとは?

スクレイピングとは“データを収集した上で利用しやすく加工すること”です。特にWebからデータを取得することをWebスクレイピングと言います。

スクレイピングを行う方法

スクレイピングは、pythonのライブラリの“Beautiful Soup”を使用します。

Beautiful Soupのインストール

Windowsにインストールするときは、”コマンドプロンプト“を使います。

pip install beautifulsoup4

macOSにインストールするときは、”ターミナル“を使います。

pip3 install beautifulsoup4

Beautiful Soupを使う

Beautiful Soupを使うときは、まずライブラリをimportします。

“importとは、Python上で「ライブラリを使用出来る状態」”にするということです。そのためimportせずに使用しても、importされていませんとの旨のエラーが返ってくるので注意しましょう。

Beautiful Soupは、bs4というパッケージに入っているので「from bs4 import BeautifulSoup」と指定して使います。

from bs4 import BeautifulSoup

続いて、データ処理に用いるpandasをimportします。

Pandasは、Pythonでデータ分析を効率的に行うためのライブラリです。Pandasはオープンソース(BSDライセンス)で公開されており、個人/商用問わず、誰でも無料で利用することができます。

また、rURLを開くために、equestsをimportします。

import pandas as pd
import requests
from datetime import datetim

ページのhtmlを取得

取得したい銘柄の株価データは

‘https://kabuoji3.com/stock/銘柄コード/年数/’で取得できます。

y = 2020 #2020年
stock_number = 9433 #KDDI銘柄コード
url = 'https://kabuoji3.com/stock/{}/{}/'.format(stock_number,y)
headers = {
      "User-Agent": "Chrome"
}
soup = BeautifulSoup(requests.get(url, headers = headers).content, 'html.parser')

出力結果の一部(table)のみ抜粋。

<table class="stock_table stock_data_table">
<thead>
<tr>
<th>日付</th>
<th>始値</th>
<th>高値</th>
<th>安値</th>
<th>終値</th>
<th>出来高</th>
<th>終値調整</th>
</tr>
</thead>
<tbody>
<tr>
<td>2020-01-06</td>
<td>3237</td>
<td>3243</td>
<td>3211</td>
<td>3243</td>
<td>4504000</td>
<td>3243</td
・・・・

株価データをデータフレーム化

ページのHTMLの構成を確認すると、tableで、trタグの中のthタグにテーブルのヘッドがあり、trタグの中のtdタグにデータが入っている構成でした。

headを抽出します。”headは、日付、始値、高値、安値、終値、出来高、終値調整の7つの要素で構成“されていることが分かります。それらが、<th>タグで分類分けられています。

<thead>
<tr>
<th>日付</th>
<th>始値</th>
<th>高値</th>
<th>安値</th>
<th>終値</th>
<th>出来高</th>
<th>終値調整</th>
</tr>

そこで、<th>タグで分離します。

headの情報は、tag_trの0番目の要素に含まれます。それをfind_all(‘th’)と入力することで、<th>タグ後tに分離します。

残りのtag_trの1番以降は、データで、<td>タグで分類します。

<tr>
<td>2020-01-06</td>
<td>3237</td>
<td>3243</td>
<td>3211</td>
<td>3243</td>
<td>4504000</td>
<td>3243</td

コードは以下のようになります。

tag_tr = soup.find_all('tr')
head = [h.text for h in tag_tr[0].find_all('th')] #テーブルのヘッドの取得

#テーブルの各データの取得
data = []
for i in range(1,len(tag_tr)):
    data.append([d.text for d in tag_tr[i].find_all('td')])
    df = pd.DataFrame(data, columns = head)

テキストデータを数値、日付はタイムスタンプに変換

現状は、全てテキストデータなので、このままだと機会学習で読み取れません。

そこで、テキストデータを数字(float)に変換します。

col = ['始値','高値','安値','終値','出来高','終値調整']
for c in col:
    df[c] = df[c].astype(float)
df['日付'] = [datetime.strptime(i,'%Y-%m-%d') for i in df['日付']]

CSVで出力

csvで出力するには、to_csv(“ファイル名.CSV”)を使用します。

df.to_csv('kddi.csv')

出力結果


日付始値高値安値終値出来高終値調整
02020-01-063,2373,2433,2113,2434,504,0003,243
12020-01-073,2503,2733,2383,2714,604,2003,271
22020-01-083,2703,2773,2133,2416,703,2003,241
32020-01-093,2413,3003,2343,2954,647,0003,295
42020-01-103,2953,2983,2783,2884,270,0003,288
52020-01-143,2803,2993,2773,2834,701,6003,283
62020-01-153,2893,2903,2663,2704,198,7003,270
72020-01-163,2513,2653,2433,2544,288,2003,254
82020-01-173,2633,2773,2593,2654,223,5003,265

コメント

  1. […] 【KDDIの株価をAIで予想】スクレイピング編暴落したKDDIの今後の株価を予想… […]

  2. […] 【KDDIの株価をAIで予想】スクレイピング編暴落したKDDIの今後の株価を予想… […]

  3. […] 【KDDIの株価をAIで予想】スクレイピング編暴落したKDDIの今後の株価を予想するAIを設計します。まずは、データを取得するための、Webスクレイピングについて解説します。tsukimitech.com2020 […]

タイトルとURLをコピーしました