Pairwise Correlation Matrix
Correlation Pairs Summary
Market Regime Timeline & Portfolio Cumulative Return
Regime Distribution
Per-Regime Statistics
Current Factor Exposures (with 95% CI)
Rolling Factor Exposures (252-day window)
Factor Descriptions
Return Distribution
Rolling 12-Month Maximum Drawdown
Worst 10 Drawdown Days — Contribution by Holding
Stress-Period Correlations by Instrument
Volatility Reduction at 10% / 20% Allocation
Hedge Effectiveness Table — Historically Observed Offsets
Cumulative Return — Portfolio vs STI ETF (ES3.SI)
Active Return vs Benchmark
Rolling 12-Month Return — Portfolio vs Benchmark
Calendar Year Returns
Statistics — Portfolio vs STI ETF (ES3.SI)
Market & Price Data
All price data is fetched at runtime from Yahoo Finance via the open-source
yfinance library.
Data is daily adjusted closing prices. Corporate action adjustments (splits, dividends) are
applied by Yahoo Finance automatically but may be incomplete for less liquid SGX names.
| Ticker | Name | Used In | Notes |
|---|---|---|---|
| .SI tickers | Portfolio holdings (user-defined) | All modules | SGX-listed equities; prices in SGD |
| ES3.SI | SPDR STI ETF (Straits Times Index) | Regimes, Factors, Benchmark, Hedging | Used as the SGX market benchmark throughout |
| SGDUSD=X | USD/SGD spot rate | Factors, Hedging (Gold) | Yahoo Finance FX rate; used for FX sensitivity factor and Gold SGD conversion |
| GC=F | Gold Futures (COMEX front-month) | Hedging Offsets | USD-denominated; converted to SGD terms using SGDUSD=X for hedging analysis |
| AAXJ | iShares MSCI All Country Asia ex Japan ETF | Hedging Offsets | Used as a regional diversification / hedging candidate |
| AXJR | iShares Asia ex Japan REIT ETF | Hedging Offsets | Frequently unavailable via Yahoo Finance; omitted from hedging results when data fails |
SGD Interest Rate Proxy (SORA)
The Factor Exposure module uses a SGD interest rate proxy as a third factor alongside market beta and FX sensitivity. The proxy is sourced via a waterfall of fallbacks tried in order at runtime. The first source that returns valid data is used.
| Source (priority order) | Ticker | Type | Availability |
|---|---|---|---|
| 1 — SGS 2Y Bond Yield | 2YY=R | Yield level (Reuters format) | Frequently unavailable on Yahoo Finance (404) |
| 2 — SGS 10Y Bond Yield | SG10YT=RR | Yield level (Reuters format) | Frequently unavailable on Yahoo Finance (404) |
| 3 — iShares Asia IG Bond ETF | A35.SI | SGX-listed bond ETF price | Reliably available; current active fallback |
| 4 — US 3M T-Bill (last resort) | ^IRX | Yield level | Backup only; logs a console warning when used |
Sign convention: Each series is differentiated (pct_change) and sign-adjusted so that a positive regressor value means rates are rising. A35.SI moves inversely to rates (bond price rises as yields fall), so its return is multiplied by −1 before use. A positive SGD Rate Sensitivity coefficient therefore means the portfolio benefits when rates rise; a negative coefficient means it is hurt.
Limitation: A35.SI is an investment-grade Asian bond ETF, not a pure SGD rate instrument. Its price reflects credit spreads, duration of its holdings, and USD/SGD translation, not just the SORA overnight rate. It is a reasonable directional proxy for rate sensitivity but should not be read as a precise SORA beta. For production use, connect directly to the MAS SORA daily fixings API.
AI Interpretations
Each module's AI narrative is generated by the Anthropic Claude API (claude-sonnet-4-6). The model receives the quantitative output of that module and is prompted to interpret the numbers in plain English for a Singapore-focused equity portfolio context. AI text is generated on demand and is not cached between sessions.
Limitation: Claude has a knowledge cutoff and does not have access to live news, earnings releases, or MAS regulatory announcements. Interpretations reflect historical statistical patterns only. They should not be treated as forward-looking analysis or investment advice.
Construction Scenarios
The Construction Scenarios module runs a two-pass engine against a universe of 50 SGX names (STI 30 + approximately 20 next by market cap). Price data for the full universe is fetched separately using 3 years of daily closes at startup. Optimisation objectives are Maximum Sharpe, Minimum Volatility, and CVaR minimisation, all solved with pure NumPy (no scipy/statsmodels).
Limitation: Optimised weights are derived entirely from historical returns and covariances. Transaction costs, bid-ask spreads, SGX lot sizes, and forward-looking views are not incorporated. The engine does not account for holding-period restrictions, withholding tax on REIT distributions, or SGX-specific corporate governance risks. Do not use output weights directly for live trading.
Known Data Limitations
- Yahoo Finance is not a licensed data provider. Data may be delayed (15–20 min intraday), have gaps on Singapore public holidays, or be silently stale. For institutional production use, replace yfinance with SGX DataConnect, Refinitiv, or Bloomberg.
- SGS bond yield tickers (2YY=R, SG10YT=RR) are unreliable. Yahoo Finance often returns 404 for Reuters-format SGS yield tickers; the app falls back to A35.SI automatically but logs which source was used.
- AXJR is frequently delisted / unavailable on Yahoo Finance. It is silently skipped in Hedging Offsets when data cannot be fetched.
- Adjusted close prices are adjusted for splits and dividends by Yahoo Finance, but accuracy varies — especially for SGX counters with complex dividend histories or rights issues.
- Gold (GC=F) is COMEX front-month USD futures. Roll costs and basis between spot and front-month are not modelled. The SGD conversion uses a daily FX rate, not the specific settlement convention of each contract.
- All analyses use calendar-day aligned daily closes. SGX and US market holiday calendars differ; on US-only holidays, SGDUSD=X and GC=F may have gaps that are forward-filled (up to 5 days).
- Rolling OLS window (252 days) means the first ~12 months of data produce no rolling factor estimates. For short analysis periods (1Y), the rolling chart will have very few or no data points.