Investment Analysis Framework

/* === FRAMEWORK MAP === */ .fw-wrapper{max-width:760px;margin:0 auto 48px;} .fw-map{display:grid;grid-template-columns:1fr 1fr;gap:12px 20px;} .fw-map-top{grid-column:1/-1;display:flex;justify-content:center;} .fw-map-bot{grid-column:1/-1;display:flex;justify-content:center;} .fw-map-bot2{grid-column:1/-1;display:flex;justify-content:center;} .fw-arrow-row{grid-column:1/-1;text-align:center;font-size:22px;color:#ccc;line-height:1;margin:2px 0;} .fw-node{background:#fff;border:2px solid #dde4ee;border-radius:10px;padding:14px 16px;cursor:pointer;transition:border-color .2s,box-shadow .2s;max-width:340px;width:100%;box-sizing:border-box;} .fw-node:hover{border-color:#1e3a5f;box-shadow:0 4px 14px rgba(30,58,95,.1);} .fw-title{font-size:13px;font-weight:700;color:#1e3a5f;text-transform:uppercase;letter-spacing:.5px;margin-bottom:6px;} .fw-badge{font-size:12px;font-weight:700;padding:2px 9px;border-radius:20px;display:inline-block;margin-bottom:7px;} .sig-amber{background:#fff3cd;color:#92610a;} .sig-red{background:#fde8e8;color:#8b1c1c;} .sig-green{background:#d4f5e2;color:#14532d;} .fw-metric{font-size:12px;color:#666;margin-bottom:8px;} .fw-expand{font-size:11px;color:#1e3a5f;background:#eef2fa;border:none;border-radius:4px;padding:3px 10px;cursor:pointer;font-family:Arial,sans-serif;} .fw-detail{display:none;margin-top:10px;border-top:1px solid #eef;padding-top:10px;} .fw-detail.open{display:block;} .fw-detail ul{margin:0 0 8px;padding-left:18px;font-size:12px;color:#333;line-height:1.65;} .fw-detail li{margin-bottom:4px;} .fw-detail a{font-size:11px;color:#0073aa;text-decoration:none;display:inline-block;margin-right:10px;margin-top:2px;} .fw-detail a:hover{text-decoration:underline;} /* === QUIZ === */ .quiz-wrap{max-width:660px;margin:0 auto;} .quiz-card{background:#fff;border:2px solid #dde4ee;border-radius:10px;padding:28px 30px;} .quiz-hdr{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:18px;flex-wrap:wrap;gap:8px;} .quiz-hdrtitle{font-size:20px;font-weight:700;color:#1e3a5f;} .quiz-streak{font-size:14px;font-weight:700;color:#f59e0b;} .quiz-pillar{font-size:11px;text-transform:uppercase;letter-spacing:1px;color:#999;margin-bottom:8px;} .quiz-q{font-size:16px;font-weight:700;color:#1a1a1a;margin-bottom:18px;line-height:1.5;} .quiz-opt label{display:block;padding:10px 14px;margin-bottom:8px;border:1.5px solid #dde4ee;border-radius:7px;cursor:pointer;font-size:14px;color:#333;transition:border-color .15s,background .15s;} .quiz-opt label:hover{border-color:#1e3a5f;background:#f4f7ff;} .quiz-opt input{margin-right:8px;} .quiz-btn{margin-top:16px;background:#1e3a5f;color:#fff;border:none;border-radius:7px;padding:10px 28px;font-size:14px;font-weight:700;cursor:pointer;font-family:Arial,sans-serif;} .quiz-btn:hover{background:#2c4e7d;} .quiz-result{display:none;margin-top:18px;padding:14px 18px;border-radius:8px;font-size:14px;line-height:1.6;} .quiz-result.ok{background:#d4f5e2;border:1.5px solid #22c55e;color:#14532d;} .quiz-result.err{background:#fde8e8;border:1.5px solid #ef4444;color:#7f1d1d;} .quiz-result a{color:inherit;font-weight:700;} .quiz-done{display:none;margin-top:14px;padding:12px 16px;background:#f0f4fa;border-radius:8px;font-size:13px;color:#666;text-align:center;} @media(max-width:600px){ .fw-map{grid-template-columns:1fr;} .fw-map-top,.fw-map-bot,.fw-map-bot2{justify-content:stretch;} .fw-node{max-width:100%;} .quiz-card{padding:18px 16px;} .quiz-q{font-size:14px;} }

Five interconnected analytical pillars form the investment framework behind this site. Macro regime sets the context, valuation sets the floor, momentum flags the timing, earnings quality filters the picks, and risk sizing determines how much to commit. Click any node to see the current signal and key insights.

The Five Pillars — May 2026 Signals

Click any pillar to expand · Signals updated monthly

📊 Macro Regime
🟡 Late Cycle
Score: +1/4 · Yield curve ~+0.4%
  • Yield curve ~+0.4% (T10Y2Y) — cautiously positive; 10Y at 4.38%, 30Y briefly topped 5% on May 4
  • Unemployment 4.3% (April); +115K payrolls beat vs. 55K expected; participation rate 61.8% (lowest since Oct 2021)
  • Fed held 3.50–3.75% at April 29 FOMC with historic 8–4 dissent — first 4-member dissent since Oct 1992; Powell term expires May 15; hike is a live H2 2026 scenario
→ Build the detector (Python + FRED) → 2025 economic analysis
↙                                   ↘
💰 Valuation
🔴 Cautious
CAPE ~40 · Fwd P/E ~21x
  • CAPE ~40.1x — approaching dot-com era highs and 2.5× the long-run median of 16x; implies sub-3% 10-year real equity returns
  • Fwd P/E ~21.0x vs. 10-yr avg 18.9x; CY2026 EPS +21% projected (FactSet) — market pricing near-perfection
  • Quality screen favours fwd P/E <25 + FCF yield >3% in this environment
→ Stock valuation framework → AI vs. fundamental analysis
📈 Momentum
🟡 Mixed
SPY near ATH · AI mega-cap leading
  • SPY near all-time highs after +5% YTD recovery; 200d MA clearly intact — framework green-lights large-cap momentum scanning
  • Recovery is AI-led and narrow; small/mid-cap momentum still diverging — framework directs focus to S&P 500 mega-cap universe
  • Composite 3/6/12-month score strongly positive for AI/hyperscaler names; equal-weight S&P 500 still mixed; US Manufacturing PMI in new-order contraction
→ Build the momentum scanner
↘                                   ↙
📋 Earnings Quality
🟡 Watch
HY spreads elevated · Q1 hyperscalers: strong
  • Q1 2026 hyperscaler earnings: Microsoft $30.88B capex (+84% YoY), Amazon $44.2B, Alphabet $35.67B — AI sector earnings quality confirmed high
  • Broad S&P 500 accruals still elevated outside AI sector; cash conversion below 0.9 in import-heavy and consumer discretionary names
  • HY credit spreads elevated amid Iran/Middle East tensions — confirms late-cycle read; tariff pass-through threatens non-AI sector margins in H2 2026
→ Build the earnings quality tool
⚖️ Risk & Sizing
🔴 Elevated
VIX moderating · CAPE ~40x tail risk
  • Monte Carlo VaR elevated: CAPE ~40x, Iran/Middle East uncertainty, and April CPI (due May 12) create asymmetric downside tail risk
  • VIX moderated with S&P recovery; framework allows partial re-entry — caution still warranted given CAPE ~40x and new Fed Chair (May 15) rate path uncertainty
  • RL allocation model: AI/mega-cap weights likely drifted >5% above target after the recovery — review and trim to rebalance
→ Run a Monte Carlo stress-test → RL allocation framework

Today’s Framework Question

One question per day, rotating through all five pillars

Daily Quiz
✅ You already answered today. Come back tomorrow for a new question!

30-question bank · Date-seeded daily rotation · Streak tracked in your browser

(function(){ window.fwToggle=function(id){var d=document.getElementById(‘det-‘+id);var b=document.getElementById(‘btn-‘+id);if(!d)return;var o=d.classList.contains(‘open’);d.classList.toggle(‘open’,!o);if(b)b.textContent=o?’▼ Expand’:’▲ Collapse’;}; var Q=[ {p:’Macro Regime’,q:’A T10Y2Y yield spread turning negative typically precedes recession by how long?’,o:[‘3–6 months’,’12–18 months’,’24–36 months’,’It has no predictive value’],a:1,e:’Yield curve inversion precedes recessions by roughly 12–18 months on average — reliable but early, which is why the framework pairs it with concurrent indicators like HY spreads.’,l:’/macro-regime-detector-python-fred-api/’}, {p:’Macro Regime’,q:’In the FRED macro regime model, which indicator is most concurrent (least lagging)?’,o:[‘Unemployment rate’,’10Y–2Y yield spread’,’HY credit spreads’,’ISM Manufacturing PMI’],a:2,e:’HY credit spreads react quickly to changing risk appetite and are considered concurrent. Unemployment is a classic lagging indicator; the yield curve is leading.’,l:’/macro-regime-detector-python-fred-api/’}, {p:’Macro Regime’,q:’If the composite regime score drops from +2 to −1 in one quarter, what does the framework suggest?’,o:[‘Stay fully invested’,’Trim equity 10–15% and shorten bond duration’,’Move entirely to cash’,’Double down — contrarian signal’],a:1,e:’A 3-point shift in a single quarter signals a regime transition. The framework prescribes trimming equity 10–15% and shortening bond duration as a measured, reversible defensive step.’,l:’/macro-regime-detector-python-fred-api/’}, {p:’Macro Regime’,q:’Which FRED series code represents the 10Y–2Y Treasury yield spread?’,o:[‘T10Y2Y’,’DGS10′,’FEDFUNDS’,’BAMLH0A0HYM2′],a:0,e:’T10Y2Y is the FRED series for the 10-Year minus 2-Year Treasury spread — the core yield curve inversion indicator used in the regime detector.’,l:’/macro-regime-detector-python-fred-api/’}, {p:’Macro Regime’,q:’Late-cycle macro regime typically shows which combination?’,o:[‘Inverted yield curve + falling unemployment + tight spreads’,’Steep yield curve + rising unemployment + wide spreads’,’Flat/slightly steep yield curve + stable unemployment + widening spreads’,’Deep recession + zero rates + QE’],a:2,e:’Late cycle: yield curve returning from inversion, unemployment still low but plateauing, credit spreads beginning to widen — exactly the May 2026 profile.’,l:’/macro-regime-detector-python-fred-api/’}, {p:’Macro Regime’,q:’What is the primary advantage of using a composite score over a single indicator?’,o:[‘It is more complex’,’It reduces false signals from any one noisy indicator’,’It always gives earlier signals’,’It eliminates qualitative judgment’],a:1,e:’No single indicator is reliable in isolation. Compositing 4–5 signals reduces false positives and smooths out noise in individual series.’,l:’/macro-regime-detector-python-fred-api/’}, {p:’Valuation’,q:’CAPE above 30 has historically been associated with what forward 10-year equity return?’,o:[‘Above 10% annualised’,’7–9% annualised’,’Below 5% annualised’,’Negative returns’],a:2,e:”Shiller’s data shows CAPE above 30 is associated with below-5% annualised 10-year real returns. At CAPE ~40, implied forward returns are very modest.”,l:’/stock-valuation-guide/’}, {p:’Valuation’,q:’A stock has fwd P/E 35x and FCF yield 1.2%. What does the framework say?’,o:[‘Strong buy’,’Avoid unless exceptional growth thesis’,’Hold — monitor revisions’,’Neutral — P/E is inconclusive’],a:1,e:’The framework requires BOTH fwd P/E below threshold AND FCF yield above ~3%. At 35x P/E and 1.2% FCF yield, the stock fails both tests.’,l:’/stock-valuation-guide/’}, {p:’Valuation’,q:’What does an accruals ratio above +0.05 suggest about reported earnings?’,o:[‘Earnings are highly cash-backed’,’Earnings are driven by accounting items, not cash’,’The company is rapidly growing’,’Margins are expanding’],a:1,e:’A ratio above +0.05 means earnings are being supported by non-cash accruals — a red flag that results may reverse.’,l:’/earnings-quality-analyzer-python-sec-edgar/’}, {p:’Valuation’,q:’Fwd P/E ~21x vs. 10-year average ~19x implies what about current valuations?’,o:[‘Markets are undervalued’,’Markets are fairly valued’,’Markets are pricing in above-average earnings growth’,’Markets are in a bubble’],a:2,e:’At a premium to historical average, the market prices in above-average earnings growth. If growth disappoints, multiple compression is the primary risk.’,l:’/stock-valuation-guide/’}, {p:’Valuation’,q:’Which valuation metric is most useful for comparing companies across capital structures?’,o:[‘P/E ratio’,’Price-to-book’,’EV/EBITDA’,’Dividend yield’],a:2,e:’EV/EBITDA uses enterprise value (includes debt) and pre-interest earnings, making it capital-structure neutral. P/E is affected by leverage.’,l:’/stock-valuation-guide/’}, {p:’Valuation’,q:’FCF yield is calculated as:’,o:[‘Net income ÷ market cap’,’Free cash flow ÷ enterprise value’,’Free cash flow ÷ market cap’,’Operating income ÷ revenue’],a:2,e:’FCF yield = Free Cash Flow ÷ Market Cap — the cash equivalent of a bond yield. Higher is generally better as a quality and value signal.’,l:’/stock-valuation-guide/’}, {p:’Momentum’,q:’The composite 3/6/12-month momentum signal reduces what type of risk vs. single-period momentum?’,o:[‘Market risk’,’Currency risk’,’Noise and false signals’,’Liquidity risk’],a:2,e:’Using three lookback periods ensures a stock shows persistent momentum across multiple timeframes — not just a recent spike.’,l:’/python-stock-momentum-scanner-free/’}, {p:’Momentum’,q:’According to the framework, when should you skip the momentum scanner entirely?’,o:[‘When VIX is below 15′,’When SPY is below its 200-day moving average’,’When interest rates are rising’,’When earnings season begins’],a:1,e:’Momentum is only valid in uptrending markets. When SPY is below its 200-day MA, individual signals are unreliable with too many false positives.’,l:’/python-stock-momentum-scanner-free/’}, {p:’Momentum’,q:’Why is a hard drawdown stop of −15% important in a momentum strategy?’,o:[‘It limits upside’,’It prevents momentum stocks from compounding losses if the thesis breaks’,’It is required by regulation’,’It improves average returns across all positions’],a:1,e:’Momentum stocks reverse sharply when sentiment shifts. A −15% stop limits downside on any single position, preventing one bad pick from dominating negative returns.’,l:’/python-stock-momentum-scanner-free/’}, {p:’Momentum’,q:’yfinance returns adjusted closing prices. Why does this matter for momentum calculations?’,o:[‘It inflates momentum scores’,’It accounts for dividends and splits, giving accurate historical returns’,’It removes volatility’,’It only affects intraday data’],a:1,e:’Adjusted prices account for splits and dividends so the calculated return reflects what an investor actually earned. Unadjusted prices create artificial gaps.’,l:’/python-stock-momentum-scanner-free/’}, {p:’Momentum’,q:’In the momentum scanner, why filter to S&P 500 constituents only?’,o:[‘They are always better investments’,’Reduces survivorship bias vs. small caps’,’Limits liquidity risk and avoids micro-cap noise’,’Both (b) and (c)’],a:2,e:’S&P 500 stocks are liquid, well-covered, and avoid micro-cap issues like wide bid-ask spreads and extreme volatility that distort signals.’,l:’/python-stock-momentum-scanner-free/’}, {p:’Momentum’,q:’Running the momentum scanner monthly rather than daily is recommended primarily to:’,o:[‘Reduce server costs’,’Limit overtrading and transaction costs’,’Increase number of signals’,’Match earnings frequency’],a:1,e:’Momentum is a medium-term phenomenon. Daily rebalancing creates excessive turnover and transaction costs that erode returns.’,l:’/python-stock-momentum-scanner-free/’}, {p:’Earnings Quality’,q:’Cash conversion ratio below 0.80 means:’,o:[‘Company generates $1.20 cash per $1 net income’,’Less than 80¢ of cash per $1 of reported net income’,’Company converts 80% of revenue to cash’,’Cash flow statement has errors’],a:1,e:’Cash conversion = CFO ÷ Net Income. Below 0.80 means reported earnings are running ahead of actual cash collected — a warning sign.’,l:’/earnings-quality-analyzer-python-sec-edgar/’}, {p:’Earnings Quality’,q:’The Sloan Accrual Anomaly shows that high-accrual companies tend to:’,o:[‘Outperform low-accrual peers over 1–3 years’,’Underperform low-accrual peers over the following 1–3 years’,’Show higher dividend growth’,’Trade at lower P/E multiples immediately’],a:1,e:”Sloan’s 1996 paper showed high-accrual firms systematically underperform over 1–3 years as accruals reverse and earnings disappoint.”,l:’/earnings-quality-analyzer-python-sec-edgar/’}, {p:’Earnings Quality’,q:’SEC EDGAR XBRL data is used in the earnings quality tool because:’,o:[‘It is the only source of financial data’,’It provides structured, machine-readable financial statements for free’,’It is faster than Bloomberg’,’XBRL data is audited separately’],a:1,e:”SEC EDGAR’s XBRL API provides free, structured access to financial statements for all US public companies. No API key needed.”,l:’/earnings-quality-analyzer-python-sec-edgar/’}, {p:’Earnings Quality’,q:’Before buying after an earnings beat, the framework says to check the accruals ratio. Why?’,o:[‘To confirm the beat was fully cash-backed’,’To determine if the CEO sold shares’,’To verify dividend sustainability’,’To check S&P 500 membership’],a:0,e:’An earnings beat driven by accruals (not cash) is lower quality and less likely to persist. Accruals ratio above +0.05 is a reason for caution.’,l:’/earnings-quality-analyzer-python-sec-edgar/’}, {p:’Earnings Quality’,q:’Cash conversion consistently above 1.1 means:’,o:[‘Company is over-investing in working capital’,’Company generates more cash than it reports as net income — high quality’,’The income statement has errors’,’Revenue recognition is being deferred’],a:1,e:’A ratio above 1.0 means more operating cash than net income — often conservative accounting or favourable working capital dynamics. A strong quality signal.’,l:’/earnings-quality-analyzer-python-sec-edgar/’}, {p:’Earnings Quality’,q:’Why run the earnings quality screen quarterly rather than after every release?’,o:[‘EDGAR only updates annually’,’Quarterly cadence matches the filing cycle and avoids single-quarter noise’,’Accruals only compound over multiple quarters’,’Daily data is unavailable’],a:1,e:’One quarter of high accruals may be noise. Running quarterly and looking for persistence across 2–3 quarters gives more reliable signals.’,l:’/earnings-quality-analyzer-python-sec-edgar/’}, {p:’Risk & Sizing’,q:’VaR 95% of −18% on a $100,000 portfolio means:’,o:[‘You will lose exactly $18,000 next year’,’In 95% of scenarios losses will exceed $18,000′,’In a bad-but-not-catastrophic year, expect to lose at least $18,000′,’There is a 95% chance of gaining money’],a:2,e:’VaR 95%: in 5% of simulated scenarios (the worst outcomes), losses exceed this threshold — the loss level you should be financially and emotionally prepared for.’,l:’/monte-carlo-portfolio-stress-test-python/’}, {p:’Risk & Sizing’,q:’In an RL allocation model, why apply a ±5% drift threshold before trading?’,o:[‘To satisfy SEC reporting requirements’,’To reduce transaction costs from overtrading on small signals’,’To match quarterly earnings reporting’,’To limit position size to 5%’],a:1,e:’The model generates continuous signals, but acting on every small shift incurs transaction costs. Only rebalancing when drift exceeds 5% filters noise and keeps costs low.’,l:’/reinforcement-learning-for-asset-allocation/’}, {p:’Risk & Sizing’,q:’In Monte Carlo simulation, which input most affects the VaR output?’,o:[‘Number of simulations (1,000 vs. 10,000)’,’Assumed correlation between assets’,’Assumed annual return (mu)’,’Time horizon’],a:1,e:’Asset correlations dominate — especially during stress when correlations spike toward 1.0, destroying diversification. Low stable correlation assumptions understate tail risk.’,l:’/monte-carlo-portfolio-stress-test-python/’}, {p:’Risk & Sizing’,q:’If your Monte Carlo VaR is larger than you can emotionally tolerate, the framework suggests:’,o:[‘Switch entirely to cash’,’Add leverage to improve expected returns’,’Shift 10–15% to short-duration bonds or cash before a downturn hits’,’Ignore it — VaR is just a model’],a:2,e:’The time to reduce risk is before volatility strikes, not during. Shifting 10–15% to bonds or cash is a measured, reversible de-risk.’,l:’/monte-carlo-portfolio-stress-test-python/’}, {p:’Risk & Sizing’,q:’Why is out-of-sample validation critical before deploying an RL allocation model with real capital?’,o:[‘Regulators require it’,’The model may be overfit to historical patterns that will not repeat’,’It reduces computation time’,’Out-of-sample data is more accurate’],a:1,e:’RL models can overfit to specific return patterns in training data. Validating on 2–3 unseen years tests whether the learned policy generalises.’,l:’/reinforcement-learning-for-asset-allocation/’}, {p:’Risk & Sizing’,q:’When VIX is above 25, the momentum framework says to:’,o:[‘Run the scanner more frequently’,’Skip or cut momentum position sizes by at least half’,’Increase equity allocation — fear creates value’,’Switch entirely to bonds’],a:1,e:’High VIX means elevated volatility and fragile momentum signals. Skip new entries or cut position sizes by half — the momentum factor historically underperforms in high-VIX regimes.’,l:’/python-stock-momentum-scanner-free/’} ]; var dayIdx=Math.floor(Date.now()/86400000)%30; var q=Q[dayIdx]; var todayStr=new Date().toDateString(); function getStreak(){var s=parseInt(localStorage.getItem(‘fwStreak’)||’0′);var last=localStorage.getItem(‘fwDate’);var yest=new Date(Date.now()-86400000).toDateString();if(last!==yest&&last!==todayStr){s=0;localStorage.setItem(‘fwStreak’,’0′);}return s;} function showStreak(){var s=getStreak();var el=document.getElementById(‘streak-el’);if(el)el.textContent=s>0?(‘🔥 ‘+s+’ day’+(s!==1?’s’:”)+’ streak’):”;} function renderQ(){document.getElementById(‘q-pillar’).textContent=q.p;document.getElementById(‘q-text’).innerHTML=q.q;var h=”;for(var i=0;i<q.o.length;i++){h+='‘;}document.getElementById(‘q-opts’).innerHTML=h;} function showAnswered(ok){document.getElementById(‘q-btn’).style.display=’none’;document.getElementById(‘q-done’).style.display=’block’;var r=document.getElementById(‘q-result’);r.style.display=’block’;r.className=’quiz-result ‘+(ok?’ok’:’err’);r.innerHTML=(ok?’✅ Correct! ‘:(‘❌ The answer is: ‘+q.o[q.a]+’. ‘))+q.e+’ Read more →‘;document.querySelectorAll(‘#q-opts input’).forEach(function(i){i.disabled=true;});} window.quizSubmit=function(){var sel=document.querySelector(‘#q-opts input:checked’);if(!sel){alert(‘Please select an answer first.’);return;}var v=parseInt(sel.value);var ok=v===q.a;var s=getStreak();var last=localStorage.getItem(‘fwDate’);var yest=new Date(Date.now()-86400000).toDateString();if(ok){s=(last===yest)?s+1:1;localStorage.setItem(‘fwStreak’,s);}localStorage.setItem(‘fwDate’,todayStr);localStorage.setItem(‘fwCorrect’,ok?’1′:’0′);showStreak();showAnswered(ok);}; showStreak();renderQ(); if(localStorage.getItem(‘fwDate’)===todayStr){showAnswered(localStorage.getItem(‘fwCorrect’)===’1′);} })();