0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

pythonで株価を取得して、毎年おなじ月にあがる株があるかを調べてみた

Posted at

はじめに

ふと「10年連続で、毎年同じ月に株価が上がる銘柄ってあるのかな?」と思い立って、調べてみました。たとえば「7月の最初の取引日の終値で買って、7月の最後の取引日の終値で売ったら、10年連続でプラスになる銘柄ってあるの?」という感じです。

銘柄コードの取得

まずは株価を取ってくる前に、東証に上場している銘柄コードを集めます。これはエクセルファイルをダウンロードすれば手に入りますし、Pythonを使えばCSVファイルとして取得することもできます。

import pandas as pd
import os

# 東証の上場銘柄一覧のURL
url = "https://www.jpx.co.jp/markets/statistics-equities/misc/tvdivq0000001vg2-att/data_j.xls"

# 保存ファイル名
file_name = "stock_code.csv"

def read_excel_url(url):
    try:
        df = pd.read_excel(url)  
        return df
    except Exception as e:
        print(f"Error reading the Excel file: {e}")
        return None

def save_to_csv(stock_code, file_name):
    try:
        stock_code.to_csv(file_name, encoding="utf-8-sig", index=False)
        print(f"Data saved to {file_name}")
    except Exception as e:
        print(f"Error saving to CSV: {e}")

def main():
    script_dir = os.path.dirname(os.path.abspath(__file__))
    save_path = os.path.join(script_dir, file_name)

    data = read_excel_url(url)
    if data is not None:
        print(data.head())
        save_to_csv(data, save_path)

if __name__ == "__main__":
    main()

これは、Pythonで取得した銘柄コード(エクセルのB列に入っている部分)です。

image.png

各銘柄の10年分の株価を取得

yfinanceを使って株価を取得しました。ただし、上場から10年たっていない銘柄はスキップしています。全部で4414銘柄のうち3069銘柄の株価データが取れました(2025年8月28日現在)。

import yfinance as yf
import pandas as pd
import os

# 10年分のデータが欲しいので、開始日は2015/08/28に固定
start="2015-08-28"

def download_stock_data():
    script_dir = os.path.dirname(os.path.abspath(__file__))
    # 銘柄コードが書かれたcsvファイルのパス
    load_path = os.path.join(script_dir, "stock_code.csv")
    # 各銘柄の株価の保存フォルダ
    save_dir = os.path.join(script_dir, "stock_data")
    os.makedirs(save_dir, exist_ok=True)

    # CSVを読み込む
    df = pd.read_csv(load_path)

    start_date = pd.Timestamp(start)
    end_date = pd.Timestamp.now().normalize()  # 今日

    total = len(df['コード'])
    for idx, code in enumerate(df['コード'], 1):
        ticker_symbol = code + ".T"
        safe_symbol = ticker_symbol.replace(".", "_")
        file_name_path = os.path.join(save_dir, f"stock_data_{safe_symbol}.csv")

        stock_data = yf.download(
            ticker_symbol,
            start=start_date.strftime('%Y-%m-%d'),
            end=end_date.strftime('%Y-%m-%d'),
            auto_adjust=False,
            progress=False
        )

        if stock_data is None or stock_data.empty:
            continue

        first_date = stock_data.index[0]

        # 開始日が10年前より後ならスキップ
        if first_date > start_date:
            continue

        stock_data.index.name = 'Date'
        stock_data['Ticker'] = ticker_symbol
        stock_data.to_csv(file_name_path, encoding="utf-8-sig")

        print(f"進捗: {idx}/{total} 完了", end='\r')

if __name__ == "__main__":
    download_stock_data()

Pythonで取得した銘柄コード「7203」トヨタ自動車株式会社の株価データです。

image.png

10年間、毎年同じ月にあがっている銘柄

10年分の株価データを集めたので、実際に「毎年同じ月に10年連続で上がってる銘柄ってあるの?」ってことで、10年連続、月初めと月末の終値の差が1%以上あるものをチェックしてみました。

import pandas as pd
import os
from glob import glob

def check_stock_data(threshold=0.01):
    """
    株価CSVフォルダから、月ごとにすべての年で上昇している銘柄を抽出してCSVに保存
    """
    script_dir = os.path.dirname(os.path.abspath(__file__))
    stock_folder = os.path.join(script_dir, "stock_data")
    output_file=os.path.join(script_dir, "10years_monthly_up_stocks.csv")

    # 月ごとの「すべての年で上昇している銘柄」を格納
    final_results = {m: [] for m in range(1, 13)}

    for file in glob(os.path.join(stock_folder, "*.csv")):
        print(f"Processing {file}...", end='\r')
        try:
            # CSV読み込み(Date列をインデックス)
            df = pd.read_csv(file, skiprows=[1, 2], parse_dates=[0], index_col=0)
            df.index.name = 'Date'

            # ファイル名から銘柄コードを取得
            stock_file_name = os.path.basename(file)
            parts = stock_file_name.split("_")
            stock_code = parts[2] if len(parts) > 2 else parts[0].split(".")[0]

            # 月ごとフラグ
            month_flags = {m: [] for m in range(1, 13)}

            # 年ごとに処理
            for year, group in df.groupby(df.index.year):
                for month in range(1, 13):
                    data = group[group.index.month == month]
                    if len(data) == 0:
                        continue
                    first_close = data.iloc[0]["Close"]
                    last_close = data.iloc[-1]["Close"]
                    month_flags[month].append((last_close - first_close) / first_close >= threshold)

            # すべての年で上昇している月だけ登録
            for m in range(1, 13):
                if month_flags[m] and all(month_flags[m]):
                    final_results[m].append(stock_code)

        except Exception as e:
            print(f"Error reading {file}: {e}")

    # DataFrame化
    result_df = pd.DataFrame({f"{m}": pd.Series(final_results[m]) for m in range(1, 13)})

    # 保存
    result_df.to_csv(output_file, index=False, encoding="utf-8-sig")

    print("")
    print(result_df)
    print(f"結果を {output_file} に保存しました。")


if __name__ == "__main__":
    check_stock_data()

結果です。

image.png

10年間連続して、7月の月初めと月末の終値の差が1%以上ある銘柄コードは、「2040」と「3349」でした。

最後に

銘柄コード「3349」株式会社コスモス薬品で確認してみます。

image.png

きちんと7月は上昇していました。

が、来年は落ちるかもしれないし。。。
こんな高いの買えないし。。。 ははは。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?