概要
テクニカル指標である「ストキャスティクス」から日足ベースで「売られすぎ」銘柄を探すこととしました。
日経上場企業は3800社程度ありますので、手動で探すのはむりです。
なので、chatgptさんとpythonさんにお手伝いいただいてプログラミングで引っ張ってくることとしました。
ストキャスティクスとは
ストキャスティクスとは、相場の買われ過ぎ・売られ過ぎを判断する分析手法のひとつです。
一定期間内の価格の相対的高さを数値にしたもので、期間内の最安値に近づいたら「売られすぎ」と判断します。
計算式は下記です。値は0~100の範囲に収まります。
※一般的にnは9(=2週間)、mは3であることが多いです。
上記式で得られるのがファストストキャスティクスといいます。もう少し変化がなだらかになったスローストキャスティクスというものもありますが、今回は使いませんでした。
ストキャスティクスの例
SBI証券の株アプリではストキャスティクスの変化を確認することができます。
ろうそく足の下にあるのがストキャスティクスです。
%K、%Dともに20以下なので「売られすぎ状態」ですね。ろうそく足もだいぶ下がっているようです。こうなると、そろそろ反発するのでは?思えます。
売られすぎ銘柄を探すプログラム
今回はストキャスティクスを使って、最新の株価で「売られすぎ」銘柄を探してみます。狙いは%K、%Dともに10%以下としました。
動作環境は下記です。
- windows11 64bit
- pythonバージョン:Python 3.9.7
プログラム中で利用している「nk.csv」については東京証券取引所のエクセルファイル(data_j.xls)をダウンロードし、CSV(UTF-8)でセーブしたものです。
import mplfinance as mpf
import datetime
import pandas as pd
import pandas_datareader.data as pdr
import yfinance as yf
# yfinanceのオーバーライド
yf.pdr_override()
# 期間
start = "2022-10-01"
end = datetime.datetime.today().strftime('%Y-%m-%d')
# 「nk.csv」からデータを読み込む
df_nk = pd.read_csv('nk.csv')
tickers = df_nk['コード'].tolist() # 「コード」列のデータをリストとして取得
names = df_nk['銘柄名'].tolist() # 「銘柄名」列のデータをリストとして取得
# 銘柄リストを作成
tickers_full = [(str(ticker) + ".T", name) for ticker, name in zip(tickers, names)] # ティッカーと銘柄名のペアを作成
total_tickers = len(tickers_full) # 全行数を取得
# 結果を格納するリスト
results = []
for idx, (ticker, name) in enumerate(tickers_full):
try:
# データ取得
df = pdr.get_data_yahoo(ticker, start, end)
df.sort_index(ascending=True, inplace=True)
# ストキャスティクス日足
term = 9
df['%K'] = ((df['Close'] - df['Low'].rolling(term).min()) \
/ (df['High'].rolling(term).max() - df['Low'].rolling(term).min())) * 100
df['%D'] = df['%K'].rolling(3).mean()
df['%SD'] = df['%D'].rolling(3).mean()
df['UL'] = 80
df['DL'] = 20
# 最新日の%Dと%Kを取得する
latest_date = df.index[-1] # 最後の行(最新の日付)のインデックスを取得
latest_k_value = df.at[latest_date, '%K']
latest_d_value = df.at[latest_date, '%D']
# 現在の処理数/全行数を表示
print("")
print(f"現在の処理数: {idx + 1}/{total_tickers}")
print(f"{name} ({ticker})")
print(f"最新日の %K: {latest_k_value:.1f}")
print(f"最新日の %D: {latest_d_value:.1f}")
# 条件を満たす場合、結果をリストに追加
if latest_k_value < 10 and latest_d_value < 10:
results.append([ticker, name, latest_k_value, latest_d_value])
except Exception as e:
print(f"Error processing ticker {ticker} ({name}): {e}")
# 結果をCSVファイルに保存(UTF-8 BOM付き)
results_df = pd.DataFrame(results, columns=['Ticker', 'Name', 'Latest %K', 'Latest %D'])
results_df.to_csv('results.csv', index=False, encoding='utf-8-sig')
※moduleがなくてエラーになる場合は、インストールをお願いします。
結果
今回は150件得られました。一部を並べてみます。
例であげたトヨタが入っていないので、ちょっと改良する予定です。
証券コード | 企業名 | %K | %D |
2573 | 北海道コカ・コーラボトリング | 8.9 | 7.7 |
4530 | 久光製薬 | 3.3 | 8.3 |
6965 | 浜松ホトニクス | 5.5 | 6.9 |
7014 | 名村造船所 | 7.5 | 8.3 |
7550 | ゼンショーホールディングス | 0.0 | 6.1 |
9009 | 京成電鉄 | 4.0 | 7.4 |
9501 | 東京電力ホールディングス | 4.8 | 9.6 |
もちろんこの結果だけで買うかどうかを判断はしませんが、上がり目のありそうな銘柄を確認できそうです。
もしpython環境がありましたら銘柄スクリーニングが可能ですので、ご利用してみてください。
コメント