前回からの続きで実装していきましょう!
データの取得
一つ一つの銘柄コードに対して1日と5分足の株価の情報を取得します。
そこから必要な指標を計算して、最終行(最新)を辞書に格納します。
for index, symbol in enumerate(symbol_list):
print(symbol)
temp={}
temp['symbol']=symbol
ticker=yf.Ticker(symbol)
df_history_1d=ticker.history(interval='1d', start=str_start_date,end=str_end_date)
df_history_5m=ticker.history(interval='5m', start=str_start_date,end=str_end_date)
# 平均取引量
df_history_1d['14Day_Avg_Volume'] = df_history_1d['Volume'].rolling(window=14).mean()
# ATRの計算
df_history_1d['ATR'] = calculate_atr(df_history_1d)
# 相対出来高の計算
relative_volume_df = calculate_relative_volume(df_history_5m)
df_history_1d=df_history_1d.reset_index()
relative_volume_df=relative_volume_df.reset_index()
df_history_1d['Date'] = pd.to_datetime(df_history_1d['Date']).dt.date
relative_volume_df['Date'] = pd.to_datetime(relative_volume_df['Date']).dt.date
merged_df = pd.merge(df_history_1d, relative_volume_df, on='Date', how='left')
if len(merged_df) == 0:
print(f'{symbol}:0行です。')
continue
merged_df.to_csv(f'{path}/{symbol}_1d_{str_start_date}_{str_end_date}.csv')
df_history_5m.to_csv(f'{path}/{symbol}_5m_{str_start_date}_{str_end_date}.csv')
temp['avg_vol'] = merged_df.tail(1)['14Day_Avg_Volume'].values[0]
temp['atr'] = merged_df.tail(1)['ATR'].values[0]
temp['rv'] = merged_df.tail(1)['Relative_Volume'].values[0]
target.append(temp)
time.sleep(0.2)
APIには一定時間内の回数制限があるみたいなので、一つの処理毎に0.2秒空けるようにしています。
相対出来高の上位20銘柄を抽出し保存
top_20_data = filter_top_20_by_rv(target)
# ファイルに保存
with open(f'~filter_stock_for_5minetues_ORB_strategy\\top_20_by_rv\\{str_start_date}_{str_end_date}.json', 'w') as f:
json.dump(top_20_data, f)
結果出来上がったのが以下のようなリスト。
[
{
"symbol": "6965.T",
"avg_vol": 1776914.2857142857,
"atr": 109.14285714285714,
"rv": 6.474494706448508
},
{
"symbol": "4575.T",
"avg_vol": 2437571.4285714286,
"atr": 101.57142857142857,
"rv": 3.9250866185972466
},
{
"symbol": "4062.T",
"avg_vol": 1945750.0,
"atr": 217.42857142857142,
"rv": 1.821917808219178
},
...
これを毎日の取引時間が終わった時に実行すれば、次の日のポートフォリオが出来上がるということですね!
次回は実際の銘柄の値動きを見て、どれくらい利益が出そうか見てみましょう!
コメント
コメントを投稿