Stock Evaluator
Comprehensive evaluation of potential stock investments combining valuation analysis, fundamental research, technical assessment, and clear buy/hold/sell recommendations. Use when the user asks about
Comprehensive evaluation of potential stock investments combining valuation analysis, fundamental research, technical assessment, and clear buy/hold/sell recommendations. Use when the user asks about
Real data. Real impact.
Emerging
Developers
Per week
Open source
Skills give you superpowers. Install in 30 seconds.
Every analysis MUST include ALL of these:
If you cannot complete any item, STOP and ask for clarification.
NEVER fabricate, estimate, or hallucinate ANY numeric data point. Every metric in the dashboard MUST come from:
If data cannot be found → Use "N/A" or "--"
You MUST perform these searches before populating the dashboard:
| Search # | Query Template | Data Retrieved |
|---|---|---|
| 1 | "[TICKER] stock price market cap P/E ratio" | Price, Market Cap, P/E |
| 2 | "[TICKER] ROE ROA profit margin 2024 annual report" | Financial ratios |
| 3 | "[TICKER] revenue growth earnings growth FY2024" | Growth rates (REPORTED) |
| 4 | "[TICKER] Piotroski F-Score" | F-Score (or calculate) |
| 5 | "[TICKER] insider trading SEC Form 4 2025" | Insider buys/sells |
| 6 | "[TICKER] short interest percentage float" | Short interest |
| 7 | "[TICKER] RSI MACD 50-day 200-day moving average beta volatility" | Technical indicators |
| 8 | "[TICKER] analyst price target consensus" | Analyst targets |
Use sources in this priority order:
| Situation | Action | Display |
|---|---|---|
| Metric not found after searching | Display "N/A" | |
| Data is outdated (>1 year old) | Note the date | |
| Conflicting sources | Use most authoritative | Note in analysis |
| Calculated metric (F-Score) | Show calculation | Explain in text |
| Insider data unavailable | Show "N/A" | |
CRITICAL: Zero means "zero occurred" - NEVER substitute zeros for missing data.
Use these EXACT labels in the dashboard (matches reference screenshots):
| Label | Notes |
|---|---|
| Price: | $XX.XX or €XX.XX |
| Market Cap: | $XXB or €XXB |
| Trailing P/E: | XX.XX |
| Forward P/E: | XX.XX |
| Subsector P/E: | XX.XX or N/A |
| PEG (1Y): | X.XX with benchmark (<1) |
| ROE: | XX.XX% with benchmark (>20%) |
| ROA: | XX.XX% with benchmark (>10%) |
| Profit Margin: | XX.XX% with benchmark (>20%) |
| Operative Margin: | XX.XX% with benchmark (>20%) - NOTE: "Operative" not "Operating" |
| Gross Margin: | XX.XX% with benchmark (>40%) |
| ROIC: | XX.X% with benchmark (>15%) |
| Label | Notes |
|---|---|
| Revenue (YoY): | XX.XX% with benchmark (>10%) - REPORTED only |
| Earning (YoY): | XX.XX% with benchmark (>0%) - REPORTED only |
| EPS (TTM): | $X.XX |
| Forward EPS: | $X.XX |
| Growth Rates: | Capped: X.X% / Uncapped: X.X% |
| Analyst Target: | $XX.XX |
| CRS (0-1): | X.XX with benchmark (Medium) |
| Debt/Equity (mrq): | X.XX with benchmark (0.5-1) |
| Piotroski F: | X with benchmark (≥7) |
| Altman Z: | X.XX with benchmark (>3) |
| Beneish M: | X.XX with benchmark (<-1.78) |
| Value Trap: | XX (Label) |
| Label | Notes |
|---|---|
| Current Ratio: | X.XX with benchmark (1-2) |
| Cash: | $X.XB |
| Debt: | $X.XB or N/A |
| FCF Growth 5Y: | XX.X% with benchmark (>5%) |
| FCF Yield: | X.XX% with benchmark (>4%) |
| FCF Margin: | XX.XX% with benchmark (>15%) |
| Payout Ratio: | XX.XX% with benchmark (<50%) |
| Buys (12M): | X - from SEC Form 4 or N/A |
| Sells (12M): | X - from SEC Form 4 or N/A |
| Net Shares (12M): | +/-XXK - from SEC Form 4 or N/A |
| Short Int (%): | X.X% |
| Sentiment / Articles: | +X.XXX / XX (Positive/Negative) |
| Stock: [Type] + Div Yield: | Combined: "Stock: Growth" + "Div Yield: X.XX%" |
| Sector/Industry: | Combined: "Sector / Industry" |
| Label | Notes |
|---|---|
| CQVS: | XX.XX with benchmark range |
| Label: | Strong/Moderate/Weak |
| Valuation: | XX.XX |
| Quality: | XX.XX |
| Strength: | XX.XX |
| Integrity: | XX.XX |
| Buffett Moat: | X with benchmark (4-7) |
| Greenblatt (MF): | EY: X.X% / ROC: X.X% or N/A |
| Beta: + Vol 1Y: | Combined: "Beta: X.XX" + "Vol 1Y: XX.X%" |
| Earnings Predict.: | XX.X% with benchmark (>80%) |
| Drawdown (5Y): | -XX.X% with label (Low/Mid/High) |
| Completeness: + Data Quality: | Combined: "XX.X%" + "High/Medium/Low" |
Use these EXACT thresholds for color coding:
| Metric | Green (Good) | Yellow (Neutral) | Red (Warning) |
|---|---|---|---|
| ROE | >20% | 10-20% | <10% |
| ROA | >10% | 5-10% | <5% |
| Profit Margin | >20% | 10-20% | <10% |
| Operative Margin | >20% | 10-20% | <10% |
| Gross Margin | >40% | 25-40% | <25% |
| ROIC | >15% | 8-15% | <8% |
| Debt/Equity | <1 | 1-2 | >2 |
| Current Ratio | 1-2 | 0.5-1 or 2-3 | <0.5 or >3 |
| Piotroski F | ≥7 | 4-6 | ≤3 |
| Altman Z | >2.99 | 1.81-2.99 | <1.81 |
| Beneish M | <-2.22 | -2.22 to -1.78 | >-1.78 |
| PEG (1Y) | <1 | 1-2 | >2 |
| RSI (14) | 30-50 | 50-70 | >70 or <30 |
| Short Interest | <5% | 5-10% | >10% |
| FCF Yield | >5% | 2-5% | <2% |
| FCF Margin | >15% | 10-15% | <10% |
| Dividend Yield | >2% | 1-2% | <1% or >8% |
| Value Trap | 0-39 | 40-59 | 60-100 |
| Max Drawdown | >-30% | -30% to -50% | <-50% |
| Revenue Growth | >10% | 0-10% | <0% |
| Earnings Growth | >0% | -10% to 0% | <-10% |
This skill provides institutional-grade evaluation of potential stock investments. Unlike portfolio analysis which reviews existing positions, this skill evaluates stocks you're considering buying or deciding whether to purchase.
The evaluation answers:
All monetary values in the dashboard should be displayed in Euro (€) as the default currency:
For the dashboard metrics "Rev Growth" and "Earn Growth":
Stock Evaluator is for:
NOT for:
1. Valuation Assessment
2. Quality Analysis
3. Timing Assessment
4. Position Sizing
5. Conviction Rating
A Value Trap is when a stock appears undervalued (low P/E, low P/B) but is actually cheap for valid fundamental reasons. The stock keeps declining despite appearing "cheap."
Components to evaluate (ADD points for trap indicators):
1. Price Momentum (25 points max)
2. Earnings Quality (25 points max)
3. Balance Sheet Health (25 points max)
4. Valuation Context (25 points max)
Value Trap Score = Momentum Penalty + Quality Penalty + Balance Sheet Penalty + Valuation Penalty
(Score ranges from 0 to 100, where 0 = definitely genuine value, 100 = definite value trap)
Value Trap: 21 (Genuine)
Color coding: green <40, yellow 40-60, red >60
Score each stock against 8 famous investor philosophies (0-10 scale). This helps users understand what type of investor the stock suits.
Based on "The Warren Buffett Way" - seeks durable competitive advantages
Key metrics weighted:
Buffett likes: Predictable businesses, pricing power, low capex needs, consistent profitability
Based on "Poor Charlie's Almanack" - mental latticework, inversion thinking
Focus on: What could go WRONG (inversion principle)
Scoring: Start at 10, subtract penalties:
Based on "Principles" - All-Weather portfolio, economic machine understanding
Key metrics:
Dalio likes: Deleveraging plays, operational efficiency, cycle resilience
Based on "One Up on Wall Street" - GARP (Growth at Reasonable Price)
Primary metric: PEG Ratio (P/E ÷ Growth Rate)
Adjustment factors:
Based on "The Intelligent Investor" - Margin of Safety
Graham criteria (2 points each, max 10):
Based on "The Little Book That Beats the Market" - Magic Formula
Combines two rankings:
Scoring: Combined rank in top 10% = 10 points, scaled down
Based on contrarian, global value investing
Key factors:
Based on "The Alchemy of Finance" - Reflexivity
Key factors:
Soros likes: Macro plays, reflexive situations, trend participation
Show 8 badges around radar chart with scores and color coding:
Components to Calculate:
Cloud (Kumo): Area between Senkou Span A and B
Signals to Identify and Display:
What to Analyze:
Management Evaluation:
Competitive Position:
Research Process Order:
Key Metrics to Analyze:
Quality Benchmarks:
Trends to Assess:
Red Flags:
Moat Strength: Wide / Narrow / None
Evaluate Sources:
Moat Durability:
Peer Comparison: Compare this company's moat vs. 3-5 direct competitors:
Beyond basic quality metrics, calculate these advanced scores for deeper insight:
Piotroski F-Score (Financial Strength)
Purpose: 9-point score measuring financial strength across profitability, leverage, and operating efficiency.
Scoring (0-9, higher is better):
Profitability (4 points):
Leverage/Liquidity (3 points):
Operating Efficiency (2 points):
Interpretation:
Altman Z-Score (Bankruptcy Risk)
Purpose: Predicts probability of bankruptcy within 2 years.
Formula (for public manufacturing companies): Z = 1.2(A) + 1.4(B) + 3.3(C) + 0.6(D) + 1.0(E)
Where:
Interpretation:
Note: Adjust for non-manufacturing companies (different coefficients).
Beneish M-Score (Earnings Manipulation Detection)
Purpose: Identifies likelihood of earnings manipulation.
Key Indicators (simplified approach):
Interpretation:
Practical Check (if full M-Score unavailable):
Max Drawdown (5-Year)
Purpose: Measures largest peak-to-trough price decline.
Calculation:
Interpretation:
Consolidated Scores
Strength Score (0-100): Composite of:
Integrity Score (0-100): Composite of:
Predictability Score (0-100): Composite of:
Data Quality Score (0-100):
Company-Specific Risks:
Industry Risks:
Macro Risks:
Overall Risk Level: Low / Moderate / High
Consolidated Risk Score: (0-1 scale, lower is better)
0.60: High Risk
Use multiple valuation methods - synthesize into fair value estimate.
1. DCF Analysis (Discounted Cash Flow)
2. Relative Valuation
3. Peter Lynch Fair Value
4. Asset-Based (When Applicable)
Fair Value Estimate: €X.XX
Weight each method appropriately:
Margin of Safety:
Valuation Conclusion:
Focus on identifying optimal entry points, not full technical analysis.
1. Price Action (Last 30-60 Days)
2. Key Levels
3. Technical Indicators
70 = Overbought (may pullback)
4. Entry Assessment
MANDATORY: Every analysis must present both sides fairly.
Potential Upside: +X% to €X.XX
For this to play out:
Potential Downside: -X% to €X.XX
This happens if:
Which case is more probable: [Bull / Bear / Balanced]
[Explanation of why one case is more likely, considering:
Allocation recommendation based on:
Conviction + Risk = Position Size
Strong Buy (High Conviction, Low Risk):
Buy (Moderate Conviction, Moderate Risk):
Speculative/High Risk:
Considerations:
NO scale-in strategies - recommend single entry approach:
If BUY:
Price Target (12-month): €X.XX (+X% upside)
Stop Loss: €X.XX (-X% maximum loss)
Sell If (Thesis-Breaking Conditions):
Hold Duration:
Identify specific events that could drive stock performance.
Near-Term (0-6 months):
Medium-Term (6-18 months):
Long-Term (18+ months):
Critical Principles:
No Press/News for Fundamental Analysis
Magnitude Over Precision
Long-Term View
Compare Apples to Apples
Intellectual Honesty
# [SYMBOL] - [Company Name] Evaluation⚠️ DELIVERABLES CHECKLIST ✓
☑ Technical Analysis Complete ☑ Fundamental Analysis Complete ☑ Valuation Assessment Complete ☑ Bull vs. Bear Case Complete ☑ Clear Recommendation: [BUY / HOLD / SELL] ☑ Alternative Candidates: [If SELL, list 3-5 alternatives below]
📊 Executive Summary
[2-3 sentence bottom-line assessment with key reasoning]
Recommendation: [BUY / HOLD / SELL] Conviction: [Strong Buy / Buy / Hold / Avoid]
💰 Valuation Assessment
Fair Value Estimate: €X.XX (Current: €X.XX)
- Margin of Safety: X% [Adequate >15% / Insufficient <15%]
- Valuation: [UNDERVALUED / FAIRLY VALUED / OVERVALUED]
Valuation Method Fair Value vs. Current Weight DCF Analysis €X.XX +X% 40% Peer Relative €X.XX +X% 30% Peter Lynch €X.XX +X% 30% Weighted Average €X.XX +X% 100% Assumptions:
- DCF: [Key assumptions - growth rate, margins, discount rate]
- Margin of safety applied: X%
🏢 Business & Competitive Analysis
What They Do
[2-3 paragraph business model summary:
- Core products/services
- Revenue breakdown
- Target markets
- Business model]
Competitive Advantages
Moat Strength: [Wide / Narrow / None]
- [Advantage 1]: [Detailed explanation with evidence]
- [Advantage 2]: [Detailed explanation with evidence]
- [Advantage 3]: [Detailed explanation with evidence]
Moat Durability: [How sustainable are these advantages? 3-5 years? 10+ years?]
Management Quality Assessment
Overall Rating: [Excellent / Good / Adequate / Concerning]
- CEO: [Name] - [Background, tenure]
- Track record: [Achievements/concerns]
- Capital allocation: [Shareholder-friendly? Smart acquisitions?]
- CFO: [Name] - [Financial stewardship]
- Insider Trading: [Recent buying/selling activity]
- Key Insight: [Overall management assessment]
Competitive Position
Market Position:
- Market share: X% (#X in industry)
- Share trend: [Gaining / Stable / Losing]
Key Competitors: [List 3-5 direct peers]
Peer Comparison:
Company Mkt Cap Revenue Growth Profit Margin ROE P/E Moat [Target] €XB X% X% X% X.X [Rating] [Peer 1] €XB X% X% X% X.X [Rating] [Peer 2] €XB X% X% X.X X.X [Rating] [Peer 3] €XB X% X% X% X.X [Rating] Competitive Assessment: [Is this the best company in the sector?]
📈 Financial Health Analysis
Quality Metrics vs. Benchmarks
Metric Current 1Y Ago 3Y Ago 5Y Ago Target Status ROE X% X% X% X% >15% [✓/✗] Profit Margin X% X% X% X% >15% [✓/✗] Gross Margin X% X% X% X% >30% [✓/✗] Revenue Growth X% X% X% X% >0% [✓/✗] Debt/Revenue X.X X.X X.X X.X <1.0 [✓/✗] FCF €XM €XM €XM €XM Positive [✓/✗] Advanced Financial Health Scores
Piotroski F-Score: X/9 [Excellent 8-9 / Good 6-7 / Adequate 4-5 / Weak 0-3]
Profitability: X/4
- ROA positive: [✓/✗]
- Operating CF positive: [✓/✗]
- ROA improving: [✓/✗]
- CF > Net Income: [✓/✗]
Leverage: X/3
- Debt decreasing: [✓/✗]
- Current ratio improving: [✓/✗]
- No dilution: [✓/✗]
Efficiency: X/2
- Margin improving: [✓/✗]
- Turnover improving: [✓/✗]
Assessment: [Detailed interpretation of F-Score]
Altman Z-Score: X.XX [Safe >2.99 / Grey 1.81-2.99 / Distress <1.81]
- Bankruptcy Risk: [Low / Moderate / High]
- Interpretation: [Explanation of Z-Score and financial stability]
Beneish M-Score: X.XX [Clean <-1.78 / Warning >-1.78]
- Earnings Quality: [High / Moderate / Questionable]
- Red Flags: [List any concerning indicators or state "None"]
Max Drawdown (5Y): -X% [Low <20% / Moderate 20-40% / High 40-60% / Extreme >60%]
- Volatility Assessment: [Low/Moderate/High volatility explanation]
- Peak price: €X.XX ([Date])
- Trough price: €X.XX ([Date])
Consolidated Scores
Strength Score: X/100 (Financial power and market position) Integrity Score: X/100 (Earnings quality and transparency) Predictability Score: X/100 (Business consistency) Data Quality Score: X/100 (Information completeness)
Overall Quality Rating: [Elite / Strong / Good / Adequate / Weak]
Financial Trends (5-10 Year View)
Revenue:
- [Trend description: growth rate, consistency, drivers]
- [Any concerning patterns?]
Margins:
- Gross margin: [Expanding / Stable / Declining]
- Operating margin: [Trend]
- Net margin: [Trend]
- Drivers: [Why are margins moving this way?]
Cash Flow:
- Operating cash flow: [Trend and quality]
- Free cash flow: [Consistency, conversion]
- Capital allocation: [Dividends, buybacks, capex, acquisitions]
Balance Sheet:
- Debt levels: [Conservative / Moderate / High]
- Liquidity: [Strong / Adequate / Concerning]
- Trend: [Strengthening / Stable / Weakening]
🚩 Red Flags
[List any concerning trends or issues, or state "None identified"]
📉 Technical Analysis & Entry Timing
Price Action (Last 30-60 Days)
- Current Price: €X.XX
- 52-Week Range: €X.XX - €X.XX
- 30-day Change: [+/-X%]
- Trend: [Uptrend / Downtrend / Range-bound]
- Volume: [Increasing / Decreasing / Normal]
Key Technical Levels
Support Levels:
- Primary Support: €X.XX - [Significance/reason]
- Secondary Support: €X.XX - [Significance/reason]
Resistance Levels:
- Primary Resistance: €X.XX - [Significance/reason]
- Secondary Resistance: €X.XX - [Significance/reason]
Technical Indicators
RSI: X.X [Overbought >70 / Neutral 30-70 / Oversold <30] MACD: [Bullish crossover / Bearish crossover / Neutral]
- Interpretation: [Momentum assessment]
Moving Averages:
- 50-day MA: €X.XX - Price is [above/below]
- 200-day MA: €X.XX - Price is [above/below]
- Golden/Death Cross: [Any recent crossovers?]
Entry Assessment
Technical Setup: [Bullish / Neutral / Bearish]
Optimal Entry Strategy:
- [Buy now at market / Wait for pullback to €X.XX / Buy on breakout above €X.XX]
- Ideal Entry Range: €X.XX - €X.XX
- Maximum Buy Price: €X.XX (avoid above this)
Momentum: [Strong Bullish / Bullish / Neutral / Bearish / Strong Bearish]
⚖️ Bull vs. Bear Case
🐂 Bull Case
Potential Upside: €X.XX (+X%)
- [Bull Argument 1]: [Specific evidence and reasoning]
- [Bull Argument 2]: [Specific evidence and reasoning]
- [Bull Argument 3]: [Specific evidence and reasoning]
For this to play out:
- [Required condition 1]
- [Required condition 2]
Probability: [High / Moderate / Low]
🐻 Bear Case
Potential Downside: €X.XX (-X%)
- [Bear Argument 1]: [Specific risk and reasoning]
- [Bear Argument 2]: [Specific risk and reasoning]
- [Bear Argument 3]: [Specific risk and reasoning]
This happens if:
- [Risk trigger 1]
- [Risk trigger 2]
Probability: [High / Moderate / Low]
⚖️ Balance Assessment
Which case is more probable: [Bull / Bear / Balanced]
[2-3 paragraph explanation of:
- Weight of evidence for each side
- Historical precedent
- Management track record
- Industry dynamics
- Current valuation
- Risk/reward assessment]
⚠️ Risk Analysis
Overall Risk Level: [Low / Moderate / High]
Key Risks
1. [Risk Category - e.g., Competition Risk]: [Specific risk and potential impact. Probability: High/Medium/Low]
2. [Risk Category - e.g., Execution Risk]: [Specific risk and potential impact. Probability: High/Medium/Low]
3. [Risk Category - e.g., Valuation Risk]: [Specific risk and potential impact. Probability: High/Medium/Low]
4. [Risk Category - e.g., Macro Risk]: [Specific risk and potential impact. Probability: High/Medium/Low]
Risk Mitigation
[How does the company/investment address these risks?] [What reduces the risk in this investment?]
🎯 Catalysts & Timeline
Near-Term (0-6 months)
- [Date]: [Specific catalyst - earnings, product launch, etc.]
- [Date]: [Specific catalyst]
Medium-Term (6-18 months)
- [Expected development 1]
- [Expected development 2]
Long-Term (18+ months)
- [Structural trend 1]
- [Structural trend 2]
Expected Timeline to Target: [6-12 months / 1-3 years / 3-5+ years]
💡 Investment Recommendation
RECOMMENDATION: [BUY / HOLD / SELL]
Conviction: [Strong Buy / Buy / Hold / Avoid]
Rationale
[2-3 paragraph synthesis of entire analysis:
- Why this recommendation?
- What makes it compelling (or not)?
- How does valuation + fundamentals + technicals + catalysts = this conclusion?
- What's the risk/reward?]
📍 Entry Strategy (if BUY)
Ideal Entry Price: €X.XX - €X.XX
- Reasoning: [Why this range?]
Maximum Acceptable Price: €X.XX
- Above this: Risk/reward unfavorable
Approach:
- [Buy now at market / Wait for pullback to €X.XX / Buy on breakout above €X.XX]
- Reasoning: [Current technical setup justification]
DO NOT BUY IF:
- Price exceeds €X.XX without fundamental improvement
- [Other specific condition]
🎯 Exit Strategy
Price Targets (12-Month Horizon)
- Conservative: €X.XX (+X%)
- Base Case: €X.XX (+X%)
- Optimistic: €X.XX (+X%)
Stop Loss
Stop Loss: €X.XX (-X% maximum loss)
- Technical: Below €X.XX support
- Fundamental: If [thesis-breaking condition]
Sell Conditions (Thesis-Breaking)
Exit position if any of these occur:
- [Specific fundamental deterioration - e.g., "ROE drops below 10% for 2 consecutive quarters"]
- [Specific competitive threat - e.g., "Loses >5% market share to competitor"]
- [Specific valuation threshold - e.g., "Reaches €X.XX (>50% above fair value)"]
Hold Duration
Expected Timeframe: [6-12 months / 1-3 years / 3-5+ years]
- Based on: [Investment type - swing trade vs. long-term hold]
📏 Position Sizing
Recommended Allocation: X-X% of portfolio
Specific Recommendation: X%
Rationale:
- Conviction level: [Strong Buy / Buy → drives size]
- Risk level: [Low / Moderate / High → constrains size]
- Diversification: [Sector exposure, correlation with existing holdings]
- Liquidity: [Can exit position easily?]
Maximum Allocation: X%
- Risk management limit
- Don't exceed even if highly convicted
Sizing Guidelines Applied:
- Strong Buy + Low Risk = 5-8% (max 10%)
- Buy + Moderate Risk = 3-5% (max 7%)
- Speculative + High Risk = 1-3% (max 5%)
🔑 Key Takeaways
Top 3 Reasons to Invest
- [Most compelling positive factor]
- [Second most compelling positive factor]
- [Third most compelling positive factor]
Top 3 Concerns
- [Biggest risk or concern]
- [Second biggest risk or concern]
- [Third biggest risk or concern]
One-Sentence Investment Thesis
[Single sentence capturing the complete investment case - why buy or avoid]
📚 Research Documentation
Sources Consulted:
- 10-K filings: [Fiscal years reviewed - e.g., FY2020-2024]
- 10-Q filings: [Recent quarters - e.g., Q1-Q3 2025]
- Earnings calls: [Dates reviewed]
- Proxy statements: [Years reviewed]
- Management letters: [Years reviewed]
- Competitor analysis: [Companies benchmarked]
Analysis Depth:
- Historical period analyzed: [X years]
- Peer companies compared: [Number and names]
- Valuation methods used: [DCF, Relative, Peter Lynch, Asset-based]
Confidence Level: [High / Medium / Low]
- Based on: [Quality and completeness of available data]
- Gaps: [Any areas where information is limited or unavailable]
- Limitations: [Any constraints in the analysis]
🔄 Alternative Candidates (Required if SELL/AVOID)
[If recommending SELL or AVOID, provide 3-5 better investment alternatives with brief rationale for each]
Alternative 1: [Symbol] - [Company Name]
Why it's better: [1-2 paragraph comparison] Quick metrics: [Valuation, growth, margins]
Alternative 2: [Symbol] - [Company Name]
Why it's better: [1-2 paragraph comparison] Quick metrics: [Valuation, growth, margins]
Alternative 3: [Symbol] - [Company Name]
Why it's better: [1-2 paragraph comparison] Quick metrics: [Valuation, growth, margins]
[Continue for 4-5 alternatives if SELL recommendation]
Analysis Date: [Current Date] Next Review: [Suggested review date based on catalysts or timeline] Analyst: Claude Stock Evaluator
📊 Quant-Style Dashboard
FINAL MANDATORY STEP: Create a React artifact using the standardized quant-style dashboard template with:
Required Data to Populate:
- ✅ All 48 metrics across 8 sections (calculated above)
- ✅ Historical price data (5 years, 6-12 points)
- ✅ 1-year price + 6-month forecast (4-6 points)
- ✅ MACD data (3-5 recent points)
- ✅ RSI data (3-5 recent points)
- ✅ Radar chart (12 metrics, normalized 0-100)
- ✅ Bull case (target + 5 points)
- ✅ Bear case (target + 5 points)
- ✅ Entry/exit strategy (5 values)
Use the EXACT template code provided in the skill instructions above. DO NOT use placeholder values - populate with actual calculated data from this analysis.
[Create the React artifact here using the quant-style template]
MANDATORY: After completing the full text analysis, create a React dashboard artifact using the standardized quant-style template format.
The dashboard uses a specific institutional-grade format with:
1. Header Section (Orange background)
TICKER - Company Name2. Eight Metric Sections (2-column grid)
| Left Column | Right Column |
|---|---|
| Price & Valuation (blue) | Financial Performance (green) |
| Growth Metrics (emerald) | Risk Indicators (red) |
| Liquidity & FCF (cyan) | Insider & Sentiment (purple) |
| Quality Scores (orange) | Moat & Other (gray) |
Each section: 6 metric boxes with values, labels, benchmarks, color coding
3. Charts Section (3-column grid)
Left: Linear Price Chart + MACD
Center: Radar Chart + 1-Year Forecast
Right: Log Price Chart + RSI
4. Key Notes Section (Expandable accordion)
5. Footer
Price & Valuation (6 metrics):
Financial Performance (6 metrics):
Growth Metrics (6 metrics):
Risk Indicators (6 metrics):
Liquidity & FCF (6 metrics):
Insider & Sentiment (6 metrics):
Quality Scores (6 metrics):
Moat & Other (6 metrics):
// Green (isGood: true) - Positive indicators ROE > 20%, ROA > 10%, Margins > 20%, ROIC > 15% Revenue Growth > 10%, Current Ratio 1-2, Z-Score > 3 M-Score < -1.78, FCF Growth > 0%, Payout < 50% F-Score >= 7, Quality >= 70, Strength >= 70// Red (isGood: false) - Warning indicators
Max Drawdown < -50%, Beta > 2, Consolidated Risk > 0.6 Predictability < 50%, F-Score <= 3, Z-Score < 1.81 M-Score > -1.78, Quality < 50// Yellow (isGood: 'neutral') - Monitor F-Score 4-6, RSI 30-70, Moat 5-7, Quality 50-70 Beta 1.5-2.0, Predictability 50-70%
Use this exact template structure:
import React, { useState } from 'react'; import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, RadarChart, PolarGrid, PolarAngleAxis, PolarRadiusAxis, Radar, ReferenceLine, Area, ComposedChart, Scatter } from 'recharts';const QuantDashboard = () => { const [showKeyNotes, setShowKeyNotes] = useState(false);
// ============================================================ // POPULATE WITH STOCK-SPECIFIC DATA FROM ANALYSIS // ============================================================
const ticker = "TICKER"; // Replace const companyName = "Company Name"; // Replace const recommendation = "BUY"; // BUY, HOLD, SELL, SPECULATIVE BUY const analysisDate = "December 6, 2025"; // Current date
const metrics = { // Price & Valuation - from analysis price: 100.00, marketCap: '€10B', trailingPE: 20.0, forwardPE: 18.0, subsectorTypicalPE: 25.0, peg1Y: 1.2, // NEW: 1-Year Forward PEG peg5Y: 2.5, // NEW: 5-Year PEG
// Financial Performance - from 5-10 year analysis roe: 25.0, roa: 12.0, profitMargin: 20.0, opMargin: 25.0, grossMargin: 50.0, roic: 18.0, // Growth Metrics - from historical trends (USE REPORTED, not underlying) revGrowth: 15.0, // REPORTED revenue growth YoY earnGrowth: 20.0, // REPORTED earnings growth YoY epsTTM: 5.00, forwardEPS: 5.50, growthCapped: 10.0, // NEW: Capped sustainable growth estimate growthUncapped: 22.0, // NEW: Headline analyst growth estimate analystTarget: 120.00, // Risk Indicators - from advanced metrics section crs: 0.40, // Consolidated Risk Score (0-1 scale) debtEquity: 0.50, fScore: 7, // Piotroski F-Score zScore: 4.0, // Altman Z-Score mScore: -2.5, // Beneish M-Score valueTrapScore: 25, // NEW: 0-100, LOWER = genuine, HIGHER = trap valueTrapLabel: 'Genuine', // NEW: Genuine/Caution/Trap maxDrawdown: -30.0, // 5-year max drawdown % // Liquidity & FCF - from cash flow analysis currentRatio: 1.5, totalCash: '€2B', totalDebt: '€1B', fcfGrowth5Y: 12.0, // 5-year smoothed growth fcfYield: 5.0, fcfMargin: 18.5, // NEW: FCF / Revenue % payoutRatio: 30.0, // Insider & Sentiment - from SEC Form 4 or use "N/A" if unavailable insBuys: 0, // From SEC Form 4 - use actual count or "N/A" insSells: 0, // From SEC Form 4 - use actual count or "N/A" netShares: 'N/A', // From SEC Form 4 - use actual or "N/A" shortInterest: 2.5, // From FINRA/exchange - use actual or "N/A" newsSentiment: 0.25, // -1 to +1 scale newsArticleCount: 15, // Recent article count // Beta & Volatility beta: 1.0, // Stock beta vol1Y: 25.0, // 1-Year volatility % // Quality Scores - from consolidated scoring cqvs: 75.0, // Consolidated Quality & Valuation Score label: 'Quality Growth', // Elite/Compounder/Quality Growth/etc valuation: 70.0, // 0-100 quality: 80.0, // 0-100 strength: 75.0, // 0-100 integrity: 85.0, // 0-100 // Moat & Other buffettMoat: 8, // 0-10 scale (renamed from moat) greenblattEY: 6.5, // NEW: Earnings Yield % greenblattROC: 22.0, // NEW: Return on Capital % earningsPredict: 70, // Earnings Predictability 0-100 completeness: 85, // Data completeness 0-100 dataQuality: 'High', // High/Medium/Low divYield: 1.5, stockType: 'Growth', // Growth/Value/Cyclical/Defensive sector: 'Technology', industry: 'Software', // NEW: Investor Persona Scores (0-10 scale each) buffettScore: 7.5, // Durable competitive advantage seeker mungerScore: 6.8, // Inversion thinker, risk avoider dalioScore: 7.2, // All-weather, cycle resilient lynchScore: 8.0, // GARP - Growth at Reasonable Price grahamScore: 5.5, // Deep value, margin of safety greenblattScore: 6.0, // Magic Formula (EY + ROC) templetonScore: 4.5, // Contrarian, global value sorosScore: 3.0, // Reflexivity, macro trends // NEW: Valuation Lines for Charts marketValueCurrent: 95.00, intrinsicValueCurrent: 110.00, marketValueNextYear: 105.00, intrinsicValueNextYear: 120.00, unrestrictedMarketValueCurrent: 125.00, unrestrictedMarketValueNextYear: 140.00, // Valuation Assessment (for indicator below forecast) valuationPercent: 15, // Positive = undervalued, negative = overvalued valuationLabel: 'Undervalued', // Undervalued/Fairly Valued/Overvalued};
// TOP NEWS Headlines - Format: pipe-separated with dates at END in brackets const topNews = [ { headline: 'Company announces Q4 guidance above expectations', date: '05 Dec 2025' }, { headline: 'New product launch receives positive analyst coverage', date: '28 Nov 2025' }, { headline: 'Strategic partnership announced with major cloud provider', date: '15 Nov 2025' }, { headline: 'Q3 earnings beat estimates, revenue up 18% YoY', date: '02 Nov 2025' }, { headline: 'Management presents at investor conference, reaffirms outlook', date: '20 Oct 2025' }, ];
// Format TOP NEWS as pipe-separated string with dates at END const topNewsString = topNews.map(n =>
).join(' | ');${n.headline} [${n.date}]// Historical Price Data (10 years with multiple valuation lines) const priceHistory = [ { date: '2016', price: 25, totalReturn: 28, marketValueCurrent: 27, intrinsicValueCurrent: 30, marketValueNextYear: 29, intrinsicValueNextYear: 32, analystTarget: 30, unrestrictedCurrent: 28, unrestrictedNextYear: 31 }, { date: '2017', price: 35, totalReturn: 40, marketValueCurrent: 38, intrinsicValueCurrent: 42, marketValueNextYear: 40, intrinsicValueNextYear: 45, analystTarget: 42, unrestrictedCurrent: 40, unrestrictedNextYear: 44 }, { date: '2018', price: 45, totalReturn: 52, marketValueCurrent: 48, intrinsicValueCurrent: 55, marketValueNextYear: 52, intrinsicValueNextYear: 60, analystTarget: 55, unrestrictedCurrent: 52, unrestrictedNextYear: 58 }, { date: '2019', price: 55, totalReturn: 65, marketValueCurrent: 58, intrinsicValueCurrent: 68, marketValueNextYear: 62, intrinsicValueNextYear: 72, analystTarget: 65, unrestrictedCurrent: 65, unrestrictedNextYear: 72 }, { date: '2020', price: 50, totalReturn: 62, marketValueCurrent: 55, intrinsicValueCurrent: 65, marketValueNextYear: 60, intrinsicValueNextYear: 70, analystTarget: 62, unrestrictedCurrent: 62, unrestrictedNextYear: 70 }, { date: '2021', price: 75, totalReturn: 95, marketValueCurrent: 80, intrinsicValueCurrent: 90, marketValueNextYear: 85, intrinsicValueNextYear: 98, analystTarget: 90, unrestrictedCurrent: 92, unrestrictedNextYear: 105 }, { date: '2022', price: 65, totalReturn: 85, marketValueCurrent: 72, intrinsicValueCurrent: 85, marketValueNextYear: 78, intrinsicValueNextYear: 92, analystTarget: 82, unrestrictedCurrent: 85, unrestrictedNextYear: 95 }, { date: '2023', price: 80, totalReturn: 105, marketValueCurrent: 85, intrinsicValueCurrent: 100, marketValueNextYear: 92, intrinsicValueNextYear: 108, analystTarget: 98, unrestrictedCurrent: 100, unrestrictedNextYear: 115 }, { date: '2024', price: 95, totalReturn: 125, marketValueCurrent: 100, intrinsicValueCurrent: 115, marketValueNextYear: 108, intrinsicValueNextYear: 125, analystTarget: 115, unrestrictedCurrent: 120, unrestrictedNextYear: 135 }, { date: '2025', price: 100, totalReturn: 135, marketValueCurrent: 105, intrinsicValueCurrent: 120, marketValueNextYear: 115, intrinsicValueNextYear: 132, analystTarget: 125, unrestrictedCurrent: 130, unrestrictedNextYear: 145 }, ];
// 1 Year Price with 6-Month Forecast, MAs, and Bollinger Bands const oneYearData = [ { date: "Jan'25", price: 90, ma50: 88, ma200: 85, upperBand: 98, lowerBand: 82, forecast: null, ci95Upper: null, ci95Lower: null }, { date: "Mar'25", price: 88, ma50: 89, ma200: 86, upperBand: 96, lowerBand: 80, forecast: null, ci95Upper: null, ci95Lower: null }, { date: "May'25", price: 95, ma50: 91, ma200: 87, upperBand: 102, lowerBand: 84, forecast: null, ci95Upper: null, ci95Lower: null }, { date: "Jul'25", price: 92, ma50: 92, ma200: 88, upperBand: 100, lowerBand: 84, forecast: null, ci95Upper: null, ci95Lower: null }, { date: "Sep'25", price: 98, ma50: 94, ma200: 90, upperBand: 106, lowerBand: 86, forecast: null, ci95Upper: null, ci95Lower: null }, { date: "Nov'25", price: 100, ma50: 96, ma200: 92, upperBand: 108, lowerBand: 88, forecast: 100, ci95Upper: 108, ci95Lower: 92 }, { date: "Jan'26", price: null, ma50: null, ma200: null, upperBand: null, lowerBand: null, forecast: 108, ci95Upper: 120, ci95Lower: 96 }, { date: "Mar'26", price: null, ma50: null, ma200: null, upperBand: null, lowerBand: null, forecast: 115, ci95Upper: 130, ci95Lower: 100 }, ];
// NEW: Ichimoku Cloud Data (6-month view with signal markers) const ichimokuData = [ { date: 'Jun', price: 88, tenkan: 87, kijun: 85, senkouA: 84, senkouB: 82, chikou: 85, tkCrossMarker: null, kumoTwistMarker: null }, { date: 'Jul', price: 92, tenkan: 90, kijun: 87, senkouA: 86, senkouB: 84, chikou: 90, tkCrossMarker: 92, kumoTwistMarker: null }, // TK Bullish Cross { date: 'Aug', price: 95, tenkan: 93, kijun: 90, senkouA: 89, senkouB: 86, chikou: 93, tkCrossMarker: null, kumoTwistMarker: null }, { date: 'Sep', price: 98, tenkan: 96, kijun: 93, senkouA: 92, senkouB: 88, chikou: 96, tkCrossMarker: null, kumoTwistMarker: 92 }, // Kumo Twist Bullish { date: 'Oct', price: 96, tenkan: 97, kijun: 95, senkouA: 94, senkouB: 90, chikou: 94, tkCrossMarker: null, kumoTwistMarker: null }, { date: 'Nov', price: 100, tenkan: 98, kijun: 96, senkouA: 95, senkouB: 92, chikou: 98, tkCrossMarker: null, kumoTwistMarker: null }, ];
// NEW: Ichimoku Signals Summary const ichimokuSignals = { tkCross: 'TK Bullish Cross', kumoTwist: 'Kumo Twist Bullish', priceVsCloud: 'Above Cloud (Bullish)', };
// MACD Data (recent 6 months) const macdData = [ { date: 'Jun', macd: 0.5, signal: 0.3, histogram: 0.2 }, { date: 'Jul', macd: 1.2, signal: 0.6, histogram: 0.6 }, { date: 'Aug', macd: 1.5, signal: 1.0, histogram: 0.5 }, { date: 'Sep', macd: 1.8, signal: 1.3, histogram: 0.5 }, { date: 'Oct', macd: 1.2, signal: 1.4, histogram: -0.2 }, { date: 'Nov', macd: 0.8, signal: 1.2, histogram: -0.4 }, ];
// RSI Data (recent 6 months) const rsiData = [ { date: 'Jun', rsi: 45 }, { date: 'Jul', rsi: 55 }, { date: 'Aug', rsi: 62 }, { date: 'Sep', rsi: 68 }, { date: 'Oct', rsi: 58 }, { date: 'Nov', rsi: 55 }, ];
// Radar Chart Data (normalize all to 0-100 scale) const radarData = [ { metric: 'Rev Growth', value: 70, fullMark: 100 }, { metric: 'Op Margin', value: 75, fullMark: 100 }, { metric: 'Gross Margin', value: 65, fullMark: 100 }, { metric: 'Profit Margin', value: 60, fullMark: 100 }, { metric: 'ROE', value: 70, fullMark: 100 }, { metric: 'Risk (CRS)', value: 60, fullMark: 100 }, { metric: 'Beta Score', value: 70, fullMark: 100 }, { metric: 'P/Market Disc', value: 50, fullMark: 100 }, { metric: 'Moat', value: 80, fullMark: 100 }, { metric: 'FCF Growth', value: 55, fullMark: 100 }, { metric: 'ROA', value: 65, fullMark: 100 }, { metric: 'Earn Growth', value: 75, fullMark: 100 }, ];
// Key Notes Content - from Bull/Bear case analysis const bullCase = { target: "€130-150", // Bull case price target points: [ "Strong revenue growth momentum", "Expanding margins", "Market leadership position", "Favorable industry tailwinds", "Strong balance sheet" ] };
const bearCase = { target: "€70-80", // Bear case price target points: [ "Valuation compression risk", "Competitive pressures", "Macro sensitivity", "Execution risks", "Key person dependency" ] };
const entryStrategy = { idealEntry: "€90-95", // From Entry Strategy section currentEntry: "€100 acceptable", target: "€120 (+20%)", // 12-month target stopLoss: "€85 (-15%)", // Stop loss positionSize: "2-3%" // Recommended allocation };
// ============================================================ // COMPONENT CODE (Standard - use as-is) // ============================================================
// Helper: Value Trap color (LOWER = genuine = green, HIGHER = trap = red) const getValueTrapColor = (score) => { if (score < 40) return 'bg-green-100 border-green-400 text-green-800'; if (score < 60) return 'bg-yellow-100 border-yellow-400 text-yellow-800'; return 'bg-red-100 border-red-400 text-red-800'; };
// Helper: Get label for Value Trap score const getValueTrapLabel = (score) => { if (score < 20) return 'Genuine'; if (score < 40) return 'Probably Genuine'; if (score < 60) return 'Caution'; if (score < 80) return 'Likely Trap'; return 'Strong Trap'; };
// Helper: Persona score color const getPersonaColor = (score) => { if (score >= 7) return 'bg-green-500'; if (score >= 4) return 'bg-yellow-500'; return 'bg-red-500'; };
// Helper: News sentiment color const getSentimentColor = (sentiment) => { if (sentiment > 0.3) return 'text-green-600'; if (sentiment > 0) return 'text-green-500'; if (sentiment > -0.3) return 'text-yellow-600'; return 'text-red-600'; };
// Persona Badge Component const PersonaBadge = ({ name, score, position }) => ( <div className={
}> <div className={absolute ${position} flex flex-col items-center}> {score.toFixed(1)} </div> <div className="text-[7px] text-gray-600 mt-0.5">{name}</div> </div> );w-6 h-6 rounded-full ${getPersonaColor(score)} flex items-center justify-center text-white text-[8px] font-boldconst MetricBox = ({ label, value, benchmark, isGood, size = 'normal' }) => { let bgColor = 'bg-gray-50'; if (isGood === true) bgColor = 'bg-green-50 border-green-200'; if (isGood === false) bgColor = 'bg-red-50 border-red-200'; if (isGood === 'neutral') bgColor = 'bg-yellow-50 border-yellow-200';
return ( <div className={`${bgColor} border p-1.5 flex flex-col justify-center items-center`}> <div className="text-base font-bold text-gray-900">{value}</div> <div className="text-[9px] text-gray-600 text-center leading-tight">{label}</div> {benchmark && <div className="text-[8px] text-gray-400">{benchmark}</div>} </div> );};
const SectionHeader = ({ title, bgColor }) => ( <div className={
}> {title} </div> );${bgColor} px-2 py-1 text-[10px] font-bold text-gray-700return ( <div className="w-full max-w-7xl mx-auto p-3 bg-white text-xs"> {/* Header */} <div className="bg-orange-500 text-white px-3 py-2 mb-1 text-lg font-bold text-center"> {ticker} - {companyName} </div>
{/* TOP NEWS - Pipe separated with dates at END */} <div className="border border-gray-300 rounded p-2 mb-3 bg-gray-50"> <span className="font-bold text-[10px]">TOP NEWS:</span> <div className="text-[9px] mt-1">{topNewsString}</div> </div> {/* Top 4 sections */} <div className="grid grid-cols-2 gap-2 mb-3"> {/* Price & Valuation - Updated with dual PEG */} <div className="border border-gray-300 rounded overflow-hidden"> <SectionHeader title="PRICE & VALUATION" bgColor="bg-blue-100" /> <div className="grid grid-cols-7 gap-px bg-gray-200"> <MetricBox label="Price:" value={`€${metrics.price}`} /> <MetricBox label="Market Cap:" value={metrics.marketCap} /> <MetricBox label="Trailing P/E:" value={metrics.trailingPE} /> <MetricBox label="Forward P/E:" value={metrics.forwardPE} benchmark={`(${metrics.subsectorTypicalPE})`} isGood={metrics.forwardPE < metrics.subsectorTypicalPE} /> <MetricBox label="Subsector P/E:" value={metrics.subsectorTypicalPE} /> <MetricBox label="PEG (1Y):" value={metrics.peg1Y} benchmark="(<1.5)" isGood={metrics.peg1Y < 1.5 ? true : metrics.peg1Y < 2 ? 'neutral' : false} /> <MetricBox label="PEG (5Y):" value={metrics.peg5Y} benchmark="(<2)" isGood={metrics.peg5Y < 2 ? true : metrics.peg5Y < 3 ? 'neutral' : false} /> </div> </div> {/* Financial Performance */} <div className="border border-gray-300 rounded overflow-hidden"> <SectionHeader title="FINANCIAL PERFORMANCE" bgColor="bg-green-100" /> <div className="grid grid-cols-6 gap-px bg-gray-200"> <MetricBox label="ROE:" value={`${metrics.roe}%`} benchmark="(>20%)" isGood={metrics.roe >= 20 ? true : metrics.roe >= 10 ? 'neutral' : false} /> <MetricBox label="ROA:" value={`${metrics.roa}%`} benchmark="(>10%)" isGood={metrics.roa >= 10} /> <MetricBox label="Profit Margin:" value={`${metrics.profitMargin}%`} benchmark="(>20%)" isGood={metrics.profitMargin >= 20 ? true : metrics.profitMargin >= 10 ? 'neutral' : false} /> <MetricBox label="Operative Margin:" value={`${metrics.opMargin}%`} benchmark="(>20%)" isGood={metrics.opMargin >= 20} /> <MetricBox label="Gross Margin:" value={`${metrics.grossMargin}%`} benchmark="(>40%)" isGood={metrics.grossMargin >= 40} /> <MetricBox label="ROIC:" value={`${metrics.roic}%`} benchmark="(>15%)" isGood={metrics.roic >= 15} /> </div> </div> </div> {/* Next 4 sections */} <div className="grid grid-cols-2 gap-2 mb-3"> {/* Growth Metrics */} <div className="border border-gray-300 rounded overflow-hidden"> <SectionHeader title="GROWTH METRICS" bgColor="bg-emerald-100" /> <div className="grid grid-cols-7 gap-px bg-gray-200"> <MetricBox label="Revenue (YoY):" value={`${metrics.revGrowth}%`} benchmark="(>10%)" isGood={metrics.revGrowth >= 10} /> <MetricBox label="Earning (YoY):" value={`${metrics.earnGrowth}%`} benchmark="(>0%)" isGood={metrics.earnGrowth >= 0} /> <MetricBox label="EPS (TTM):" value={`€${metrics.epsTTM}`} /> <MetricBox label="Forward EPS:" value={`€${metrics.forwardEPS}`} isGood={metrics.forwardEPS > metrics.epsTTM} /> <MetricBox label="Growth Rates:" value={`Capped: ${metrics.growthCapped}%`} benchmark={`Uncapped: ${metrics.growthUncapped}%`} /> <MetricBox label="Analyst Target:" value={`€${metrics.analystTarget}`} /> </div> </div> {/* Risk Indicators */} <div className="border border-gray-300 rounded overflow-hidden"> <SectionHeader title="RISK INDICATORS" bgColor="bg-red-100" /> <div className="grid grid-cols-6 gap-px bg-gray-200"> <MetricBox label="CRS (0-1):" value={metrics.crs.toFixed(2)} benchmark="(Medium)" isGood={metrics.crs < 0.4 ? true : metrics.crs < 0.6 ? 'neutral' : false} /> <MetricBox label="Debt/Equity (mrq):" value={metrics.debtEquity} benchmark="(0.5-1)" isGood={metrics.debtEquity < 1 ? true : metrics.debtEquity < 2 ? 'neutral' : false} /> <MetricBox label="Piotroski F:" value={metrics.fScore} benchmark="(≥7)" isGood={metrics.fScore >= 7 ? true : metrics.fScore >= 4 ? 'neutral' : false} /> <MetricBox label="Altman Z:" value={metrics.zScore.toFixed(2)} benchmark="(>3)" isGood={metrics.zScore >= 2.99 ? true : metrics.zScore >= 1.81 ? 'neutral' : false} /> <MetricBox label="Beneish M:" value={metrics.mScore.toFixed(2)} benchmark="(<-1.78)" isGood={metrics.mScore < -1.78} /> <MetricBox label="Value Trap:" value={`${metrics.valueTrapScore} (${metrics.valueTrapLabel})`} isGood={metrics.valueTrapScore < 40 ? true : metrics.valueTrapScore < 60 ? 'neutral' : false} /> </div> </div> </div> {/* Next 4 sections */} <div className="grid grid-cols-2 gap-2 mb-3"> {/* Liquidity & Free Cash Flow */} <div className="border border-gray-300 rounded overflow-hidden"> <SectionHeader title="LIQUIDITY & FREE CASH FLOW" bgColor="bg-cyan-100" /> <div className="grid grid-cols-7 gap-px bg-gray-200"> <MetricBox label="Current Ratio:" value={metrics.currentRatio.toFixed(2)} benchmark="(1-2)" isGood={metrics.currentRatio >= 1 && metrics.currentRatio <= 2 ? true : 'neutral'} /> <MetricBox label="Cash:" value={metrics.totalCash} /> <MetricBox label="Debt:" value={metrics.totalDebt} /> <MetricBox label="FCF Growth 5Y:" value={`${metrics.fcfGrowth5Y}%`} benchmark="(>5%)" isGood={metrics.fcfGrowth5Y >= 5} /> <MetricBox label="FCF Yield:" value={`${metrics.fcfYield}%`} benchmark="(>4%)" isGood={metrics.fcfYield >= 4} /> <MetricBox label="FCF Margin:" value={`${metrics.fcfMargin}%`} benchmark="(>15%)" isGood={metrics.fcfMargin >= 15 ? true : metrics.fcfMargin >= 10 ? 'neutral' : false} /> <MetricBox label="Payout Ratio:" value={`${metrics.payoutRatio}%`} benchmark="(<50%)" isGood={metrics.payoutRatio < 50} /> </div> </div> {/* Insider & Sentiment & Class */} <div className="border border-gray-300 rounded overflow-hidden"> <SectionHeader title="INSIDER & SENTIMENT & CLASS" bgColor="bg-purple-100" /> <div className="grid grid-cols-7 gap-px bg-gray-200"> <MetricBox label="Buys (12M):" value={metrics.insBuys} isGood={metrics.insBuys > metrics.insSells} /> <MetricBox label="Sells (12M):" value={metrics.insSells} /> <MetricBox label="Net Shares (12M):" value={metrics.netShares} /> <MetricBox label="Short Int (%):" value={`${metrics.shortInterest}%`} isGood={metrics.shortInterest < 5 ? true : metrics.shortInterest < 10 ? 'neutral' : false} /> <MetricBox label="Sentiment / Articles:" value={`${metrics.newsSentiment > 0 ? '+' : ''}${metrics.newsSentiment.toFixed(3)} / ${metrics.newsArticleCount}`} benchmark={metrics.newsSentiment > 0 ? '(Positive)' : '(Negative)'} isGood={metrics.newsSentiment > 0} /> <MetricBox label={`Stock: ${metrics.stockType}`} value={`Div Yield: ${metrics.divYield}%`} /> <MetricBox label="Sector/Industry:" value={`${metrics.sector} /`} benchmark={metrics.industry} /> </div> </div> </div> {/* Last 2 sections */} <div className="grid grid-cols-2 gap-2 mb-3"> {/* Quality Scores */} <div className="border border-gray-300 rounded overflow-hidden"> <SectionHeader title="QUALITY SCORES" bgColor="bg-orange-100" /> <div className="grid grid-cols-6 gap-px bg-gray-200"> <MetricBox label="CQVS:" value={metrics.cqvs.toFixed(1)} benchmark="(>70)" isGood={metrics.cqvs >= 70 ? true : metrics.cqvs >= 50 ? 'neutral' : false} /> <MetricBox label="Label:" value={metrics.label} /> <MetricBox label="Valuation:" value={metrics.valuation} isGood={metrics.valuation >= 70} /> <MetricBox label="Quality:" value={metrics.quality} isGood={metrics.quality >= 70 ? true : metrics.quality >= 50 ? 'neutral' : false} /> <MetricBox label="Strength:" value={metrics.strength} isGood={metrics.strength >= 70} /> <MetricBox label="Integrity:" value={metrics.integrity} isGood={metrics.integrity >= 70 ? true : metrics.integrity >= 50 ? 'neutral' : false} /> </div> </div> {/* Moat & Other */} <div className="border border-gray-300 rounded overflow-hidden"> <SectionHeader title="MOAT & OTHER" bgColor="bg-gray-200" /> <div className="grid grid-cols-6 gap-px bg-gray-200"> <MetricBox label="Buffett Moat:" value={metrics.buffettMoat} benchmark="(4-7)" isGood={metrics.buffettMoat >= 7 ? true : metrics.buffettMoat >= 4 ? 'neutral' : false} /> <MetricBox label="Greenblatt (MF):" value={`EY: ${metrics.greenblattEY}%`} benchmark={metrics.greenblattROC ? `ROC: ${metrics.greenblattROC}%` : 'ROC: N/A'} isGood={metrics.greenblattEY >= 8 ? true : metrics.greenblattEY >= 4 ? 'neutral' : false} /> <MetricBox label={`Beta: ${metrics.beta}`} value={`Vol 1Y: ${metrics.vol1Y}%`} isGood={metrics.beta < 1 ? true : metrics.beta < 1.5 ? 'neutral' : false} /> <MetricBox label="Earnings Predict.:" value={`${metrics.earningsPredict}%`} benchmark="(>80%)" isGood={metrics.earningsPredict >= 80 ? true : metrics.earningsPredict >= 60 ? 'neutral' : false} /> <MetricBox label="Drawdown (5Y):" value={`${metrics.maxDrawdown}%`} benchmark={metrics.maxDrawdown > -30 ? '(Low)' : metrics.maxDrawdown > -50 ? '(Mid)' : '(High)'} isGood={metrics.maxDrawdown > -30 ? true : metrics.maxDrawdown > -50 ? 'neutral' : false} /> <MetricBox label={`Completeness: ${metrics.completeness}%`} value={`Data Quality: ${metrics.dataQuality}`} isGood={metrics.dataQuality === 'High' ? true : metrics.dataQuality === 'Medium' ? 'neutral' : false} /> </div> </div> </div> {/* Charts Section - Enhanced with Legends */} <div className="grid grid-cols-3 gap-2 mb-3"> {/* Linear Price Chart + MACD */} <div className="border border-gray-300 rounded p-2"> <div className="text-sm font-bold mb-1 text-center">LINEAR PRICE CHART (10Y)</div> <div className="text-[7px] text-gray-500 mb-1 pl-1"> — Close Price — Total Return<br/> - - Market Value (Current): €{metrics.marketValueCurrent}<br/> - - Intrinsic Value (Current): €{metrics.intrinsicValueCurrent}<br/> - - Analyst Target: €{metrics.analystTarget} </div> <ResponsiveContainer width="100%" height={130}> <LineChart data={priceHistory}> <CartesianGrid strokeDasharray="3 3" stroke="#e0e0e0" /> <XAxis dataKey="date" tick={{ fontSize: 7 }} /> <YAxis tick={{ fontSize: 7 }} /> <Tooltip contentStyle={{ fontSize: 8 }} /> <Line type="monotone" dataKey="price" stroke="#1f2937" strokeWidth={1.5} dot={false} name="Close" /> <Line type="monotone" dataKey="totalReturn" stroke="#6b7280" strokeWidth={1} strokeDasharray="2 2" dot={false} name="Total Return" /> <Line type="monotone" dataKey="intrinsicValueCurrent" stroke="#16a34a" strokeWidth={1} strokeDasharray="5 5" dot={false} name="IV Current" /> <Line type="monotone" dataKey="analystTarget" stroke="#3b82f6" strokeWidth={1} strokeDasharray="3 3" dot={false} name="Target" /> </LineChart> </ResponsiveContainer> <div className="text-xs font-bold mt-1 mb-1 text-center">MACD</div> <ResponsiveContainer width="100%" height={55}> <LineChart data={macdData}> <CartesianGrid strokeDasharray="3 3" stroke="#e0e0e0" /> <XAxis dataKey="date" tick={{ fontSize: 6 }} /> <YAxis tick={{ fontSize: 6 }} /> <ReferenceLine y={0} stroke="#666" /> <Tooltip contentStyle={{ fontSize: 7 }} /> <Line type="monotone" dataKey="macd" stroke="#2563eb" strokeWidth={1} dot={false} name="MACD" /> <Line type="monotone" dataKey="signal" stroke="#dc2626" strokeWidth={1} dot={false} name="Signal" /> </LineChart> </ResponsiveContainer> </div> {/* Radar + Investor Personas + Forecast */} <div className="border border-gray-300 rounded p-2"> <div className="relative"> <ResponsiveContainer width="100%" height={140}> <RadarChart data={radarData}> <PolarGrid /> <PolarAngleAxis dataKey="metric" tick={{ fontSize: 6 }} /> <PolarRadiusAxis angle={30} domain={[0, 100]} tick={{ fontSize: 6 }} /> <Radar name={ticker} dataKey="value" stroke="#2563eb" fill="#3b82f6" fillOpacity={0.3} /> </RadarChart> </ResponsiveContainer> {/* Investor Persona Badges */} <PersonaBadge name="Buffett" score={metrics.buffettScore} position="top-0 left-1/4" /> <PersonaBadge name="Lynch" score={metrics.lynchScore} position="top-0 right-1/4" /> <PersonaBadge name="Munger" score={metrics.mungerScore} position="top-1/4 -left-2" /> <PersonaBadge name="Greenblatt" score={metrics.greenblattScore} position="top-1/4 -right-2" /> <PersonaBadge name="Dalio" score={metrics.dalioScore} position="bottom-1/4 -left-2" /> <PersonaBadge name="Graham" score={metrics.grahamScore} position="bottom-1/4 -right-2" /> <PersonaBadge name="Templeton" score={metrics.templetonScore} position="bottom-0 left-1/4" /> <PersonaBadge name="Soros" score={metrics.sorosScore} position="bottom-0 right-1/4" /> </div> <div className="text-center my-1"> <span className="bg-green-200 px-2 py-0.5 text-[10px] font-bold rounded border border-green-400"> Advice: {recommendation} (CQVS: {metrics.cqvs.toFixed(1)}) </span> </div> <div className="text-[8px] font-bold mb-0.5 text-center">1Y PRICE + 6-MONTH FORECAST</div> <div className="text-[6px] text-gray-500 mb-0.5 text-center">— Close — 50-Day MA — 200-Day MA ▒ Bollinger Bands - - Forecast</div> <ResponsiveContainer width="100%" height={70}> <ComposedChart data={oneYearData}> <CartesianGrid strokeDasharray="3 3" stroke="#e0e0e0" /> <XAxis dataKey="date" tick={{ fontSize: 6 }} /> <YAxis tick={{ fontSize: 6 }} /> <Tooltip contentStyle={{ fontSize: 7 }} /> <Area type="monotone" dataKey="upperBand" stroke="none" fill="#e0e0e0" fillOpacity={0.5} /> <Area type="monotone" dataKey="ci95Upper" stroke="none" fill="#dbeafe" fillOpacity={0.5} /> <Line type="monotone" dataKey="price" stroke="#1f2937" strokeWidth={1.5} dot={false} /> <Line type="monotone" dataKey="ma50" stroke="#f59e0b" strokeWidth={1} dot={false} /> <Line type="monotone" dataKey="ma200" stroke="#ef4444" strokeWidth={1} dot={false} /> <Line type="monotone" dataKey="forecast" stroke="#16a34a" strokeWidth={1.5} strokeDasharray="5 5" dot={false} /> </ComposedChart> </ResponsiveContainer> {/* Valuation Indicator */} <div className={`text-center text-[10px] font-bold mt-1 ${metrics.valuationPercent > 10 ? 'text-green-600' : metrics.valuationPercent < -10 ? 'text-red-600' : 'text-yellow-600'}`}> {metrics.valuationLabel} ({metrics.valuationPercent > 0 ? '+' : ''}{metrics.valuationPercent}%) </div> </div> {/* Log Price + RSI */} <div className="border border-gray-300 rounded p-2"> <div className="text-sm font-bold mb-1 text-center">LOG PRICE CHART (10Y)</div> <div className="text-[7px] text-gray-500 mb-1 pl-1"> — Close Price — Total Return<br/> - - Unrestr. Market Value (Current): €{metrics.unrestrictedMarketValueCurrent}<br/> - - Unrestr. Market Value (Next Year): €{metrics.unrestrictedMarketValueNextYear} </div> <ResponsiveContainer width="100%" height={130}> <LineChart data={priceHistory}> <CartesianGrid strokeDasharray="3 3" stroke="#e0e0e0" /> <XAxis dataKey="date" tick={{ fontSize: 7 }} /> <YAxis tick={{ fontSize: 7 }} scale="log" domain={['auto', 'auto']} /> <Tooltip contentStyle={{ fontSize: 8 }} /> <Line type="monotone" dataKey="price" stroke="#1f2937" strokeWidth={1.5} dot={false} name="Close" /> <Line type="monotone" dataKey="totalReturn" stroke="#6b7280" strokeWidth={1} strokeDasharray="2 2" dot={false} name="Total Return" /> <Line type="monotone" dataKey="unrestrictedCurrent" stroke="#dc2626" strokeWidth={1} strokeDasharray="5 5" dot={false} name="Unrestr Current" /> <Line type="monotone" dataKey="unrestrictedNextYear" stroke="#f97316" strokeWidth={1} strokeDasharray="5 5" dot={false} name="Unrestr Next" /> </LineChart> </ResponsiveContainer> <div className="text-xs font-bold mt-1 mb-1 text-center">RSI (14) = {rsiData[rsiData.length - 1].rsi}</div> <ResponsiveContainer width="100%" height={55}> <LineChart data={rsiData}> <CartesianGrid strokeDasharray="3 3" stroke="#e0e0e0" /> <XAxis dataKey="date" tick={{ fontSize: 6 }} /> <YAxis tick={{ fontSize: 6 }} domain={[0, 100]} /> <Tooltip contentStyle={{ fontSize: 7 }} /> <ReferenceLine y={70} stroke="#ef4444" strokeDasharray="2 2" /> <ReferenceLine y={30} stroke="#22c55e" strokeDasharray="2 2" /> <Line type="monotone" dataKey="rsi" stroke="#f59e0b" strokeWidth={1.5} dot={false} /> </LineChart> </ResponsiveContainer> </div> </div> {/* NEW: Ichimoku Cloud Chart */} <div className="border border-gray-300 rounded p-2 mb-3"> <div className="text-sm font-bold mb-1 text-center">ICHIMOKU CLOUD</div> <div className="flex gap-4 text-[7px] justify-center mb-1"> <span>— Close Price</span> <span className="text-blue-500">— Tenkan-sen (9)</span> <span className="text-red-500">— Kijun-sen (26)</span> <span className="text-gray-400">— Chikou Span</span> <span className="text-green-500">▒ Senkou Span A/B (Cloud)</span> <span className="ml-2 font-bold text-yellow-600">◆ TK Cross</span> <span className="text-purple-600">◆ Kumo Twist</span> </div> <ResponsiveContainer width="100%" height={100}> <ComposedChart data={ichimokuData}> <CartesianGrid strokeDasharray="3 3" stroke="#e0e0e0" /> <XAxis dataKey="date" tick={{ fontSize: 7 }} /> <YAxis tick={{ fontSize: 7 }} domain={['auto', 'auto']} /> <Tooltip contentStyle={{ fontSize: 8 }} /> <Area type="monotone" dataKey="senkouA" stroke="none" fill="#86efac" fillOpacity={0.3} /> <Area type="monotone" dataKey="senkouB" stroke="none" fill="#fca5a5" fillOpacity={0.3} /> <Line type="monotone" dataKey="price" stroke="#1f2937" strokeWidth={2} dot={false} name="Price" /> <Line type="monotone" dataKey="tenkan" stroke="#3b82f6" strokeWidth={1} dot={false} name="Tenkan" /> <Line type="monotone" dataKey="kijun" stroke="#dc2626" strokeWidth={1} dot={false} name="Kijun" /> <Line type="monotone" dataKey="chikou" stroke="#9ca3af" strokeWidth={1} strokeDasharray="3 3" dot={false} name="Chikou" /> <Scatter dataKey="tkCrossMarker" fill="#9333ea" shape="diamond" name="TK Cross" /> <Scatter dataKey="kumoTwistMarker" fill="#dc2626" shape="diamond" name="Kumo Twist" /> </ComposedChart> </ResponsiveContainer> <div className="flex gap-4 text-[8px] justify-center mt-1"> <span className="bg-green-100 px-2 rounded">{ichimokuSignals.tkCross}</span> <span className="bg-green-100 px-2 rounded">{ichimokuSignals.kumoTwist}</span> <span className="bg-green-100 px-2 rounded">{ichimokuSignals.priceVsCloud}</span> </div> </div> {/* Key Notes (Expandable) */} <div className="border border-gray-300 rounded overflow-hidden"> <button onClick={() => setShowKeyNotes(!showKeyNotes)} className="w-full bg-gray-100 px-3 py-2 text-left text-sm font-bold flex items-center hover:bg-gray-200" > <span className="mr-2">{showKeyNotes ? '▼' : '▶'}</span> Key Notes (Click to Expand) </button> {showKeyNotes && ( <div className="p-3 bg-gray-50"> <div className="grid grid-cols-3 gap-4 text-xs"> {/* Bull Case */} <div> <div className="font-bold text-green-700 mb-2 text-sm">BULL CASE ({bullCase.target})</div> <ul className="list-disc list-inside space-y-1"> {bullCase.points.map((point, i) => <li key={i}>{point}</li>)} </ul> </div> {/* Bear Case */} <div> <div className="font-bold text-red-700 mb-2 text-sm">BEAR CASE ({bearCase.target})</div> <ul className="list-disc list-inside space-y-1"> {bearCase.points.map((point, i) => <li key={i}>{point}</li>)} </ul> </div> {/* Entry/Exit Strategy */} <div> <div className="font-bold text-blue-700 mb-2 text-sm">ENTRY/EXIT STRATEGY</div> <ul className="list-disc list-inside space-y-1"> <li><strong>Ideal Entry:</strong> {entryStrategy.idealEntry}</li> <li><strong>Current:</strong> {entryStrategy.currentEntry}</li> <li><strong>Target:</strong> {entryStrategy.target}</li> <li><strong>Stop Loss:</strong> {entryStrategy.stopLoss}</li> <li><strong>Position Size:</strong> {entryStrategy.positionSize}</li> </ul> </div> </div> </div> )} </div> {/* Footer */} <div className="text-xs text-gray-500 text-center mt-3"> Analysis Date: {analysisDate} | Sources: SEC Filings, Company Reports | <span className="font-bold text-blue-600 ml-1">{recommendation}</span> </div> </div>); };
export default QuantDashboard;
CRITICAL STEPS:
Calculate all metrics during the comprehensive text analysis
Store metrics in variables as you calculate them
After completing full text analysis, create the React artifact
Replace ALL placeholder values in the template with actual calculated data
Use the EXACT template structure - do not modify the component code
Populate these specific data arrays:
metrics object (60+ values including investor persona scores)topNews array (5 recent headlines with dates)priceHistory array (10-year data with multiple valuation lines)oneYearData array (with MAs, Bollinger Bands, forecast)ichimokuData array (6-month with signal markers)ichimokuSignals object (TK cross, Kumo twist, price vs cloud)macdData array (6 recent points with histogram)rsiData array (6 recent points)radarData array (12 metrics, normalized 0-100)bullCase.points (5 points from bull case analysis)bearCase.points (5 points from bear case analysis)entryStrategy (5 values from entry/exit strategy)Normalize radar chart values properly:
Format values correctly:
"€100.00" (Euro is the default - use € not $)"€10B", "€2.5M"15.0 (number, not string with %)1.25 (number)7 (integer) or 75.0 (float)Growth metrics:
DO NOT:
This is the ONLY accepted dashboard format. All other dashboard styles are deprecated.
If stock is already in portfolio:
Use Stock Evaluator when:
Do NOT use this skill when:
Output includes:
Before presenting analysis, verify:
If any checklist item incomplete: STOP and gather more information. If data genuinely unavailable after searching: Use "N/A" - never fabricate.
[See complete example in EVALUATION-WORKFLOWS.md for detailed walkthrough]
After each evaluation:
The goal is to discover genuinely attractive investment opportunities that fit the user's profile with adequate margin of safety and acceptable risk.
No automatic installation available. Please visit the source repository for installation instructions.
View Installation Instructions1,500+ AI skills, agents & workflows. Install in 30 seconds. Part of the Torly.ai family.
© 2026 Torly.ai. All rights reserved.