見出し画像

先週の続き(Pythonと株!)

先週記事にしていたPythonコードをちょこちょこいじってました。

東証が企業の銘柄コードをまとめているものがあるので、そこからDLしてきました。下記URLです。
その他統計資料 | 日本取引所グループ (jpx.co.jp)
コードは以下のようになっています。

import pandas as pd
import pandas_datareader.data as web
import datetime as dt
import yfinance as yf
from tqdm import tqdm

yf.pdr_override()

# Excelファイルから銘柄コードと銘柄名を読み込む
excel_file = "data_j.xlsx"
df = pd.read_excel(excel_file)

# 銘柄コードのカラム名を指定(ここでは 'Symbol' と仮定)
df['Symbol'] = df['Symbol'].astype(str) + ".T"
symbols = df['Symbol'].tolist()
company_names = df['Company'].tolist()

# 取得したいデータの開始・終了日を設定します
start_date = dt.datetime(2023, 1, 1)
end_date = dt.date.today()

# DataFrameに格納するためのリスト
data_list = []

# 各銘柄の株価データと移動平均を取得してリストに格納します
for symbol, name in tqdm(zip(symbols, company_names), total=len(symbols), desc="取得中"):
    try:
        # 株価データを取得
        data = web.get_data_yahoo(symbol, start=start_date, end=end_date)

        # 移動平均を計算
        data['MA_5'] = data['Close'].rolling(window=5).mean()
        data['MA_25'] = data['Close'].rolling(window=25).mean()
        data['MA_50'] = data['Close'].rolling(window=50).mean()
        data['MA_150'] = data['Close'].rolling(window=150).mean()
        data['MA_200'] = data['Close'].rolling(window=200).mean()

        # 52週安値と52週高値を計算
        one_year = dt.timedelta(days=365)
        one_year_data = web.get_data_yahoo(symbol, start=end_date - one_year, end=end_date)
        low_52week = one_year_data['Close'].min()
        high_52week = one_year_data['Close'].max()

        # 最新の株価と移動平均値を取得
        latest_price = data['Close'].iloc[-1]
        latest_ma_5 = data['MA_5'].iloc[-1]
        latest_ma_25 = data['MA_25'].iloc[-1]
        latest_ma_50 = data['MA_50'].iloc[-1]
        latest_ma_150 = data['MA_150'].iloc[-1]
        latest_ma_200 = data['MA_200'].iloc[-1]

        # SMA200の過去21日間の平均値と21日前のSMA200を取得
        avg_21_sma_200 = data['MA_200'].iloc[-22:-1].mean() if len(data) >= 22 else None
        sma_200_21_days_ago = data['MA_200'].iloc[-22] if len(data) >= 22 else None

        # SMA40の過去4週間の平均値と4週前のSMA40を取得
        avg_4_sma_40 = data['MA_50'].iloc[-29:-1].mean() if len(data) >= 29 else None
        sma_40_4_weeks_ago = data['MA_50'].iloc[-29] if len(data) >= 29 else None

        # 最新の株価が以下の条件を満たすときに追加
        # 1. 最新の株価が150日および200日の移動平均線より高い場合
        # 2. 150日 > 200日の場合
        # 3. 50日 > 150, 200日の場合
        # 4. 最新の株価が50日の移動平均線より高い場合
        # 5. 株価は52週安値よりも、少なくとも30%高い
        # 6. 株価は52週高値から少なくとも25%以内にある
        # 7. SMA200の過去21日間の平均値 > 21日前のSMA200 または SMA40の過去4週間の平均値 > 4週前のSMA40
        if latest_price > latest_ma_150 and latest_price > latest_ma_200 \
        and latest_ma_150 > latest_ma_200 \
        and latest_ma_50 > latest_ma_150 and latest_ma_50 > latest_ma_200 \
        and latest_price > latest_ma_50 \
        and latest_price > low_52week * 1.3 \
        and latest_price * 1.25 > high_52week \
        and ((avg_21_sma_200 is not None and sma_200_21_days_ago is not None and avg_21_sma_200 > sma_200_21_days_ago) \
        or (avg_4_sma_40 is not None and sma_40_4_weeks_ago is not None and avg_4_sma_40 > sma_40_4_weeks_ago)):
            data_list.append({
                'Symbol': symbol,
                'Company': name,
                'Latest Price': latest_price,
                'MA_5': latest_ma_5,
                'MA_25': latest_ma_25,
                'MA_50': latest_ma_50,
                'MA_150': latest_ma_150,
                'MA_200': latest_ma_200,
                '52 Week Low': low_52week,
                '52 Week High': high_52week
            })
    except Exception as e:
        print(f"エラー: {symbol} のデータを取得できませんでした。")

# 取得したデータをDataFrameに変換
result_df = pd.DataFrame(data_list)

# Excelファイルに保存
output_file = 'stock-data.xlsx'
result_df.to_excel(output_file, index=False)

print(f"\n株価データの取得と保存が完了しました。ファイル名: {output_file}")

これを実行すると7つの条件に適合した銘柄がスクリーニングされます。
でも、読み込んでは処理をして、というコードなので、完了までかなり時間がかかります。。。
excelファイルの段階で、ある程度振るいをかけれたらいいんですが、
それをすると結局手動でやってる感じになってしまうので、あくまですべて自動でやりたいな!という目標でもう少しコードをいじってみようと思います。

というわけで、Pythonと株の話は以上になります。
昨日くらいからポーカーしてみたい!となり、気軽にできそうなゲームを差がしている最中です。できれば無料でやりたいです、、、
おすすめのポーカーアプリとかあれば教えていただきたいです。

今日はこの辺にしておきます。
1週間おきの投稿ですが、なんとか一か月は続いております。
文章を考えるトレーニングにはなっていそうな気がするので、
これからも続けていけたらいいなと思います。

それでは今日もお疲れ様でした。
また明日から仕事・学校等、頑張りましょう。

いいなと思ったら応援しよう!