菅政権が発足に伴いKDDI(9433)含む、通信業界の株価が暴落しました。KDDIの株価が今度どうなるのか?とお悩みの方は多いはずです。
そこで、KDDIの今後の株価予想をAIで行ってみます。AIを作るためには、データが必要です。
そこでまずは、KDDIの株価をインターネットサイトから取得しデータ化するWebスクレイピングについて解説します。
株価データ提供サイト
まずは、株価データを提供しているサイトを紹介します。スクレイピングを行っていいサイト、ダメなサイトが存在します。kabuoji3はスクレイピングをしていいサイトになります。
スクレイピングが許可されているかを確認するには、robots.txtを確認する必要があります。
robots.txtを確認したところ、rootからスクレイピングを許可してくれているので、ありがたくスクレイピングさせていただきます。(2020年11月1日時点)
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')
出力結果
日付 | 始値 | 高値 | 安値 | 終値 | 出来高 | 終値調整 | |
0 | 2020-01-06 | 3,237 | 3,243 | 3,211 | 3,243 | 4,504,000 | 3,243 |
1 | 2020-01-07 | 3,250 | 3,273 | 3,238 | 3,271 | 4,604,200 | 3,271 |
2 | 2020-01-08 | 3,270 | 3,277 | 3,213 | 3,241 | 6,703,200 | 3,241 |
3 | 2020-01-09 | 3,241 | 3,300 | 3,234 | 3,295 | 4,647,000 | 3,295 |
4 | 2020-01-10 | 3,295 | 3,298 | 3,278 | 3,288 | 4,270,000 | 3,288 |
5 | 2020-01-14 | 3,280 | 3,299 | 3,277 | 3,283 | 4,701,600 | 3,283 |
6 | 2020-01-15 | 3,289 | 3,290 | 3,266 | 3,270 | 4,198,700 | 3,270 |
7 | 2020-01-16 | 3,251 | 3,265 | 3,243 | 3,254 | 4,288,200 | 3,254 |
8 | 2020-01-17 | 3,263 | 3,277 | 3,259 | 3,265 | 4,223,500 | 3,265 |
コメント
[…] 【KDDIの株価をAIで予想】スクレイピング編暴落したKDDIの今後の株価を予想… […]
[…] 【KDDIの株価をAIで予想】スクレイピング編暴落したKDDIの今後の株価を予想… […]
[…] 【KDDIの株価をAIで予想】スクレイピング編暴落したKDDIの今後の株価を予想するAIを設計します。まずは、データを取得するための、Webスクレイピングについて解説します。tsukimitech.com2020 […]