本サイトは広告・プロモーションが含まれています
Python

【yahoo_fin】Pythonで日本の株価ランキングを取得する

このブログを読んでくださる方の多くの人も関心がある内容かもしれませんが
新NISA制度がもう直ぐ始まりますね。

つまり株や投資信託などの投資関連の話題です。



本記事では、

Pythonを使って1株あたりの価格を取得し、上位トップ10の銘柄を取得するPythonコード

を紹介していきたいと思います。

証券コードの取得方法について

証券コードを確実に取得するには
一般的にはウェブスクレイピングを使用して証券取引所の公式ウェブサイトから情報を取得することがあります。

ただし、ウェブスクレイピングはサイトの利用規約に違反する可能性があるため、慎重に行う必要があったりするのでちょっとやりたくない。

そこでまず証券コードを以下のサイトで調べてみました。

なんだかんだ1300~9999の数字だし、無いものも省けばいいだけなので。

①1300~9999までの数値のリストを作成する。(存在しない証券コードも含む)
②リストから順に株価を取得する。この時証券コードが無いものはNoneになる。

というコードを書いていきたいと思います。

コード


とりあえず、コードを書いてみました。

import math
import warnings
warnings.filterwarnings("ignore", category=FutureWarning)
from yahoo_fin import stock_info

def get_stock_price(stock_code):
    try:
        # ".T"は東京証券取引所を指定
        price = stock_info.get_live_price(stock_code + ".T")
        return {"stock_code":stock_code, "price":price}
    except Exception as e:
        pass

if __name__ == '__main__':
    company_list = [str(num) for num in range(1300, 9999)]

    stock_price =  list(filter(None, list(map(lambda code: get_stock_price(code), company_list))))
    cleaned_stocks = list(filter(lambda stock: not math.isnan(stock['price']), stock_price))

    top_10_stocks = sorted(cleaned_stocks, key=lambda x: x['price'], reverse=True)[:10]

    print(top_10_stocks)

このコードを回せば、日本の企業の株価トップ10が取得できます。

yahoo_finの解説は公式ドキュメントからご確認ください。

このコードを使用する注意点

ただこのコード、実行したら簡単にデータが取得簡単に取得できるわけじゃないんです。


絶望的にデータ取得が遅いです。
トップ10とかprintしてるんじゃなくて、リストをcsvファイルかなにかに保存したほうが良いレベル。

最近買ったCorei7のメモリ16GBノートPCで回して、3時間かかるってどういうことだってばよ。。。

ということでCSVに保存したコードがこちら

import csv
import math
import warnings
warnings.filterwarnings("ignore", category=FutureWarning)
from yahoo_fin import stock_info

def get_stock_price(stock_code):
    try:
        # ".T"は東京証券取引所を指定
        price = stock_info.get_live_price(stock_code + ".T")
        return {"stock_code":stock_code, "price":price}
    except Exception as e:
        pass

if __name__ == '__main__':
    company_list = [str(num) for num in range(1300, 9999)]

    stock_price =  list(filter(None, list(map(lambda code: get_stock_price(code), company_list))))
    cleaned_stocks = list(filter(lambda stock: not math.isnan(stock['price']), stock_price))

    sorted_stocks = sorted(cleaned_stocks, key=lambda x: x['price'], reverse=True)

    # CSVファイルに書き込む
    csv_file_path = 'stocks_data.csv'

    with open(csv_file_path, 'w', newline='') as csv_file:
        fieldnames = ['stock_code', 'price']
        writer = csv.DictWriter(csv_file, fieldnames=fieldnames)

        
        writer.writeheader()

       
        for row in sorted_stocks:
            writer.writerow(row)

    print(f'Data has been saved to {csv_file_path}')

これでも数時間かかりました。。。

おわりに


ここまで読んでいただき、ありがとうございました。

もしこんな完了するまでに数時間かかるコードを修正していただける方がいらしたら
コメントしてくだされば嬉しいです。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA