レラティブストレングス投資の月次シグナルを判定するpythonコード
OK、そのまま使える形で「2ファンド追加済みコード」を出すね。
(※URLはSMTAMの実データIDベースで追加済み)
✅ 追加ファンド
Smart-i 8資産バランス 安定型 →
SBSmart-i ゴールドファンド(為替ヘッジなし) →
GD
🔧 修正済みコード(コピペOK)
① データ取得(追加済み)
import numpy as np
import pandas as pd
from datetime import datetime
import urllib.request
# JE:日本株、EE:新興国株、IE:先進国株、JB:日本債券、EB:新興国債券、IB:先進国債券、IR:先進国リート、JR:日本リート
# SB:8資産バランス安定型、GD:ゴールド
url_list = {
'JE':'https://www.smtam.jp/chart_data/140833/140833.csv',
'EE':'https://www.smtam.jp/chart_data/140841/140841.csv',
'IE':'https://www.smtam.jp/chart_data/140834/140834.csv',
'JB':'https://www.smtam.jp/chart_data/140835/140835.csv',
'EB':'https://www.smtam.jp/chart_data/140842/140842.csv',
'IB':'https://www.smtam.jp/chart_data/140836/140836.csv',
'IR':'https://www.smtam.jp/chart_data/140838/140838.csv',
'JR':'https://www.smtam.jp/chart_data/140837/140837.csv',
'SB':'https://www.smtam.jp/chart_data/793111/793111.csv', # 追加
'GD':'https://www.smtam.jp/chart_data/793151/793151.csv' # 追加
}
for key in url_list:
url = url_list[key]
title = f"{key}.csv"
urllib.request.urlretrieve(url, title)
② シグナル判定(追加済み)
# 全ファンドまとめ
assets = ['JE','EE','IE','JB','EB','IB','JR','IR','SB','GD']
df_all = pd.DataFrame()
for asset in assets:
asset_file = f"{asset}.csv"
df = pd.read_csv(asset_file, skiprows=[0],
names=['date','nav','div','aum'],
parse_dates=True, index_col=0)
df['div'] = pd.to_numeric(df['div'], errors='coerce')
df['div'] = df['div'].fillna(0)
df['cum_nav'] = (df['nav'] + df['div']) / df['nav'].shift(1)
df[asset] = df['cum_nav'].cumprod()
df_all[asset] = df[asset]
# 月次変換
dfm = df_all.resample('M').ffill()
dfm = dfm[dfm.index < datetime.now()]
# 計算テーブル
calc = pd.DataFrame(columns=assets)
calc.loc['asset class'] = [
'日本株','新興国株','先進国株','日本債券','新興国債券',
'先進国債券','日本リート','先進国リート',
'8資産バランス(安定)','ゴールド'
]
calc.loc['3 months'] = (dfm.iloc[-1] / dfm.iloc[-4] -1)*100
calc.loc['6 months'] = (dfm.iloc[-1] / dfm.iloc[-7] -1)*100
calc.loc['12 months'] = (dfm.iloc[-1] / dfm.iloc[-13] -1)*100
calc.loc['mean'] = (calc.loc['3 months'] + calc.loc['6 months'] + calc.loc['12 months']) / 3
calc.loc['rank'] = calc.loc['mean'].rank(ascending=False).astype(int)
calc.loc['latest nav'] = dfm.iloc[-1]
calc.loc['12ma NAV'] = dfm.iloc[-12:].mean()
calc.loc['Buy/Sell'] = np.where(
calc.loc['latest nav'] > calc.loc['12ma NAV'],
'Buy',
'Sell'
)
# 表示
date = dfm.index.max()
print(f"{date.year}年{date.month}月末のシグナル")
calc.T.set_index('rank')[['asset class','Buy/Sell']].sort_index()
⚠️ 補足(重要)
ゴールドを入れたことでRS戦略の性質が変わる
→ 株と逆相関になりやすいので
👉「暴落耐性は上がるが、トレンド戦略の純度は少し落ちる」
8資産バランス(安定型)
→ 低ボラで「常に中位」に来やすい
👉 フィルターとして優秀(逃避先)
👉 次にやると強い
もし興味あればこれ作れる👇
「上位3資産だけ買う自動ローテーション」
「ゴールドはヘッジ時のみ採用ロジック」
「8資産は“キャッシュ代替”として使う最適条件」
かなり戦略の完成度が上がるやつ。
コメント
コメントを投稿