見出し画像

Pythonの呼吸 壱ノ型 情報時雨・改

21年7月にpandasで仕様変更があったらしくpdr.DataReaderからget_data_yahooへ変更したのを簡単にまとめました

グーグルコラボやpythonのプログラムがある程度分かって
株価データの取得の仕方がわからない人用です
きちんと確認していないけどデータは多分20分遅れです
当日終値を確定で取り込みたい時は注意が必要です

python1年ぐらいしかやってなくてプログラミング10か月ぶり位だけどw


いくつか事前準備と初期設定

グーグルのColaboratoryを使ってます(個人環境に合わせて使って下さい)

ドライブのマウントを行ってください

任意の場所にCSVファイルを作成して下さい
今回はColab Notebooks/CSVフォルダに225銘柄のCSVファイルを作成
List225.csv  ※エンコードはUTF-8にして下さい
直接プログラム内で証券コードを code_list =(9983,9984)のように
指定する場合は必要ありません

CSVファイルの1行目の証券コードとプログラム10行目の"証券コード"を同じにして下さい、同じにしないと取り込めなくなります
CSVの方をコードにしたら、プログラムの方も"コード"という感じに!

今回のテスト用に225銘柄の銘柄コードを用意


プログラム

全体で60行弱です


pipでyfinanceとworkdaysをインストールします
workdaysは日付指定で2022-8-23からとか指定する場合は必要ありません
何日前とかの指定で祝日を除きたい場合に使用します

pip install yfinance
pip install workdays
import datetime
import os
import pandas as pd
import pandas_datareader.data as pdr
import yfinance as yf
import workdays

os.chdir("/content/drive/My Drive/Colab Notebooks")                     # ディレクトリ変更(グーグルドライブのマウント必要、読み書きするCSVファイルはここに)
df = pd.read_csv("./CSV/List225.csv", encoding="utf-8-sig", sep=",")    # 上記ディレクトリにCSVフォルダの中のCSVファイル読み込み
code_list = df["証券コード"]                                            # CSVデータを各変数リストに代入

# ------------------------------ 休日・祝日、日付設定
holidays = [datetime.date(2022, 7, 18),datetime.date(2022, 8, 11),datetime.date(2022, 9, 19)]   # こんな感じで祝日を指定
end = datetime.date.today()                                             # 今日
day26 = workdays.workday(end, -25, holidays)                            # 26日前からのデータを取得したい場合、祝日を除いた今日から25日前の日付を指定

# ------------------------------ 関数:計算処理
def calc():
    for j in range(len(dt[i])):                                         # 取得したデータの index を j に代入して終了までループ
    # 何か計算処理したい場合はここで

    # 項目を辞書にセット・書き出し
        d = {"証券コード":code_list[i],"始値":dt[i]["Open"][j],"高値":dt[i]["High"][j],"安値":dt[i]["Low"][j],"終値":dt[i]["Close"][j],"出来高":dt[i]["Volume"][j]}
        d_list.append(d)
        print(d)                                                        # 画面印刷必要なければコメントアウトで若干処理が速くなる

# ------------------------------ 関数:データ取得
def code_items():
    stock = "{}.T".format(code_list[i])                                 # 日本株銘柄コード yahoo(****.T) stooq(****.jp)米株"GOOG","NVDA"等
    yf.pdr_override()                                                   # yfオーバーライド
    dt[i] = pdr.get_data_yahoo(stock, day26)                            # データ取得 DataReader('銘柄コード','取得先','開始日','終了日')endなしの場合、最新日まで取得
    # dt[i] = pdr.DataReader(stock,"yahoo",day26)                       # 以前のデータ取得、pdr.DataReaderからget_data_yahooへ変更 2021.7 pandas仕様変更
    try:
        calc()                  # 関数:計算処理
    except:
        print("err2",code_list[i])

# ------------------------------ メイン処理
dt_now = datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=9),'JST'))    # 開始日時
print(dt_now.strftime('開始 %Y年%m月%d日 %H:%M:%S'))

dt = {}                                                                                 # 銘柄毎のOHLCVデータ辞書 # 辞書{}・リスト[]を作成
d_list = []                                                                             # CSV書き出し用リスト

for i in range(len(code_list)):                                                         # 読み込んだコードリストの index を i に代入して終了までループ
    try:
        code_items()            # 関数:データ取得(関数:計算処理)
    except:
        print("err1",code_list[i])

df = pd.DataFrame(d_list)                                                               # リストをデータフレームに代入
df.to_csv("データ取得.csv", index = False, encoding="utf-8-sig")                        # CSVファイル書き出し

dt_now = datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=9),'JST'))    # 終了日時
print(dt_now.strftime('終了 %Y年%m月%d日 %H:%M:%S'))
画面に印刷する場合こんな感じで表示
最後にCSVを書き出して終了
スプレッドシートで表示するとこんな感じ
225銘柄毎26日分のOHLCと出来高が取得できています


23.12.12 yfinanceが何か更新されてデータが取得できないというのを見て、自分でも確認したので調べたらpipのアップデートすれば上手くいくというのを見つけたので、やってみたら上手くいきました

pip install yfinance --upgrade yfinance

又は

pip install yfinance -U

サポートされると喜んでアイスを買っちゃいます!٩(๑❛ᴗ❛๑)۶