日本株のリストをpy fileに変換

当サイトでは基本的に毎日、RSIを追っています。

繰り返しますが、トレードにおいて、基本的にはRSI指標だけで十分であると個人的には考えているからであります。

日本株のRSI算出はこちらの固定ページでPythonが投稿してくれています。

日本株のRSI条件分岐表示

では、今のところ当サイトではすべての日本株から算出しているのか?といわれれば、すべてではありません。

一部上場企業からランダムで1000社選んで、1000社からスクリーニングし、RSIが75以上を緑、35以下を赤で表記しています。

日本株のリストは、日本取引所グループから取得可能。

その他統計資料(日本取引所グループ)

ここからはdata_j.xlsというファイルをダウンロードできます。

これを私のPythonプログラムで処理できる形式に変換しながら、.pyファイルとして、リスト化したいわけです。

もちろんランダムで1000社選出するのも簡単。

公式のdata_j.xlsファイルからランダムで1000社選び、pyファイルとして出力するサンプルコードはこちら。

ライブラリ

pip install pandas pyexcel pyexcel-xls
import pandas as pd
from pathlib import Path
import pyexcel as p
import random  # ランダム選択のためにrandomモジュールをインポート

# 絶対パスの設定
excel_path = 'あなたのパス/data_j.xls'  # 絶対パスを指定

# Excelファイルの存在確認
if not Path(excel_path).exists():
    print(f"Excelファイルが見つかりません: {excel_path}")
    print("公式サイトから一部上場企業の銘柄リストをExcel形式(data_j.xls)でダウンロードし、指定のパスに保存してください。")
else:
    try:
        # pyexcelを使用して.xlsファイルを読み込み、リストのレコードを取得
        records = p.get_records(file_name=excel_path)
        # Pandas DataFrameに変換
        df = pd.DataFrame(records)
        print(f"ファイル '{excel_path}' を正常に読み込みました。")
    except Exception as e:
        print(f"Excelファイルの読み込み中にエラーが発生しました: {e}")
        df = None

    if df is not None:
        # 列名の確認
        print("列名一覧:")
        print(df.columns.tolist())
        
        # データの先頭5行を表示
        print("\nデータの先頭5行:")
        print(df.head())

        # 市場区分の列名を明示的に指定
        market_column = '市場・商品区分'  # 明示的に指定
        
        if market_column not in df.columns:
            print(f"{market_column} 列が見つかりません。")
        else:
            # プライム市場の銘柄を抽出
            prime_df = df[df[market_column].astype(str).str.contains('プライム', na=False)]
            print(f"\nフィルタリング後の一部上場企業の銘柄数: {len(prime_df)}")

            # 銘柄コードと会社名の列名を明示的に指定
            ticker_column = 'コード'
            name_column = '銘柄名'

            if ticker_column not in prime_df.columns or name_column not in prime_df.columns:
                print("銘柄コードまたは会社名を示す列が見つかりません。")
            else:
                # 銘柄コードを文字列として扱い、4桁にゼロ埋めし、.Tを追加
                def format_ticker(ticker):
                    ticker_str = str(ticker).zfill(4)  # 銘柄コードを4桁にゼロ埋め
                    if not ticker_str.endswith('.T'):
                        ticker_str += '.T'  # .Tを追加
                    return ticker_str

                # ティッカーシンボルと会社名のリストを作成
                tickers = prime_df[ticker_column].apply(format_ticker).tolist()
                names = prime_df[name_column].astype(str).str.strip().tolist()

                # 不正なエントリを除外
                companies = [
                    {'symbol': ticker, 'name': name}
                    for ticker, name in zip(tickers, names)
                    if ticker[:-2].isdigit() and name  # ティッカーの数字部分と会社名の存在を確認
                ]

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

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

                # .pyファイルとして保存
                output_py = 'あなたのパス/Japan_Prime_Market_Stocks1000.py'
                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プログラム用に最適な辞書を作成しているものなので、みなさんの好みの形式、フォーマットに変換してください。

この形式で出力されています。

RSI条件分岐の際に、シンボルと社名が欲しかったので。

stocks = [
    {'symbol': '7203', 'name': 'トヨタ自動車'},
    {'symbol': '6758', 'name': 'ソニーグループ'},
    {'symbol': '9984', 'name': 'ソフトバンクグループ'},
    # ...(その他の銘柄)
]

銘柄すべてを出力したい場合

ティッカーシンボルに.Tを追加してyfinanceで使用できる形式にしたものです。

import pandas as pd
from pathlib import Path
import pyexcel as p

# 絶対パスの設定
excel_path = 'あなたのパス/data_j.xls'  # 絶対パスを指定

# Excelファイルの存在確認
if not Path(excel_path).exists():
    print(f"Excelファイルが見つかりません: {excel_path}")
    print("公式サイトから一部上場企業の銘柄リストをExcel形式(data_j.xls)でダウンロードし、指定のパスに保存してください。")
else:
    try:
        # pyexcelを使用して.xlsファイルを読み込み、リストのレコードを取得
        records = p.get_records(file_name=excel_path)
        # Pandas DataFrameに変換
        df = pd.DataFrame(records)
        print(f"ファイル '{excel_path}' を正常に読み込みました。")
    except Exception as e:
        print(f"Excelファイルの読み込み中にエラーが発生しました: {e}")
        df = None

    if df is not None:
        # 列名の確認
        print("列名一覧:")
        print(df.columns.tolist())
        
        # データの先頭5行を表示
        print("\nデータの先頭5行:")
        print(df.head())

        # 市場区分の列名を特定
        market_column = '市場・商品区分'  # 明示的に指定
        
        if market_column not in df.columns:
            print(f"{market_column} 列が見つかりません。")
        else:
            # プライム市場の銘柄を抽出
            prime_df = df[df[market_column].astype(str).str.contains('プライム', na=False)]
            print(f"\nフィルタリング後の一部上場企業の銘柄数: {len(prime_df)}")

            # 銘柄コードと会社名の列名を明示的に指定
            ticker_column = 'コード'
            name_column = '銘柄名'

            if ticker_column not in prime_df.columns or name_column not in prime_df.columns:
                print("銘柄コードまたは会社名を示す列が見つかりません。")
            else:
                # 銘柄コードを文字列として扱い、4桁にゼロ埋めし、.Tを追加
                def format_ticker(ticker):
                    ticker_str = str(ticker).zfill(4)
                    if not ticker_str.endswith('.T'):
                        ticker_str += '.T'
                    return ticker_str

                tickers = prime_df[ticker_column].apply(format_ticker).tolist()
                names = prime_df[name_column].astype(str).str.strip().tolist()

                # 不正なエントリを除外
                companies = [
                    {'symbol': ticker, 'name': name}
                    for ticker, name in zip(tickers, names)
                    if ticker[:-2].isdigit() and name
                ]

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

                # ランダムに1,000社を選択せず、すべての銘柄を選択
                selected_companies = companies
                print("全ての銘柄を選択しました。")
                print(f"選択された銘柄数: {len(selected_companies)}")

                # .pyファイルとして保存
                output_py = 'あなたのパス/Japan_Prime_Market_Stocks.py'
                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}")

もしスクリプト実行時に「銘柄コードまたは会社名を示す列が見つかりません。」

と表示された場合、Excelファイル内の実際の列名がスクリプトで指定しているものと異なる可能性があります。

スクリプト実行時に表示される「列名一覧」を確認してください。例えば、以下のように表示されるかもしれません:

列名一覧:
['コード', '企業名', '市場', ...]

スクリプト内で使用している列名を実際の列名に合わせて修正します。

# 銘柄コードと会社名の列名を特定
ticker_column = None
name_column = None
for col in prime_df.columns:
    if '銘柄コード' in col or 'コード' in col:
        ticker_column = col
    if '会社名' in col or '銘柄名' in col or '企業名' in col:
        name_column = col
if not ticker_column or not name_column:
    print("銘柄コードまたは会社名を示す列が見つかりません。")

例えば、列名がコード企業名の場合は以下のようになります。

# 銘柄コードと会社名の列名を特定
ticker_column = None
name_column = None
for col in prime_df.columns:
    if 'コード' in col:
        ticker_column = col
    if '企業名' in col:
        name_column = col
if not ticker_column or not name_column:
    print("銘柄コードまたは会社名を示す列が見つかりません。")

AIの時代にはなりましたが、まだまだPythonは便利なツールとして使えますね。