はじめに
ふと「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列に入っている部分)です。
各銘柄の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」トヨタ自動車株式会社の株価データです。
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()
結果です。
10年間連続して、7月の月初めと月末の終値の差が1%以上ある銘柄コードは、「2040」と「3349」でした。
最後に
銘柄コード「3349」株式会社コスモス薬品で確認してみます。
きちんと7月は上昇していました。
が、来年は落ちるかもしれないし。。。
こんな高いの買えないし。。。 ははは。