先週の続き(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週間おきの投稿ですが、なんとか一か月は続いております。
文章を考えるトレーニングにはなっていそうな気がするので、
これからも続けていけたらいいなと思います。
それでは今日もお疲れ様でした。
また明日から仕事・学校等、頑張りましょう。