米国株のリストをpy fileに変換

前回日本株のリスト取得を紹介しました。

今回は米国株です。

もちろん、これらは例えばAlpha Vantage APIなどの有料サービスを使うと最も簡単に達成可能ではありますが、無料の範囲でできることにトライしております。

Alpha Vantage APIの使い方はこちらのnoteで紹介中。

Alpha Vantage APIは無料の範囲でも制限はあってもいろいろ使えるので便利に使ってみてください。

【徹底解説完全版】Alpha Vantage APIを使い倒すサンプルコード集

今回は日本取引所のような場所、NASDAQの銘柄リストを取得できるサイトからcsvファイルを取得。

NASDAQの銘柄リストが取得できるサイト

フィルタリングして、取得もできますし、NYSEはもちろん国別にも取得できるようなので、いろいろなcsvデータから銘柄のスクリーニングに便利に使えそうです。

データをダウンロードしたら、Pythonファイルに、とりわけ辞書に使えるようなフォーマットに変換してpyファイルにしていきます。

ライブラリ

import pandas as pd
import random
from pathlib import Path
import pandas as pd
import random
from pathlib import Path

# CSVファイルのパスを指定
csv_path = 'あなたのパス/nasdaq_screener_1726890582180.csv'

# 出力するPythonファイルのパスを指定
output_py = 'あなたのパス/US_Market_Stocks.py'

# CSVファイルの存在を確認
if not Path(csv_path).exists():
    print(f"CSVファイルが見つかりません: {csv_path}")
    print("指定したパスに 'nasdaq_screener_1726890582180.csv' ファイルを配置してください。")
else:
    try:
        # CSVファイルを読み込む(エンコーディングが異なる場合は適宜指定)
        df = pd.read_csv(csv_path)
        print(f"ファイル '{csv_path}' を正常に読み込みました。")
    except Exception as e:
        print(f"CSVファイルの読み込み中にエラーが発生しました: {e}")
        df = None

    if df is not None:
        # 列名を確認
        print("列名一覧:")
        print(df.columns.tolist())

        # 必要な列が存在するか確認
        required_columns = ['Symbol', 'Name']  # CSVファイルの列名に応じて変更してください
        missing_columns = [col for col in required_columns if col not in df.columns]
        if missing_columns:
            print(f"必要な列が見つかりません: {', '.join(missing_columns)}")
            print("CSVファイルの列名を確認してください。")
        else:
            # 'Symbol'と'Name'の列を抽出し、リスト化
            symbols = df['Symbol'].astype(str).str.upper().str.strip().tolist()
            names = df['Name'].astype(str).str.strip().tolist()

            # 銘柄リストの作成
            companies = [{'symbol': symbol, 'name': name} for symbol, name in zip(symbols, names) if symbol and name]

            print(f"有効な銘柄数: {len(companies)}")

            # ランダムに100社を選択(銘柄数が100以上の場合)
            if len(companies) >= 100:
                selected_companies = random.sample(companies, 100)
                print("ランダムに100社を選択しました。")
            else:
                selected_companies = companies
                print("銘柄数が100未満のため、全ての銘柄を選択しました。")

            print(f"選択された銘柄数: {len(selected_companies)}")

            # 選択された銘柄をPythonファイルに保存
            try:
                with open(output_py, 'w', encoding='utf-8') as f:
                    f.write('stocks = [\n')
                    for company in selected_companies:
                        f.write(f"    {{'symbol': '{company['symbol']}', 'name': '{company['name']}' }},\n")
                    f.write(']\n')
                print(f"結果を '{output_py}' に保存しました。")
            except Exception as e:
                print(f".pyファイルの保存中にエラーが発生しました: {e}")

こちらも列名などは把握しておきましょう。

if df is not None:
    print("列名一覧:")
    print(df.columns.tolist())

    required_columns = ['Symbol', 'Name']  # CSVファイルの列名に応じて変更
    missing_columns = [col for col in required_columns if col not in df.columns]
    if missing_columns:
        print(f"必要な列が見つかりません: {', '.join(missing_columns)}")
        print("CSVファイルの列名を確認してください。")
    else:
        symbols = df['Symbol'].astype(str).str.upper().str.strip().tolist()
        names = df['Name'].astype(str).str.strip().tolist()

        companies = [{'symbol': symbol, 'name': name} for symbol, name in zip(symbols, names) if symbol and name]

        print(f"有効な銘柄数: {len(companies)}")

もちろんすでにデータ取得時にフィルタリングしているのであれば、そのまま変換すればOKです。

import pandas as pd
import random
from pathlib import Path

# CSVファイルのパスを指定
csv_path = '/Users/kotaro/Desktop/nasdaq_screener_1726890582180.csv'

# 出力するPythonファイルのパスを指定
output_py = '/Users/kotaro/Desktop/US_Market_Stocks.py'

# CSVファイルの存在を確認
if not Path(csv_path).exists():
    print(f"CSVファイルが見つかりません: {csv_path}")
    print("指定したパスに 'nasdaq_screener_1726890582180.csv' ファイルを配置してください。")
else:
    try:
        # CSVファイルを読み込む(エンコーディングが異なる場合は適宜指定)
        df = pd.read_csv(csv_path)
        print(f"ファイル '{csv_path}' を正常に読み込みました。")
    except Exception as e:
        print(f"CSVファイルの読み込み中にエラーが発生しました: {e}")
        df = None

    if df is not None:
        # 列名を確認
        print("列名一覧:")
        print(df.columns.tolist())

        # 必要な列が存在するか確認
        required_columns = ['Symbol', 'Name']  # CSVファイルの列名に応じて変更してください
        missing_columns = [col for col in required_columns if col not in df.columns]
        if missing_columns:
            print(f"必要な列が見つかりません: {', '.join(missing_columns)}")
            print("CSVファイルの列名を確認してください。")
        else:
            # 'Symbol'と'Name'の列を抽出し、リスト化
            symbols = df['Symbol'].astype(str).str.upper().str.strip().tolist()
            names = df['Name'].astype(str).str.strip().tolist()

            # 銘柄リストの作成
            companies = [{'symbol': symbol, 'name': name} for symbol, name in zip(symbols, names) if symbol and name]

            print(f"有効な銘柄数: {len(companies)}")

            # すべての銘柄を選択
            selected_companies = companies
            print("全ての銘柄を選択しました。")
            print(f"選択された銘柄数: {len(selected_companies)}")

            # 選択された銘柄をPythonファイルに保存
            try:
                with open(output_py, 'w', encoding='utf-8') as f:
                    f.write('stocks = [\n')
                    for company in selected_companies:
                        f.write(f"    {{'symbol': '{company['symbol']}', 'name': '{company['name']}' }},\n")
                    f.write(']\n')
                print(f"結果を '{output_py}' に保存しました。")
            except Exception as e:
                print(f".pyファイルの保存中にエラーが発生しました: {e}")

このようにして、RSIのスクリーニングのための辞書を作成しています。

みなさんのプログラムの基礎作りの参考になれば幸いです。