Ziru Sirka's blog

相場技能の習得を目指した記録用です。

Yahoo!ファイナンスからの時系列(月足)データ取得【実践編】

【作業フォルダーを決める】
次に、Pythonスクリプトやダウンロードした月足四本値データを置くフォルダーを決めます。
自分はコンピューターにログインしたときのユーザーフォルダーにしています。
macOS であれば、Finder を開いてから、「移動」メニューの「ホーム」を選択したときに表示される場所です。

そこに任意のテキストエディター(「テキストエディット」など)で、stockcode.txt というテキストファイルを新規作成します。
「テキストエディット」で作成する場合は、「フォーマット」メニューで「標準テキストにする」にしておくのを忘れないようにしてください。
何か実在する証券コード(例: 5401)を書き込んでから、ファイル名を「stockcode.txt」にして、UTF-8 形式で保存します。
ちなみに全角で「5401」としてはダメです。
日本語入力プログラムをオフにして、半角で「5401」と入力します。
保存場所は先の「ホーム」です。アカウント名で表示されるフォルダーです。

スクリプトファイルを用意する】
「stockcode.txt」と同じフォルダーに、以下のソースコードをコピペしたスクリプトファイルを用意します。
ファイル名はご自身で分かれば任意で良いのですが、例として「get_stockquotes.py」とします。

import datetime
import os
from os.path import exists,isfile
import pandas as pd
import requests
import ssl
ssl._create_default_https_context=ssl._create_unverified_context
import subprocess
import sys

# レコードの取得期間を定義する
begin='19830101'

# 前月最終日を end に指定する (未完了な当月の月足取得を回避する)
today = datetime.datetime.today()
end_of_the_last_month = datetime.datetime(today.year, today.month, 1)+datetime.timedelta(days=-1)
end = end_of_the_last_month.strftime("%Y%m%d")

# ファイルから証券コードを取得する
codef='stockcode.txt'
if isfile(codef): # ファイルの実在確認
    f=open(codef, 'r', encoding='utf-8')
    code = f.read().rstrip("\n")
else: # ファイル不在時にエラー表示
    print(f"{codef} ファイルが見つかりません。")

# 株価情報の保存先フォルダーの実在確認 (無ければ新規作成)
outdir = "quotes_data"
if not exists(outdir):
    os.mkdir(outdir)
outf = outdir + '/' + code + '.csv'

n = 25 # 時系列の月足ページ数上限
url_list = []
for i in range(1, n + 1):
	query = 'https://finance.yahoo.co.jp/' + 'quote/' + code \
	+ '.T/history?from=' + begin + '&to=' + end + '&timeFrame=m&page=' + str(i)
	url_list.append(query) 

# 取得先URL一覧をファイルに出力する
list ='url_list.txt'
with open(list,'w') as f:
	f.writelines([d+"\n" for d in url_list])
	f.close()

# 取得先URLにアクセスし、月足株価の四本値を取得する
urls=[]
f = open(list, 'r')
urls = f.readlines()

# 上場廃止済みの証券コードを指定したときの例外処理
res = requests.get(urls[0])
try:
    res.raise_for_status()
except requests.exceptions.HTTPError as e:
    print(f"コード: {code}\n指定されたページは表示できません。\n{urls[0]}\n処理を中断します。\n")
    sys.exit()
else:
     print(f"{code} の月足四本値を {outf} に出力します。\n")

try:
     attrs={'class': '_13C_m5Hx _1aNPcH77'}
     df = pd.concat([pd.concat(pd.read_html(url, header=0, attrs=attrs), axis=0) for url in urls])
except Exception as e:
      print(f"{code} のレコード取得に失敗しました。\n")
else:
     # 取得レコードをCSV形式のファイルに出力する
     df.to_csv(outf, encoding='shift_jis', mode='w', columns=["日付","始値","高値","安値","終値","調整後終値*"], index=False)
     print(f"{code} の月足四本値を {outf} に出力しました。\n保存先フォルダーを開きます。\n")
     pass

if exists(outdir):
    subprocess.call(["open", outdir])
else:
     print(f"{outdir} フォルダーが見つかりません。")


ここまでできたら、「アプリケーション」フォルダー内の「ユーティリティ」にある「ターミナル」を起動します。

python3 get_stockquotes.py [return]

を実行します。
[return] は、ここで Mac のリターンキー (Windows の [Enter] キー) を押してくださいという意味です。

最初のうちは実行すると Python がエラーを出すと思います。
上記ソースコードの冒頭で import しているモジュールを Python が知らないとエラーを出します。
以下のモジュールくらいはターミナルで組み込んでおくと良いかもしれません。
いちどモジュールを組み込んでおけば、次回実行からはエラーを出しません。
(足りないモジュールがあればエラーを出します。)

pip3 install datetime [return]
pip3 install pandas [return]
pip3 install requests [return] 
pip3 install subprocess [return]

つつがなくスクリプトが実行されると、

5401 の月足四本値を quotes_data に保存しました。
保存先フォルダーを開きます。

というメッセージがターミナルに表示され、Finder が保存先フォルダーを開きます。
そこに 5401.csv というファイルができていればOKです。

csv ファイルを開くと、見憶えのある形式のデータが保存されています。

ちなみに、株式分割や株式統合のあった月の株価は調整されています。
対象月の調整前レコードを日足四本値で確認しておく必要があるかと思います。
stockcode.txt の中身を実在する別の証券コードに書き換えて保存後に、都度

python3 get_stockquotes.py [return]

を実行すれば、新たに csv データを取得できます。

ご不明な点がございましたら、コメント欄に書き込んでください。
分かる範囲で回答いたします。