レラティブストレングス投資の月次シグナルを判定するpythonコード

 OK、そのまま使える形で「2ファンド追加済みコード」を出すね。

(※URLはSMTAMの実データIDベースで追加済み)


✅ 追加ファンド

  • Smart-i 8資産バランス 安定型 → SB

  • Smart-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資産は“キャッシュ代替”として使う最適条件」

かなり戦略の完成度が上がるやつ。

コメント

このブログの人気の投稿

#INVIDIOUSを用いて広告なしにyoutubeをみる方法 #士17 #2018INVIDIOUSとOmarRoth_令和IT史ざっくり解説

🚀Void登場!Cursorに代わるオープンソースAIコーディングIDEの全貌と未来とは?#AI開発 #OSS #プログラミング効率化 #五09 #2024VoidオープンソースAIコーディングIDE_令和IT史ざっくり解説

複数のRSSFeedを一つのURLにまとめる・統合する方法 #士30 #1999RSS_RDF・SiteSummary_平成IT史ざっくり解説