Pythonを使って日本の株価を取得してラインキングしてみたので
そのコードの紹介。
証券コードについて
日本取引所グループさんが、良い感じのエクセルファイルを準備してくれてます!
上のリンクには、日本取引所グループさんが上場企業についてまとめたdata_j.xlsがダウンロードできます。
ダウンロードしたdata_j.xlsの中身を見てみると
以下のように、企業コードと、企業名などが記入されています。
企業コードが分かれば、後はyfinanceで検索していきます。
yfainanceを使ってjsonファイルに株価を保存
以下にyfinanceライブラリを使って
data_j.xlsに記載された企業の株価を取得します。
以下のコードが書かれたmain.pyをdata_j.xlsと同じディレクトリに保存します。
import os
import numpy as np
import pandas as pd
import yfinance as yf
from tqdm import tqdm
import json
import time
def save_stock_info_to_json(stock_info, filename="stock_info.json"):
# ファイルが存在しない場合、空の配列を作成
if not os.path.isfile(filename):
with open(filename, 'w', encoding='utf-8') as f:
json.dump([], f, ensure_ascii=False, indent=4)
# 既存のデータを読み込む
with open(filename, 'r', encoding='utf-8') as f:
data = json.load(f)
# 新しい株式情報を追加
data.append(stock_info)
# 更新されたデータをファイルに書き戻す
with open(filename, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
def fetch_stock_info(ticker, df_data_j):
ticker_num = f"{ticker}.T"
ticker_data = yf.Ticker(ticker_num)
history = ticker_data.history(period='1d')
latest_date = history.index[-1].strftime('%Y-%m-%d') if not history.empty else None
stock_name = df_data_j.loc[df_data_j['コード'] == ticker, '銘柄名'].values[0]
return {
'証券コード': ticker,
'銘柄名': stock_name,
'株価': history['Close'][-1] if not history.empty else None,
'最新株価日付': latest_date
}
def main():
if not os.path.isfile('data_j.xls'):
print(f"{os.getcwd()}\n東証上場銘柄一覧を[data_j.xls]のファイル名で保存してください。")
exit()
print('東証上場銘柄一覧を読み込みます。')
df_data_j = pd.read_excel('data_j.xls', index_col=None)
df_data_j = df_data_j[~df_data_j['市場・商品区分'].isin(['REIT・ベンチャーファンド・カントリーファンド・インフラファンド', 'ETF・ETN'])]
df_data_j = df_data_j[df_data_j['コード'] != 25935]
total_codes = len(df_data_j['コード'])
start_index, end_index = 0, int(np.ceil(total_codes * 1))
for ticker in tqdm(df_data_j['コード'][start_index:end_index]):
try:
stock_info = fetch_stock_info(ticker, df_data_j)
print(stock_info)
save_stock_info_to_json(stock_info)
except Exception as e:
print(f'証券コード {ticker} のデータ取得中にエラーが発生しました: {e}')
if __name__ == "__main__":
main()
このコードを実行すると、stock_info.jsonにデータが保存されます。
今回は株価だけなので
df_data_j = pd.read_excel(‘data_j.xls’, index_col=None)
df_data_j = df_data_j[~df_data_j[‘市場・商品区分’].isin([‘REIT・ベンチャーファンド・カントリーファンド・インフラファンド’, ‘ETF・ETN’])]
df_data_j = df_data_j[df_data_j[‘コード’] != 25935]
と書かれた行で、関係のないコードを省いてます。
ランキング化
stock_info.jsonファイルが作成されたら
以下のコードをstock_info.jsonと同じディレクトリに保存します。
import json
def load_stock_info_from_json(filename="stock_info.json"):
with open(filename, 'r', encoding='utf-8') as f:
stock_info_list = json.load(f) # ファイル全体を一つのJSONオブジェクトとして読み込む
return stock_info_list
def print_top_10_stocks_by_price(stock_info_list):
# '株価'がNoneでないものをフィルタリングし、株価でソートしてトップ10を取得
top_10_stocks = sorted(
[stock for stock in stock_info_list if stock['株価'] is not None],
key=lambda x: x['株価'],
reverse=True
)[:10]
# トップ10の株価を表示
for stock in top_10_stocks:
print(f"証券コード: {stock['証券コード']}, 銘柄名: {stock['銘柄名']}, 株価: {stock['株価']}, 最新株価日付: {stock['最新株価日付']}")
# JSONファイルから株情報を読み込む
stock_info_list = load_stock_info_from_json()
# 株価トップ10を表示
print_top_10_stocks_by_price(stock_info_list)
このコードを実行したら、コマンドプロンプトには以下のような感じで
株価上位ランキングが表示されます。
この画像の結果なのですが
信金中央金庫の株価めっちゃ高くて、コードがどこか悪いかと思いました。
てっきりファーストリテイリングが高いと思ってたんですけど
意外と4位??ディスコが上がってきてる気もする。
管理人の投資はインデックス投資に任せちゃってるので
株価色々と調べられて楽しかったです(小並感)
おわりに
ここまで読んでいただき、ありがとうございました。
今回はyfinanceを使った株価の取得について書かせてもらいました。
実は今回の記事は
企業コードにアルファベットが入るから、以前紹介してくれたコードだと無理だよと
コメントをいただけたのがきっかけでした。
なので企業コードについて再度調べて、他のサイト様の方法を参考させてもらい
jsonファイルに株価を保存→株価ランキングを表示するまでのコードを書かせていただきました。
非常にありがたいコメント誠にありがとうございました。
これからも皆様のコメントお待ちしております。