ChatGPTにいろいろ教わりながらETFの解析をしてみた

# 目的
中田敦彦のYouTube大学のこの「[お金の増やし方](https://www.youtube.com/watch?v=dkE9vnU2byE)」で紹介されていたローテーション戦略は「一ヶ月で成績のよいものを買い足す」ということである、と。自分が購入しているETFについては上がっているかどうかわかるのですが、もう少し広げていろんなETFで成績のいいやつを買い足す方がいいのではないか？と考え、１ヶ月間で値上がりしてるETFがわかるスクリプトを作ろうと考えました。

その辺の知識は何もないので、ChatGPT（GPT-4o）に聞きながらスクリプトを作ってみました。

# ライブラリ
ChatGPTに聞くとどうやら株のデータはPythonの[yfinance](https://finance.yahoo.com/)というライブラリが無料で便利だということです。その他にも以下の２つのAPIサービスを紹介してくれました。

[Alpha Vantage](https://www.alphavantage.co/)
[Quandl](https://www.quandl.com/)

どういうデータが得られて、どう分析すべきかもChatGPTに聞いてみました。

<details><summary>ChatGPT ETFの財務指標</summary>

```
yfinanceを使用すると、ETFのさまざまな財務指標や情報を取得できます。
以下に、yfinanceで取得可能な主要なETF指標と情報を紹介します。

主なETF指標と情報
基本情報

longName: ETFの正式名称
symbol: ティッカーシンボル
sector: セクター
industry: 業界
価格情報

currentPrice: 現在の価格
previousClose: 前日の終値
open: 当日の始値
dayHigh: 当日の最高値
dayLow: 当日の最安値
volume: 取引量
averageVolume: 平均取引量
市場情報

marketCap: 時価総額
sharesOutstanding: 発行済株式数
floatShares: 浮動株数
trailingPE: 過去12か月の株価収益率
forwardPE: 予想株価収益率
pegRatio: PEGレシオ（株価収益成長率）
配当情報

dividendRate: 配当額
dividendYield: 配当利回り
exDividendDate: 配当落ち日
payoutRatio: 配当性向
リスク指標

beta: ベータ値（市場全体との相関）
52WeekHigh: 52週間の最高値
52WeekLow: 52週間の最安値
パフォーマンス情報

trailingAnnualDividendYield: 過去12か月の配当利回り
trailingAnnualDividendRate: 過去12か月の配当額
fiveYearAvgDividendYield: 過去5年間の平均配当利回り

```

</details>

<details><summary>ChatGPT ETFの分析手法</summary>

```
ETF（上場投資信託）の分析手法には、ファンダメンタル分析、テクニカル分析、リスク分析など、さまざまなアプローチがあります。以下に、主な分析手法を詳しく説明します。

1. ファンダメンタル分析 (Fundamental Analysis)
ファンダメンタル分析は、ETFを構成する個別銘柄やセクター全体の財務状況や業績を評価する方法です。以下の指標がよく使用されます。

株価収益率 (P/E Ratio): ETFを構成する企業の平均P/Eを計算して評価します。
配当利回り (Dividend Yield): ETFの配当利回りを計算し、収益性を評価します。
純資産価値 (Net Asset Value, NAV): ETFの総資産から総負債を引いた値を発行済みユニット数で割ったもの。NAVの成長を評価します。
セクター分析: ETFが投資するセクターや業界の見通しを評価します。
2. テクニカル分析 (Technical Analysis)
テクニカル分析は、価格チャートや取引量などの市場データを基に、ETFの将来の価格動向を予測する方法です。

移動平均 (Moving Averages): 短期（例: 50日）および長期（例: 200日）の移動平均を使ってトレンドを分析します。
相対力指数 (RSI): RSIを使用して、ETFが買われ過ぎか売られ過ぎかを判断します。
ボリンジャーバンド (Bollinger Bands): ボラティリティを考慮した価格帯を示し、価格の反転ポイントを予測します。
MACD (Moving Average Convergence Divergence): 短期と長期の移動平均の差を分析し、トレンドの強さと方向を判断します。
3. リスク分析 (Risk Analysis)
リスク分析は、ETFのリスクプロファイルを評価する方法です。

ベータ値 (Beta): 市場全体との相関性を測定し、ETFのリスク度合いを評価します。
シャープレシオ (Sharpe Ratio): リスク調整後のリターンを評価します。
最大ドローダウン (Max Drawdown): 過去のピークから最大の下落幅を評価し、リスクを測定します。
標準偏差 (Standard Deviation): リターンの変動性を測定し、リスクを評価します。
4. ポートフォリオ分析 (Portfolio Analysis)
ETFがポートフォリオ内でどのように機能するかを評価する方法です。

アセットアロケーション (Asset Allocation): ポートフォリオ内の資産配分を評価し、分散投資効果を確認します。
相関係数 (Correlation Coefficient): 他の資産クラスやETFとの相関性を評価し、リスク分散の効果を確認します。
5. パフォーマンス分析 (Performance Analysis)
ETFの過去のパフォーマンスを評価する方法です。

累積リターン (Cumulative Returns): 特定期間内の累積リターンを評価します。
年間リターン (Annualized Returns): 過去数年の年間リターンを評価します。
トラッキングエラー (Tracking Error): ETFのリターンとベンチマーク指数のリターンの差を評価します。
参考文献
Investopedia: ETF Analysis
Morningstar: ETF Research
Yahoo Finance: ETF Screener
これらの分析手法を組み合わせて、ETFの総合的な評価を行うことができます。目的や投資スタイルに応じて適切な手法を選択し、投資判断を行うことが重要です。
```

</details>

おそらくは財務指標から１ヶ月の値上がりがわかるのであろう。そして、分析手法の中で紹介されている以下の３つの指標も入れたらいくらか判断基準になるかなと思い、スクリプトに入れてみました。相関係数は「SPDR S&P 500 ETF Trust」との相関を見ることにしました。

```
相対力指数 (RSI): RSIを使用して、ETFが買われ過ぎか売られ過ぎかを判断します。
相関係数 (Correlation Coefficient): 他の資産クラスやETFとの相関性を評価し、リスク分散の効果を確認します。
年間リターン (Annualized Returns): 過去数年の年間リターンを評価します。
```

# スクリプト

ChatGPT プロンプト
```
「日本で購入可能な主要なETFを過去1ヶ月の株価変動率が高い順に並べ、
RSI, SPYとの相関係数、年間リターンも含めて、
それらの値も表示するようなPythonスクリプトを作成してください。
Tickerなどのラベルは１行目だけに出力して、データを見やすくしてください。」
```

でてきたスクリプトがこれ
```
pip install yfinance pandas ta
```

``` python:etf.py
import yfinance as yf
import pandas as pd
from ta.momentum import RSIIndicator

# 日本で購入可能なETFのティッカーシンボルリスト
japan_etf_tickers = [
    'SPY', 'IVV', 'VOO', 'QQQ', 'VTI',
    'XLK', 'XLV', 'XLF', 'XLE', 'XLY', 'XLI', 'XLB', 'XLRE', 'XLC', 'XLU',
    'AGG', 'BND', 'TLT', 'LQD',
    'VEA', 'VWO', 'EFA', 'IEMG', 'ACWI',
    'GLD', 'SLV', 'USO', 'DBA',
    'VNQ', 'SCHX', 'IWM', 'DIA', 'GDX',
    'EWJ', 'DXJ', 'HEWJ', 'JPXN', 'FLJP'
]

# ETFのデータフレームを初期化
etf_data = pd.DataFrame(columns=['Ticker', 'PriceChange', 'RSI', 'Correlation', 'AnnualizedReturn'])

# データを一時的に格納するリスト
temp_data = []

for ticker in japan_etf_tickers:
    etf = yf.Ticker(ticker)

    # 過去1ヶ月の株価データを取得
    hist = etf.history(period='1mo')
    if not hist.empty:
        price_change = (hist['Close'][-1] - hist['Close'][0]) / hist['Close'][0]

        # RSIの計算
        rsi_indicator = RSIIndicator(hist['Close'])
        rsi = rsi_indicator.rsi().iloc[-1]  # 最新のRSI値を取得
        
        # S&P 500 (SPY)との相関係数を計算
        spy_hist = yf.Ticker('SPY').history(period='1mo')['Close']
        combined = pd.concat([hist['Close'], spy_hist], axis=1, join='inner').dropna()
        correlation = combined.corr().iloc[0, 1]
        
        # 年間リターンの計算（過去1年のデータを使用）
        hist_1y = etf.history(period='1y')
        if not hist_1y.empty:
            annual_return = (hist_1y['Close'][-1] / hist_1y['Close'][0]) ** (1/1) - 1
        else:
            annual_return = None
    else:
        price_change = None
        rsi = None
        correlation = None
        annual_return = None
    
    temp_data.append({
        'Ticker': ticker,
        'PriceChange': price_change,
        'RSI': rsi,
        'Correlation': correlation,
        'AnnualizedReturn': annual_return
    })

# リストからデータフレームを作成
etf_data = pd.DataFrame(temp_data)

# 株価変動率が高い順にソート
etf_data_sorted = etf_data.sort_values(by='PriceChange', ascending=False)

# ティッカーシンボルとそれらの値を出力
print("Ticker, PriceChange, RSI, Correlation, AnnualizedReturn")
for index, row in etf_data_sorted.iterrows():
    price_change_str = 'N/A' if row['PriceChange'] is None else f'{row["PriceChange"]:.2%}'
    rsi_str = 'N/A' if row['RSI'] is None else f'{row["RSI"]:.2f}'
    correlation_str = 'N/A' if row['Correlation'] is None else f'{row["Correlation"]:.2f}'
    annual_return_str = 'N/A' if row['AnnualizedReturn'] is None else f'{row["AnnualizedReturn"]:.2%}'
    print(f"{row['Ticker']}, {price_change_str}, {rsi_str}, {correlation_str}, {annual_return_str}")

```

# 出力（2024.06.01時点での結果）
```
Ticker, PriceChange, RSI, Correlation, AnnualizedReturn
SLV, 14.38%, 57.55, 0.86, 26.47%
XLK, 8.18%, 57.65, 0.97, 27.67%
XLU, 7.72%, 65.90, 0.92, 16.70%
QQQ, 6.92%, 62.00, 0.97, 28.89%
XLC, 5.96%, 69.17, 0.97, 33.22%
GDX, 5.94%, 52.44, 0.86, 12.09%
DBA, 5.41%, 63.92, 0.23, 26.58%
SPY, 5.40%, 63.42, 1.00, 26.83%
IVV, 5.39%, 63.26, 1.00, 26.94%
VOO, 5.37%, 63.13, 1.00, 26.94%
EFA, 5.29%, 61.67, 0.95, 16.71%
XLRE, 5.08%, 58.72, 0.72, 9.29%
VTI, 5.02%, 61.12, 1.00, 26.38%
SCHX, 4.99%, 60.49, 1.00, 27.00%
ACWI, 4.85%, 61.01, 0.99, 22.19%
IWM, 4.82%, 56.56, 0.85, 18.76%
VEA, 4.79%, 59.80, 0.93, 15.88%
VNQ, 4.52%, 57.69, 0.68, 8.46%
XLF, 3.17%, 55.16, 0.78, 32.03%
HEWJ, 3.02%, 61.04, 0.71, 37.99%
DXJ, 2.94%, 60.91, 0.62, 48.93%
EWJ, 2.77%, 56.07, 0.22, 15.76%
JPXN, 2.74%, 55.97, 0.24, 15.58%
XLB, 2.74%, 56.11, 0.76, 22.87%
FLJP, 2.67%, 55.94, 0.15, 15.72%
DIA, 2.43%, 48.08, 0.71, 19.29%
XLV, 2.22%, 53.05, 0.81, 13.51%
TLT, 2.13%, 51.85, 0.75, -9.20%
VWO, 2.04%, 40.92, 0.79, 12.41%
XLI, 1.89%, 50.31, 0.55, 28.02%
LQD, 1.79%, 56.57, 0.78, 3.40%
IEMG, 1.74%, 38.75, 0.76, 11.88%
BND, 1.32%, 55.92, 0.78, 1.16%
AGG, 1.31%, 55.67, 0.77, 0.71%
XLE, 1.27%, 53.70, 0.15, 24.32%
XLY, 0.83%, 49.01, 0.02, 15.61%
GLD, 0.71%, 45.29, 0.72, 17.16%
USO, -1.46%, 44.05, 0.15, 19.62%
```

<details><summary>Ticker対応表</summary>

```
米国株式市場に連動するETF:
SPY: SPDR S&P 500 ETF Trust
IVV: iShares Core S&P 500 ETF
VOO: Vanguard S&P 500 ETF
QQQ: Invesco QQQ Trust
VTI: Vanguard Total Stock Market ETF

セクター別のETF:
XLK: Technology Select Sector SPDR Fund
XLV: Health Care Select Sector SPDR Fund
XLF: Financial Select Sector SPDR Fund
XLE: Energy Select Sector SPDR Fund
XLY: Consumer Discretionary Select Sector SPDR Fund
XLI: Industrial Select Sector SPDR Fund
XLB: Materials Select Sector SPDR Fund
XLRE: Real Estate Select Sector SPDR Fund
XLC: Communication Services Select Sector SPDR Fund
XLU: Utilities Select Sector SPDR Fund

債券ETF:
AGG: iShares Core U.S. Aggregate Bond ETF
BND: Vanguard Total Bond Market ETF
TLT: iShares 20+ Year Treasury Bond ETF
LQD: iShares iBoxx $ Investment Grade Corporate Bond ETF

国際株式ETF:
VEA: Vanguard FTSE Developed Markets ETF
VWO: Vanguard FTSE Emerging Markets ETF
EFA: iShares MSCI EAFE ETF
IEMG: iShares Core MSCI Emerging Markets ETF
ACWI: iShares MSCI ACWI ETF

コモディティETF:
GLD: SPDR Gold Shares
SLV: iShares Silver Trust
USO: United States Oil Fund
DBA: Invesco DB Agriculture Fund

その他ETF:
VNQ: Vanguard Real Estate ETF
SCHX: Schwab U.S. Large-Cap ETF
IWM: iShares Russell 2000 ETF
DIA: SPDR Dow Jones Industrial Average ETF Trust
GDX: VanEck Vectors Gold Miners ETF

日本市場に関連するETF:
EWJ: iShares MSCI Japan ETF
DXJ: WisdomTree Japan Hedged Equity Fund
HEWJ: iShares Currency Hedged MSCI Japan ETF
JPXN: iShares JPX-Nikkei 400 ETF
FLJP: Franklin FTSE Japan ETF
```
</details>

# 考察
- １ヶ月の値上がりが高いものに狙いをつける
- RSIが高すぎると「買われすぎ」なので、気をつける
- Correlationが高いのはSPY500と結局同じなので、分散投資を目指すなら値が低いものを選ぶ
- 念の為１年間のリターンが著しく低いのは避ける

そんな感じの考えで動画で紹介されているローテーション戦略とかしてみたらどうかなって思っています。どうなのかな、儲かるのかな？判断基準が明確なら、自動売買するスクリプトとかも作れるのかもしれない。