quantwise 1.2.0 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/README.md +80 -0
- package/.claude/skills/backtest-expert/SKILL.md +206 -0
- package/.claude/skills/backtest-expert/references/failed_tests.md +236 -0
- package/.claude/skills/backtest-expert/references/methodology.md +227 -0
- package/.claude/skills/breadth-chart-analyst/SKILL.md +583 -0
- package/.claude/skills/breadth-chart-analyst/assets/SP500_Breadth_Index_200MA_8MA.jpeg +0 -0
- package/.claude/skills/breadth-chart-analyst/assets/US_Stock_Market_Uptrend_Ratio.jpeg +0 -0
- package/.claude/skills/breadth-chart-analyst/assets/breadth_analysis_template.md +558 -0
- package/.claude/skills/breadth-chart-analyst/references/breadth_chart_methodology.md +590 -0
- package/.claude/skills/canslim-screener/SKILL.md +599 -0
- package/.claude/skills/canslim-screener/references/canslim_methodology.md +606 -0
- package/.claude/skills/canslim-screener/references/fmp_api_endpoints.md +707 -0
- package/.claude/skills/canslim-screener/references/interpretation_guide.md +516 -0
- package/.claude/skills/canslim-screener/references/scoring_system.md +597 -0
- package/.claude/skills/canslim-screener/scripts/calculators/earnings_calculator.py +343 -0
- package/.claude/skills/canslim-screener/scripts/calculators/growth_calculator.py +334 -0
- package/.claude/skills/canslim-screener/scripts/calculators/institutional_calculator.py +347 -0
- package/.claude/skills/canslim-screener/scripts/calculators/leadership_calculator.py +380 -0
- package/.claude/skills/canslim-screener/scripts/calculators/market_calculator.py +244 -0
- package/.claude/skills/canslim-screener/scripts/calculators/new_highs_calculator.py +194 -0
- package/.claude/skills/canslim-screener/scripts/calculators/supply_demand_calculator.py +221 -0
- package/.claude/skills/canslim-screener/scripts/finviz_stock_client.py +227 -0
- package/.claude/skills/canslim-screener/scripts/fmp_client.py +393 -0
- package/.claude/skills/canslim-screener/scripts/report_generator.py +405 -0
- package/.claude/skills/canslim-screener/scripts/scorer.py +625 -0
- package/.claude/skills/canslim-screener/scripts/screen_canslim.py +361 -0
- package/.claude/skills/canslim-screener/scripts/test_institutional_endpoint.py +109 -0
- package/.claude/skills/chart/SKILL.md +20 -0
- package/.claude/skills/dividend-growth-pullback-screener/SKILL.md +322 -0
- package/.claude/skills/dividend-growth-pullback-screener/references/dividend_growth_compounding.md +400 -0
- package/.claude/skills/dividend-growth-pullback-screener/references/fmp_api_guide.md +642 -0
- package/.claude/skills/dividend-growth-pullback-screener/references/rsi_oversold_strategy.md +333 -0
- package/.claude/skills/dividend-growth-pullback-screener/scripts/screen_dividend_growth_rsi.py +1155 -0
- package/.claude/skills/earnings-calendar/SKILL.md +721 -0
- package/.claude/skills/earnings-calendar/assets/earnings_report_template.md +102 -0
- package/.claude/skills/earnings-calendar/references/fmp_api_guide.md +590 -0
- package/.claude/skills/earnings-calendar/scripts/fetch_earnings_fmp.py +443 -0
- package/.claude/skills/earnings-calendar/scripts/generate_report.py +366 -0
- package/.claude/skills/economic-calendar-fetcher/SKILL.md +365 -0
- package/.claude/skills/economic-calendar-fetcher/references/fmp_api_documentation.md +345 -0
- package/.claude/skills/economic-calendar-fetcher/scripts/get_economic_calendar.py +267 -0
- package/.claude/skills/ftd-detector/SKILL.md +147 -0
- package/.claude/skills/ftd-detector/references/ftd_methodology.md +188 -0
- package/.claude/skills/ftd-detector/references/post_ftd_guide.md +185 -0
- package/.claude/skills/ftd-detector/scripts/fmp_client.py +158 -0
- package/.claude/skills/ftd-detector/scripts/ftd_detector.py +280 -0
- package/.claude/skills/ftd-detector/scripts/post_ftd_monitor.py +404 -0
- package/.claude/skills/ftd-detector/scripts/rally_tracker.py +508 -0
- package/.claude/skills/ftd-detector/scripts/report_generator.py +341 -0
- package/.claude/skills/ftd-detector/scripts/tests/conftest.py +9 -0
- package/.claude/skills/ftd-detector/scripts/tests/helpers.py +107 -0
- package/.claude/skills/ftd-detector/scripts/tests/test_post_ftd_monitor.py +311 -0
- package/.claude/skills/ftd-detector/scripts/tests/test_rally_tracker.py +302 -0
- package/.claude/skills/institutional-flow-tracker/README.md +362 -0
- package/.claude/skills/institutional-flow-tracker/SKILL.md +357 -0
- package/.claude/skills/institutional-flow-tracker/references/13f_filings_guide.md +383 -0
- package/.claude/skills/institutional-flow-tracker/references/institutional_investor_types.md +580 -0
- package/.claude/skills/institutional-flow-tracker/references/interpretation_framework.md +573 -0
- package/.claude/skills/institutional-flow-tracker/scripts/analyze_single_stock.py +457 -0
- package/.claude/skills/institutional-flow-tracker/scripts/track_institution_portfolio.py +108 -0
- package/.claude/skills/institutional-flow-tracker/scripts/track_institutional_flow.py +450 -0
- package/.claude/skills/macro-regime-detector/SKILL.md +86 -0
- package/.claude/skills/macro-regime-detector/references/historical_regimes.md +124 -0
- package/.claude/skills/macro-regime-detector/references/indicator_interpretation_guide.md +144 -0
- package/.claude/skills/macro-regime-detector/references/regime_detection_methodology.md +138 -0
- package/.claude/skills/macro-regime-detector/scripts/calculators/__init__.py +1 -0
- package/.claude/skills/macro-regime-detector/scripts/calculators/concentration_calculator.py +165 -0
- package/.claude/skills/macro-regime-detector/scripts/calculators/credit_conditions_calculator.py +124 -0
- package/.claude/skills/macro-regime-detector/scripts/calculators/equity_bond_calculator.py +198 -0
- package/.claude/skills/macro-regime-detector/scripts/calculators/sector_rotation_calculator.py +123 -0
- package/.claude/skills/macro-regime-detector/scripts/calculators/size_factor_calculator.py +131 -0
- package/.claude/skills/macro-regime-detector/scripts/calculators/utils.py +347 -0
- package/.claude/skills/macro-regime-detector/scripts/calculators/yield_curve_calculator.py +279 -0
- package/.claude/skills/macro-regime-detector/scripts/fmp_client.py +134 -0
- package/.claude/skills/macro-regime-detector/scripts/macro_regime_detector.py +278 -0
- package/.claude/skills/macro-regime-detector/scripts/report_generator.py +327 -0
- package/.claude/skills/macro-regime-detector/scripts/scorer.py +574 -0
- package/.claude/skills/macro-regime-detector/scripts/tests/conftest.py +9 -0
- package/.claude/skills/macro-regime-detector/scripts/tests/test_concentration.py +78 -0
- package/.claude/skills/macro-regime-detector/scripts/tests/test_credit_conditions.py +59 -0
- package/.claude/skills/macro-regime-detector/scripts/tests/test_equity_bond.py +74 -0
- package/.claude/skills/macro-regime-detector/scripts/tests/test_helpers.py +90 -0
- package/.claude/skills/macro-regime-detector/scripts/tests/test_scorer.py +439 -0
- package/.claude/skills/macro-regime-detector/scripts/tests/test_sector_rotation.py +78 -0
- package/.claude/skills/macro-regime-detector/scripts/tests/test_size_factor.py +59 -0
- package/.claude/skills/macro-regime-detector/scripts/tests/test_utils.py +126 -0
- package/.claude/skills/macro-regime-detector/scripts/tests/test_yield_curve.py +64 -0
- package/.claude/skills/market-breadth-analyzer/SKILL.md +121 -0
- package/.claude/skills/market-breadth-analyzer/references/breadth_analysis_methodology.md +168 -0
- package/.claude/skills/market-breadth-analyzer/scripts/calculators/__init__.py +1 -0
- package/.claude/skills/market-breadth-analyzer/scripts/calculators/bearish_signal_calculator.py +150 -0
- package/.claude/skills/market-breadth-analyzer/scripts/calculators/cycle_calculator.py +168 -0
- package/.claude/skills/market-breadth-analyzer/scripts/calculators/divergence_calculator.py +119 -0
- package/.claude/skills/market-breadth-analyzer/scripts/calculators/historical_context_calculator.py +120 -0
- package/.claude/skills/market-breadth-analyzer/scripts/calculators/ma_crossover_calculator.py +115 -0
- package/.claude/skills/market-breadth-analyzer/scripts/calculators/trend_level_calculator.py +103 -0
- package/.claude/skills/market-breadth-analyzer/scripts/csv_client.py +225 -0
- package/.claude/skills/market-breadth-analyzer/scripts/market_breadth_analyzer.py +307 -0
- package/.claude/skills/market-breadth-analyzer/scripts/report_generator.py +330 -0
- package/.claude/skills/market-breadth-analyzer/scripts/scorer.py +271 -0
- package/.claude/skills/market-environment-analysis/SKILL.md +139 -0
- package/.claude/skills/market-environment-analysis/references/analysis_patterns.md +124 -0
- package/.claude/skills/market-environment-analysis/references/indicators.md +99 -0
- package/.claude/skills/market-environment-analysis/scripts/market_utils.py +127 -0
- package/.claude/skills/market-news-analyst/SKILL.md +714 -0
- package/.claude/skills/market-news-analyst/references/corporate_news_impact.md +446 -0
- package/.claude/skills/market-news-analyst/references/geopolitical_commodity_correlations.md +499 -0
- package/.claude/skills/market-news-analyst/references/market_event_patterns.md +393 -0
- package/.claude/skills/market-news-analyst/references/trusted_news_sources.md +510 -0
- package/.claude/skills/market-top-detector/SKILL.md +159 -0
- package/.claude/skills/market-top-detector/references/distribution_day_guide.md +100 -0
- package/.claude/skills/market-top-detector/references/historical_tops.md +142 -0
- package/.claude/skills/market-top-detector/references/market_top_methodology.md +167 -0
- package/.claude/skills/market-top-detector/scripts/calculators/__init__.py +17 -0
- package/.claude/skills/market-top-detector/scripts/calculators/breadth_calculator.py +116 -0
- package/.claude/skills/market-top-detector/scripts/calculators/defensive_rotation_calculator.py +127 -0
- package/.claude/skills/market-top-detector/scripts/calculators/distribution_day_calculator.py +161 -0
- package/.claude/skills/market-top-detector/scripts/calculators/index_technical_calculator.py +254 -0
- package/.claude/skills/market-top-detector/scripts/calculators/leading_stock_calculator.py +198 -0
- package/.claude/skills/market-top-detector/scripts/calculators/sentiment_calculator.py +213 -0
- package/.claude/skills/market-top-detector/scripts/fmp_client.py +158 -0
- package/.claude/skills/market-top-detector/scripts/market_top_detector.py +349 -0
- package/.claude/skills/market-top-detector/scripts/report_generator.py +314 -0
- package/.claude/skills/market-top-detector/scripts/scorer.py +473 -0
- package/.claude/skills/market-top-detector/scripts/tests/conftest.py +9 -0
- package/.claude/skills/market-top-detector/scripts/tests/helpers.py +49 -0
- package/.claude/skills/market-top-detector/scripts/tests/test_breadth.py +62 -0
- package/.claude/skills/market-top-detector/scripts/tests/test_defensive_rotation.py +56 -0
- package/.claude/skills/market-top-detector/scripts/tests/test_distribution_day.py +92 -0
- package/.claude/skills/market-top-detector/scripts/tests/test_index_technical.py +73 -0
- package/.claude/skills/market-top-detector/scripts/tests/test_leading_stock.py +57 -0
- package/.claude/skills/market-top-detector/scripts/tests/test_scorer.py +180 -0
- package/.claude/skills/market-top-detector/scripts/tests/test_sentiment.py +64 -0
- package/.claude/skills/options-strategy-advisor/README.md +469 -0
- package/.claude/skills/options-strategy-advisor/SKILL.md +959 -0
- package/.claude/skills/options-strategy-advisor/scripts/black_scholes.py +495 -0
- package/.claude/skills/pair-trade-screener/README.md +389 -0
- package/.claude/skills/pair-trade-screener/SKILL.md +622 -0
- package/.claude/skills/pair-trade-screener/references/cointegration_guide.md +745 -0
- package/.claude/skills/pair-trade-screener/references/methodology.md +853 -0
- package/.claude/skills/pair-trade-screener/scripts/analyze_spread.py +394 -0
- package/.claude/skills/pair-trade-screener/scripts/find_pairs.py +535 -0
- package/.claude/skills/portfolio-manager/README.md +394 -0
- package/.claude/skills/portfolio-manager/SKILL.md +750 -0
- package/.claude/skills/portfolio-manager/references/alpaca-mcp-setup.md +367 -0
- package/.claude/skills/portfolio-manager/references/asset-allocation.md +502 -0
- package/.claude/skills/portfolio-manager/references/diversification-principles.md +553 -0
- package/.claude/skills/portfolio-manager/references/portfolio-risk-metrics.md +603 -0
- package/.claude/skills/portfolio-manager/references/position-evaluation.md +477 -0
- package/.claude/skills/portfolio-manager/references/rebalancing-strategies.md +715 -0
- package/.claude/skills/portfolio-manager/references/risk-profile-questionnaire.md +608 -0
- package/.claude/skills/portfolio-manager/references/target-allocations.md +558 -0
- package/.claude/skills/portfolio-manager/scripts/test_alpaca_connection.py +286 -0
- package/.claude/skills/scenario-analyzer/SKILL.md +317 -0
- package/.claude/skills/scenario-analyzer/references/headline_event_patterns.md +264 -0
- package/.claude/skills/scenario-analyzer/references/scenario_playbooks.md +320 -0
- package/.claude/skills/scenario-analyzer/references/sector_sensitivity_matrix.md +217 -0
- package/.claude/skills/sector-analyst/SKILL.md +206 -0
- package/.claude/skills/sector-analyst/assets/industory_performance_1.jpeg +0 -0
- package/.claude/skills/sector-analyst/assets/industory_performance_2.jpeg +0 -0
- package/.claude/skills/sector-analyst/assets/sector_performance.jpeg +0 -0
- package/.claude/skills/sector-analyst/references/sector_rotation.md +170 -0
- package/.claude/skills/stanley-druckenmiller-investment/SKILL.md +84 -0
- package/.claude/skills/stanley-druckenmiller-investment/references/case-studies.md +148 -0
- package/.claude/skills/stanley-druckenmiller-investment/references/investment-philosophy.md +80 -0
- package/.claude/skills/stanley-druckenmiller-investment/references/market-analysis-guide.md +146 -0
- package/.claude/skills/stock/NOTION_SETUP.md +33 -0
- package/.claude/skills/stock/SKILL.md +38 -0
- package/.claude/skills/technical-analyst/SKILL.md +238 -0
- package/.claude/skills/technical-analyst/assets/analysis_template.md +183 -0
- package/.claude/skills/technical-analyst/references/technical_analysis_framework.md +282 -0
- package/.claude/skills/theme-detector/SKILL.md +320 -0
- package/.claude/skills/theme-detector/assets/report_template.md +155 -0
- package/.claude/skills/theme-detector/references/cross_sector_themes.md +252 -0
- package/.claude/skills/theme-detector/references/finviz_industry_codes.md +403 -0
- package/.claude/skills/theme-detector/references/thematic_etf_catalog.md +333 -0
- package/.claude/skills/theme-detector/references/theme_detection_methodology.md +430 -0
- package/.claude/skills/theme-detector/scripts/calculators/__init__.py +1 -0
- package/.claude/skills/theme-detector/scripts/calculators/heat_calculator.py +123 -0
- package/.claude/skills/theme-detector/scripts/calculators/industry_ranker.py +98 -0
- package/.claude/skills/theme-detector/scripts/calculators/lifecycle_calculator.py +172 -0
- package/.claude/skills/theme-detector/scripts/calculators/theme_classifier.py +195 -0
- package/.claude/skills/theme-detector/scripts/calculators/theme_discoverer.py +280 -0
- package/.claude/skills/theme-detector/scripts/config_loader.py +142 -0
- package/.claude/skills/theme-detector/scripts/default_theme_config.py +254 -0
- package/.claude/skills/theme-detector/scripts/etf_scanner.py +609 -0
- package/.claude/skills/theme-detector/scripts/finviz_performance_client.py +131 -0
- package/.claude/skills/theme-detector/scripts/report_generator.py +490 -0
- package/.claude/skills/theme-detector/scripts/representative_stock_selector.py +673 -0
- package/.claude/skills/theme-detector/scripts/scorer.py +87 -0
- package/.claude/skills/theme-detector/scripts/tests/README.md +21 -0
- package/.claude/skills/theme-detector/scripts/tests/conftest.py +9 -0
- package/.claude/skills/theme-detector/scripts/tests/test_config_loader.py +239 -0
- package/.claude/skills/theme-detector/scripts/tests/test_etf_scanner.py +810 -0
- package/.claude/skills/theme-detector/scripts/tests/test_heat_calculator.py +245 -0
- package/.claude/skills/theme-detector/scripts/tests/test_industry_ranker.py +256 -0
- package/.claude/skills/theme-detector/scripts/tests/test_lifecycle_calculator.py +301 -0
- package/.claude/skills/theme-detector/scripts/tests/test_report_generator.py +624 -0
- package/.claude/skills/theme-detector/scripts/tests/test_representative_stock_selector.py +898 -0
- package/.claude/skills/theme-detector/scripts/tests/test_scorer.py +185 -0
- package/.claude/skills/theme-detector/scripts/tests/test_theme_classifier.py +534 -0
- package/.claude/skills/theme-detector/scripts/tests/test_theme_detector_e2e.py +467 -0
- package/.claude/skills/theme-detector/scripts/tests/test_theme_discoverer.py +458 -0
- package/.claude/skills/theme-detector/scripts/tests/test_uptrend_client.py +76 -0
- package/.claude/skills/theme-detector/scripts/theme_detector.py +815 -0
- package/.claude/skills/theme-detector/scripts/themes.yaml +168 -0
- package/.claude/skills/theme-detector/scripts/uptrend_client.py +241 -0
- package/.claude/skills/uptrend-analyzer/SKILL.md +108 -0
- package/.claude/skills/uptrend-analyzer/references/uptrend_methodology.md +215 -0
- package/.claude/skills/uptrend-analyzer/scripts/calculators/__init__.py +1 -0
- package/.claude/skills/uptrend-analyzer/scripts/calculators/historical_context_calculator.py +122 -0
- package/.claude/skills/uptrend-analyzer/scripts/calculators/market_breadth_calculator.py +145 -0
- package/.claude/skills/uptrend-analyzer/scripts/calculators/momentum_calculator.py +183 -0
- package/.claude/skills/uptrend-analyzer/scripts/calculators/sector_participation_calculator.py +204 -0
- package/.claude/skills/uptrend-analyzer/scripts/calculators/sector_rotation_calculator.py +218 -0
- package/.claude/skills/uptrend-analyzer/scripts/data_fetcher.py +236 -0
- package/.claude/skills/uptrend-analyzer/scripts/report_generator.py +329 -0
- package/.claude/skills/uptrend-analyzer/scripts/scorer.py +276 -0
- package/.claude/skills/uptrend-analyzer/scripts/uptrend_analyzer.py +219 -0
- package/.claude/skills/us-market-bubble-detector/CHANGELOG.md +118 -0
- package/.claude/skills/us-market-bubble-detector/SKILL.md +545 -0
- package/.claude/skills/us-market-bubble-detector/references/bubble_framework.md +335 -0
- package/.claude/skills/us-market-bubble-detector/references/historical_cases.md +327 -0
- package/.claude/skills/us-market-bubble-detector/references/implementation_guide.md +473 -0
- package/.claude/skills/us-market-bubble-detector/references/quick_reference.md +354 -0
- package/.claude/skills/us-market-bubble-detector/references/quick_reference_en.md +342 -0
- package/.claude/skills/us-market-bubble-detector/scripts/bubble_scorer.py +309 -0
- package/.claude/skills/us-stock-analysis/SKILL.md +294 -0
- package/.claude/skills/us-stock-analysis/references/financial-metrics.md +172 -0
- package/.claude/skills/us-stock-analysis/references/fundamental-analysis.md +129 -0
- package/.claude/skills/us-stock-analysis/references/report-template.md +207 -0
- package/.claude/skills/us-stock-analysis/references/technical-analysis.md +93 -0
- package/.claude/skills/value-dividend-screener/SKILL.md +562 -0
- package/.claude/skills/value-dividend-screener/references/fmp_api_guide.md +348 -0
- package/.claude/skills/value-dividend-screener/references/screening_methodology.md +315 -0
- package/.claude/skills/value-dividend-screener/scripts/screen_dividend_stocks.py +1138 -0
- package/.claude/skills/vcp-screener/SKILL.md +79 -0
- package/.claude/skills/vcp-screener/references/fmp_api_endpoints.md +45 -0
- package/.claude/skills/vcp-screener/references/scoring_system.md +154 -0
- package/.claude/skills/vcp-screener/references/vcp_methodology.md +124 -0
- package/.claude/skills/vcp-screener/scripts/calculators/__init__.py +1 -0
- package/.claude/skills/vcp-screener/scripts/calculators/pivot_proximity_calculator.py +139 -0
- package/.claude/skills/vcp-screener/scripts/calculators/relative_strength_calculator.py +161 -0
- package/.claude/skills/vcp-screener/scripts/calculators/trend_template_calculator.py +228 -0
- package/.claude/skills/vcp-screener/scripts/calculators/vcp_pattern_calculator.py +322 -0
- package/.claude/skills/vcp-screener/scripts/calculators/volume_pattern_calculator.py +121 -0
- package/.claude/skills/vcp-screener/scripts/fmp_client.py +162 -0
- package/.claude/skills/vcp-screener/scripts/report_generator.py +317 -0
- package/.claude/skills/vcp-screener/scripts/scorer.py +155 -0
- package/.claude/skills/vcp-screener/scripts/screen_vcp.py +536 -0
- package/.claude/skills/vcp-screener/scripts/tests/__init__.py +0 -0
- package/.claude/skills/vcp-screener/scripts/tests/conftest.py +9 -0
- package/.claude/skills/vcp-screener/scripts/tests/test_vcp_screener.py +834 -0
- package/.claude/skills/weekly-trade-strategy/.claude/agents/druckenmiller-strategy-planner.md +300 -0
- package/.claude/skills/weekly-trade-strategy/.claude/agents/market-news-analyzer.md +239 -0
- package/.claude/skills/weekly-trade-strategy/.claude/agents/technical-market-analyst.md +187 -0
- package/.claude/skills/weekly-trade-strategy/.claude/agents/us-market-analyst.md +218 -0
- package/.claude/skills/weekly-trade-strategy/.claude/agents/weekly-trade-blog-writer.md +318 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/breadth-chart-analyst/SKILL.md +662 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/breadth-chart-analyst/assets/SP500_Breadth_Index_200MA_8MA.jpeg +0 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/breadth-chart-analyst/assets/US_Stock_Market_Uptrend_Ratio.jpeg +0 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/breadth-chart-analyst/assets/breadth_analysis_template.md +558 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/breadth-chart-analyst/references/breadth_chart_methodology.md +590 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/earnings-calendar/SKILL.md +721 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/earnings-calendar/assets/earnings_report_template.md +102 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/earnings-calendar/earnings_calendar_2025-11-02.md +447 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/earnings-calendar/references/fmp_api_guide.md +590 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/earnings-calendar/scripts/fetch_earnings_fmp.py +443 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/earnings-calendar/scripts/generate_report.py +366 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/economic-calendar-fetcher/SKILL.md +365 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/economic-calendar-fetcher/references/fmp_api_documentation.md +345 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/economic-calendar-fetcher/scripts/get_economic_calendar.py +267 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/market-environment-analysis/SKILL.md +139 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/market-environment-analysis/references/analysis_patterns.md +124 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/market-environment-analysis/references/indicators.md +99 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/market-environment-analysis/scripts/market_utils.py +127 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/market-news-analyst/SKILL.md +714 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/market-news-analyst/references/corporate_news_impact.md +446 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/market-news-analyst/references/geopolitical_commodity_correlations.md +499 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/market-news-analyst/references/market_event_patterns.md +393 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/market-news-analyst/references/trusted_news_sources.md +510 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/sector-analyst/SKILL.md +206 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/sector-analyst/assets/industory_performance_1.jpeg +0 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/sector-analyst/assets/industory_performance_2.jpeg +0 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/sector-analyst/assets/sector_performance.jpeg +0 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/sector-analyst/references/sector_rotation.md +170 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/stanley-druckenmiller-investment/SKILL.md +84 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/stanley-druckenmiller-investment/references/case-studies.md +148 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/stanley-druckenmiller-investment/references/investment-philosophy.md +80 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/stanley-druckenmiller-investment/references/market-analysis-guide.md +146 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/technical-analyst/SKILL.md +238 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/technical-analyst/assets/analysis_template.md +183 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/technical-analyst/references/technical_analysis_framework.md +282 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/us-market-bubble-detector/CHANGELOG.md +118 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/us-market-bubble-detector/SKILL.md +545 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/us-market-bubble-detector/references/bubble_framework.md +335 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/us-market-bubble-detector/references/historical_cases.md +327 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/us-market-bubble-detector/references/implementation_guide.md +473 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/us-market-bubble-detector/references/quick_reference.md +354 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/us-market-bubble-detector/references/quick_reference_en.md +342 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/us-market-bubble-detector/scripts/bubble_scorer.py +309 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/us-stock-analysis/SKILL.md +294 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/us-stock-analysis/references/financial-metrics.md +172 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/us-stock-analysis/references/fundamental-analysis.md +129 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/us-stock-analysis/references/report-template.md +207 -0
- package/.claude/skills/weekly-trade-strategy/.claude/skills/us-stock-analysis/references/technical-analysis.md +93 -0
- package/.claude/skills/weekly-trade-strategy/CLAUDE.md +454 -0
- package/.claude/skills/weekly-trade-strategy/README.md +287 -0
- package/.claude/skills/weekly-trade-strategy/blogs/.gitkeep +0 -0
- package/.claude/skills/weekly-trade-strategy/charts/.gitkeep +0 -0
- package/.claude/skills/weekly-trade-strategy/earnings_data.json +10054 -0
- package/.claude/skills/weekly-trade-strategy/skills/breadth-chart-analyst/SKILL.md +662 -0
- package/.claude/skills/weekly-trade-strategy/skills/breadth-chart-analyst/assets/SP500_Breadth_Index_200MA_8MA.jpeg +0 -0
- package/.claude/skills/weekly-trade-strategy/skills/breadth-chart-analyst/assets/US_Stock_Market_Uptrend_Ratio.jpeg +0 -0
- package/.claude/skills/weekly-trade-strategy/skills/breadth-chart-analyst/assets/breadth_analysis_template.md +558 -0
- package/.claude/skills/weekly-trade-strategy/skills/breadth-chart-analyst/references/breadth_chart_methodology.md +590 -0
- package/.claude/skills/weekly-trade-strategy/skills/earnings-calendar/SKILL.md +721 -0
- package/.claude/skills/weekly-trade-strategy/skills/earnings-calendar/assets/earnings_report_template.md +102 -0
- package/.claude/skills/weekly-trade-strategy/skills/earnings-calendar/earnings_calendar_2025-11-02.md +447 -0
- package/.claude/skills/weekly-trade-strategy/skills/earnings-calendar/references/fmp_api_guide.md +590 -0
- package/.claude/skills/weekly-trade-strategy/skills/earnings-calendar/scripts/fetch_earnings_fmp.py +443 -0
- package/.claude/skills/weekly-trade-strategy/skills/earnings-calendar/scripts/generate_report.py +366 -0
- package/.claude/skills/weekly-trade-strategy/skills/economic-calendar-fetcher/SKILL.md +365 -0
- package/.claude/skills/weekly-trade-strategy/skills/economic-calendar-fetcher/references/fmp_api_documentation.md +345 -0
- package/.claude/skills/weekly-trade-strategy/skills/economic-calendar-fetcher/scripts/get_economic_calendar.py +267 -0
- package/.claude/skills/weekly-trade-strategy/skills/market-environment-analysis/SKILL.md +139 -0
- package/.claude/skills/weekly-trade-strategy/skills/market-environment-analysis/references/analysis_patterns.md +124 -0
- package/.claude/skills/weekly-trade-strategy/skills/market-environment-analysis/references/indicators.md +99 -0
- package/.claude/skills/weekly-trade-strategy/skills/market-environment-analysis/scripts/market_utils.py +127 -0
- package/.claude/skills/weekly-trade-strategy/skills/market-news-analyst/SKILL.md +714 -0
- package/.claude/skills/weekly-trade-strategy/skills/market-news-analyst/references/corporate_news_impact.md +446 -0
- package/.claude/skills/weekly-trade-strategy/skills/market-news-analyst/references/geopolitical_commodity_correlations.md +499 -0
- package/.claude/skills/weekly-trade-strategy/skills/market-news-analyst/references/market_event_patterns.md +393 -0
- package/.claude/skills/weekly-trade-strategy/skills/market-news-analyst/references/trusted_news_sources.md +510 -0
- package/.claude/skills/weekly-trade-strategy/skills/sector-analyst/SKILL.md +206 -0
- package/.claude/skills/weekly-trade-strategy/skills/sector-analyst/assets/industory_performance_1.jpeg +0 -0
- package/.claude/skills/weekly-trade-strategy/skills/sector-analyst/assets/industory_performance_2.jpeg +0 -0
- package/.claude/skills/weekly-trade-strategy/skills/sector-analyst/assets/sector_performance.jpeg +0 -0
- package/.claude/skills/weekly-trade-strategy/skills/sector-analyst/references/sector_rotation.md +170 -0
- package/.claude/skills/weekly-trade-strategy/skills/stanley-druckenmiller-investment/SKILL.md +84 -0
- package/.claude/skills/weekly-trade-strategy/skills/stanley-druckenmiller-investment/references/case-studies.md +148 -0
- package/.claude/skills/weekly-trade-strategy/skills/stanley-druckenmiller-investment/references/investment-philosophy.md +80 -0
- package/.claude/skills/weekly-trade-strategy/skills/stanley-druckenmiller-investment/references/market-analysis-guide.md +146 -0
- package/.claude/skills/weekly-trade-strategy/skills/technical-analyst/SKILL.md +238 -0
- package/.claude/skills/weekly-trade-strategy/skills/technical-analyst/assets/analysis_template.md +183 -0
- package/.claude/skills/weekly-trade-strategy/skills/technical-analyst/references/technical_analysis_framework.md +282 -0
- package/.claude/skills/weekly-trade-strategy/skills/us-market-bubble-detector/CHANGELOG.md +118 -0
- package/.claude/skills/weekly-trade-strategy/skills/us-market-bubble-detector/SKILL.md +545 -0
- package/.claude/skills/weekly-trade-strategy/skills/us-market-bubble-detector/references/bubble_framework.md +335 -0
- package/.claude/skills/weekly-trade-strategy/skills/us-market-bubble-detector/references/historical_cases.md +327 -0
- package/.claude/skills/weekly-trade-strategy/skills/us-market-bubble-detector/references/implementation_guide.md +473 -0
- package/.claude/skills/weekly-trade-strategy/skills/us-market-bubble-detector/references/quick_reference.md +354 -0
- package/.claude/skills/weekly-trade-strategy/skills/us-market-bubble-detector/references/quick_reference_en.md +342 -0
- package/.claude/skills/weekly-trade-strategy/skills/us-market-bubble-detector/scripts/bubble_scorer.py +309 -0
- package/.claude/skills/weekly-trade-strategy/skills/us-stock-analysis/SKILL.md +294 -0
- package/.claude/skills/weekly-trade-strategy/skills/us-stock-analysis/references/financial-metrics.md +172 -0
- package/.claude/skills/weekly-trade-strategy/skills/us-stock-analysis/references/fundamental-analysis.md +129 -0
- package/.claude/skills/weekly-trade-strategy/skills/us-stock-analysis/references/report-template.md +207 -0
- package/.claude/skills/weekly-trade-strategy/skills/us-stock-analysis/references/technical-analysis.md +93 -0
- package/.mcp.json +3 -0
- package/cli.mjs +16 -16
- package/package.json +4 -2
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
# Theme Detection Methodology
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The Theme Detector uses a **3-Dimensional Scoring Model** to identify, rank, and assess market themes. Unlike single-score ranking systems, this approach separates the intensity of a theme (heat), its maturity stage (lifecycle), and the reliability of the signal (confidence) into independent dimensions.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Dimension 1: Theme Heat (0-100)
|
|
10
|
+
|
|
11
|
+
Theme Heat measures the **direction-neutral strength** of a theme. A high heat score means the theme is generating significant market activity, regardless of whether it is bullish or bearish.
|
|
12
|
+
|
|
13
|
+
### Components
|
|
14
|
+
|
|
15
|
+
#### 1.1 Momentum Score (weight: 30%)
|
|
16
|
+
|
|
17
|
+
Measures the average performance of constituent industries.
|
|
18
|
+
|
|
19
|
+
**Formula:**
|
|
20
|
+
```
|
|
21
|
+
momentum_score = normalize(weighted_avg_change_pct, scale=[-5%, +5%] -> [0, 100])
|
|
22
|
+
|
|
23
|
+
weighted_avg_change_pct = SUM(industry_change_pct * industry_market_cap) / SUM(industry_market_cap)
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Data Source:** FINVIZ industry performance (1-week change %)
|
|
27
|
+
|
|
28
|
+
**Scoring Scale:**
|
|
29
|
+
| Absolute Change % | Score |
|
|
30
|
+
|-------------------|-------|
|
|
31
|
+
| >= 5% | 100 |
|
|
32
|
+
| 3-5% | 80 |
|
|
33
|
+
| 1-3% | 60 |
|
|
34
|
+
| 0.5-1% | 40 |
|
|
35
|
+
| < 0.5% | 20 |
|
|
36
|
+
|
|
37
|
+
Note: Absolute value is used so both strong bullish and strong bearish moves generate high heat.
|
|
38
|
+
|
|
39
|
+
#### 1.2 Volume Score (weight: 25%)
|
|
40
|
+
|
|
41
|
+
Measures abnormal volume activity across the theme.
|
|
42
|
+
|
|
43
|
+
**Formula:**
|
|
44
|
+
```
|
|
45
|
+
volume_score = normalize(avg_relative_volume, scale=[0.5, 3.0] -> [0, 100])
|
|
46
|
+
|
|
47
|
+
avg_relative_volume = MEAN(stock_volume / stock_avg_volume) for all stocks in theme
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**Data Source:** FINVIZ relative volume (volume / avg volume ratio)
|
|
51
|
+
|
|
52
|
+
**Scoring Scale:**
|
|
53
|
+
| Relative Volume | Score |
|
|
54
|
+
|-----------------|-------|
|
|
55
|
+
| >= 3.0 | 100 |
|
|
56
|
+
| 2.0-3.0 | 80 |
|
|
57
|
+
| 1.5-2.0 | 60 |
|
|
58
|
+
| 1.0-1.5 | 40 |
|
|
59
|
+
| < 1.0 | 20 |
|
|
60
|
+
|
|
61
|
+
#### 1.3 Uptrend Ratio Score (weight: 25%)
|
|
62
|
+
|
|
63
|
+
Measures the percentage of stocks in the theme that are in technical uptrends.
|
|
64
|
+
|
|
65
|
+
**Formula:**
|
|
66
|
+
```
|
|
67
|
+
uptrend_score = normalize(uptrend_ratio, scale=[0%, 100%] -> [0, 100])
|
|
68
|
+
|
|
69
|
+
uptrend_ratio = count(stocks_in_uptrend) / count(total_stocks)
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Data Source:** uptrend-dashboard output (3-point evaluation: price > 50-day SMA, 50-day SMA > 200-day SMA, 200-day SMA rising)
|
|
73
|
+
|
|
74
|
+
**If uptrend data is unavailable:** Use price-above-SMA200 as proxy from FINVIZ data. Score is reduced by 20% confidence penalty.
|
|
75
|
+
|
|
76
|
+
**Scoring Scale:**
|
|
77
|
+
| Uptrend Ratio | Score |
|
|
78
|
+
|---------------|-------|
|
|
79
|
+
| >= 80% | 100 |
|
|
80
|
+
| 60-80% | 80 |
|
|
81
|
+
| 40-60% | 60 |
|
|
82
|
+
| 20-40% | 40 |
|
|
83
|
+
| < 20% | 20 |
|
|
84
|
+
|
|
85
|
+
Note: For bearish themes, invert the ratio (use downtrend ratio instead).
|
|
86
|
+
|
|
87
|
+
#### 1.4 Breadth Score (weight: 20%)
|
|
88
|
+
|
|
89
|
+
Measures how broadly the theme is participating (not just a few large-cap names).
|
|
90
|
+
|
|
91
|
+
**Formula:**
|
|
92
|
+
```
|
|
93
|
+
breadth_score = normalize(participation_rate, scale=[0%, 100%] -> [0, 100])
|
|
94
|
+
|
|
95
|
+
participation_rate = count(stocks_moving_in_direction > 1%) / count(total_stocks)
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**Data Source:** FINVIZ stock-level performance data
|
|
99
|
+
|
|
100
|
+
**Scoring Scale:**
|
|
101
|
+
| Participation Rate | Score |
|
|
102
|
+
|-------------------|-------|
|
|
103
|
+
| >= 80% | 100 |
|
|
104
|
+
| 60-80% | 80 |
|
|
105
|
+
| 40-60% | 60 |
|
|
106
|
+
| 20-40% | 40 |
|
|
107
|
+
| < 20% | 20 |
|
|
108
|
+
|
|
109
|
+
### Theme Heat Composite
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
theme_heat = (momentum_score * 0.30) + (volume_score * 0.25) + (uptrend_score * 0.25) + (breadth_score * 0.20)
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Dimension 2: Lifecycle Maturity
|
|
118
|
+
|
|
119
|
+
Lifecycle assessment classifies a theme into one of four stages: **Early**, **Mid**, **Late**, or **Exhaustion**. This is critical for distinguishing emerging opportunities from crowded trades.
|
|
120
|
+
|
|
121
|
+
### Components
|
|
122
|
+
|
|
123
|
+
#### 2.1 Duration Score (weight: 25%)
|
|
124
|
+
|
|
125
|
+
How long the theme has been active (consecutive weeks of elevated heat).
|
|
126
|
+
|
|
127
|
+
**Measurement:** Count weeks where theme_heat >= 40.
|
|
128
|
+
|
|
129
|
+
| Duration | Stage Signal |
|
|
130
|
+
|----------|-------------|
|
|
131
|
+
| 1-3 weeks | Early |
|
|
132
|
+
| 4-8 weeks | Mid |
|
|
133
|
+
| 9-16 weeks | Late |
|
|
134
|
+
| > 16 weeks | Exhaustion |
|
|
135
|
+
|
|
136
|
+
**Limitation:** Duration tracking requires historical data. On first run, duration defaults to "Unknown" and lifecycle uses other factors only.
|
|
137
|
+
|
|
138
|
+
#### 2.2 Extremity Clustering Score (weight: 20%)
|
|
139
|
+
|
|
140
|
+
Percentage of stocks in the theme near 52-week highs or lows.
|
|
141
|
+
|
|
142
|
+
**Formula:**
|
|
143
|
+
```
|
|
144
|
+
extremity_pct = count(within_5pct_of_52wk_high_or_low) / count(total_stocks)
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
| Extremity % | Stage Signal |
|
|
148
|
+
|-------------|-------------|
|
|
149
|
+
| < 20% | Early |
|
|
150
|
+
| 20-40% | Mid |
|
|
151
|
+
| 40-60% | Late |
|
|
152
|
+
| > 60% | Exhaustion |
|
|
153
|
+
|
|
154
|
+
**Data Source:** FINVIZ 52-week high/low data
|
|
155
|
+
|
|
156
|
+
#### 2.3 Valuation Score (weight: 20%)
|
|
157
|
+
|
|
158
|
+
Average P/E ratio of theme constituents relative to S&P 500 P/E.
|
|
159
|
+
|
|
160
|
+
**Formula:**
|
|
161
|
+
```
|
|
162
|
+
relative_pe = avg_theme_pe / sp500_pe
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
| Relative P/E | Stage Signal |
|
|
166
|
+
|---------------|-------------|
|
|
167
|
+
| < 0.8 | Early (undervalued) |
|
|
168
|
+
| 0.8-1.2 | Mid (fair value) |
|
|
169
|
+
| 1.2-2.0 | Late (overvalued) |
|
|
170
|
+
| > 2.0 | Exhaustion (extreme) |
|
|
171
|
+
|
|
172
|
+
**Data Source:** FMP API for P/E ratios (optional; uses FINVIZ forward P/E as fallback)
|
|
173
|
+
|
|
174
|
+
#### 2.4 ETF Proliferation Score (weight: 20%)
|
|
175
|
+
|
|
176
|
+
Number of thematic ETFs tracking the theme. More ETFs indicate greater retail/institutional attention.
|
|
177
|
+
|
|
178
|
+
**Source:** `thematic_etf_catalog.md` (static reference)
|
|
179
|
+
|
|
180
|
+
| ETF Count | Score | Stage Signal |
|
|
181
|
+
|-----------|-------|-------------|
|
|
182
|
+
| 0 | 0 | Very Early |
|
|
183
|
+
| 1 | 20 | Early |
|
|
184
|
+
| 2-3 | 40 | Mid |
|
|
185
|
+
| 4-6 | 60 | Mid-Late |
|
|
186
|
+
| 7-10 | 80 | Late |
|
|
187
|
+
| > 10 | 100 | Exhaustion |
|
|
188
|
+
|
|
189
|
+
#### 2.5 Media/Narrative Saturation (weight: 15%)
|
|
190
|
+
|
|
191
|
+
Assessed via WebSearch during narrative confirmation step.
|
|
192
|
+
|
|
193
|
+
| Signal | Stage Signal |
|
|
194
|
+
|--------|-------------|
|
|
195
|
+
| No major media coverage | Early |
|
|
196
|
+
| Specialist/financial media only | Mid |
|
|
197
|
+
| Mainstream media coverage | Late |
|
|
198
|
+
| Magazine covers, viral social media | Exhaustion |
|
|
199
|
+
|
|
200
|
+
### Lifecycle Stage Classification
|
|
201
|
+
|
|
202
|
+
The final lifecycle stage is determined by majority vote across the five component signals:
|
|
203
|
+
|
|
204
|
+
```
|
|
205
|
+
stage_votes = [duration_signal, extremity_signal, valuation_signal, etf_signal, media_signal]
|
|
206
|
+
lifecycle_stage = mode(stage_votes) # most frequent stage
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
If tied, use the more mature stage (conservative approach to protect against crowded trade risk).
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Dimension 3: Confidence (Low / Medium / High)
|
|
214
|
+
|
|
215
|
+
Confidence measures **how reliable** the theme detection is, based on data quality and confirmation signals.
|
|
216
|
+
|
|
217
|
+
### Layers
|
|
218
|
+
|
|
219
|
+
#### 3.1 Quantitative Layer (base)
|
|
220
|
+
|
|
221
|
+
Based on data breadth and consistency:
|
|
222
|
+
|
|
223
|
+
| Condition | Level |
|
|
224
|
+
|-----------|-------|
|
|
225
|
+
| >= 4 industries matching, >= 20 stocks analyzed | High |
|
|
226
|
+
| 2-3 industries matching, >= 10 stocks analyzed | Medium |
|
|
227
|
+
| 1 industry matching or < 10 stocks | Low |
|
|
228
|
+
|
|
229
|
+
#### 3.2 Breadth Layer (modifier)
|
|
230
|
+
|
|
231
|
+
Cross-sector participation adds confidence:
|
|
232
|
+
|
|
233
|
+
| Condition | Modifier |
|
|
234
|
+
|-----------|----------|
|
|
235
|
+
| Theme spans 3+ sectors | +1 level (cap at High) |
|
|
236
|
+
| Theme spans 2 sectors | No change |
|
|
237
|
+
| Theme in 1 sector only | -1 level (floor at Low) |
|
|
238
|
+
|
|
239
|
+
#### 3.3 Narrative Layer (modifier, applied in Step 4)
|
|
240
|
+
|
|
241
|
+
WebSearch confirmation adjusts confidence:
|
|
242
|
+
|
|
243
|
+
| Narrative Finding | Modifier |
|
|
244
|
+
|-------------------|----------|
|
|
245
|
+
| Strong confirmation (multiple sources, clear catalysts) | +1 level |
|
|
246
|
+
| Mixed signals | No change |
|
|
247
|
+
| Contradictory narrative (bearish articles for bullish theme) | -1 level |
|
|
248
|
+
|
|
249
|
+
### Final Confidence
|
|
250
|
+
|
|
251
|
+
```
|
|
252
|
+
confidence = apply_modifiers(quantitative_base, breadth_modifier, narrative_modifier)
|
|
253
|
+
confidence = clamp(confidence, Low, High)
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## Direction Detection
|
|
259
|
+
|
|
260
|
+
Theme direction (bullish vs. bearish) is determined separately from heat:
|
|
261
|
+
|
|
262
|
+
### Algorithm
|
|
263
|
+
|
|
264
|
+
```python
|
|
265
|
+
weighted_perf = sum(industry_change_pct * industry_mcap) / sum(industry_mcap)
|
|
266
|
+
uptrend_ratio = count(uptrend_stocks) / count(total_stocks) # if available
|
|
267
|
+
|
|
268
|
+
if weighted_perf > 0.5 and (uptrend_ratio > 0.5 or uptrend_data_unavailable):
|
|
269
|
+
direction = "Bullish"
|
|
270
|
+
elif weighted_perf < -0.5 and (uptrend_ratio < 0.5 or uptrend_data_unavailable):
|
|
271
|
+
direction = "Bearish"
|
|
272
|
+
else:
|
|
273
|
+
direction = "Neutral"
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### Direction Strength
|
|
277
|
+
|
|
278
|
+
| Absolute Weighted Performance | Strength |
|
|
279
|
+
|-------------------------------|----------|
|
|
280
|
+
| > 3% | Strong |
|
|
281
|
+
| 1-3% | Moderate |
|
|
282
|
+
| 0.5-1% | Weak |
|
|
283
|
+
| < 0.5% | Neutral |
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## Data Sources
|
|
288
|
+
|
|
289
|
+
### Primary: FINVIZ
|
|
290
|
+
|
|
291
|
+
**Elite Mode (recommended):**
|
|
292
|
+
- CSV export endpoint: `https://elite.finviz.com/export.ashx?v=151&f=ind_{code},cap_smallover,...&auth=KEY`
|
|
293
|
+
- Provides: ticker, company, sector, industry, market cap, P/E, change%, volume, avg volume, 52wk high/low, RSI, SMA20/50/200
|
|
294
|
+
- Rate limit: 0.5s between requests
|
|
295
|
+
- Coverage: Full stock universe per industry
|
|
296
|
+
|
|
297
|
+
**Public Mode (fallback):**
|
|
298
|
+
- HTML scraping: `https://finviz.com/screener.ashx?v=151&f=ind_{code},cap_smallover`
|
|
299
|
+
- Provides: Same fields but limited to page 1 (~20 stocks per industry)
|
|
300
|
+
- Rate limit: 2.0s between requests (aggressive scraping may trigger blocks)
|
|
301
|
+
- Coverage: Top 20 stocks per industry by market cap
|
|
302
|
+
|
|
303
|
+
### Secondary: FMP API (optional)
|
|
304
|
+
|
|
305
|
+
- P/E ratios for valuation analysis
|
|
306
|
+
- Not required; FINVIZ forward P/E used as fallback
|
|
307
|
+
- Useful for more granular valuation metrics
|
|
308
|
+
|
|
309
|
+
### Tertiary: uptrend-dashboard (optional)
|
|
310
|
+
|
|
311
|
+
- CSV output from the uptrend-dashboard skill
|
|
312
|
+
- Provides 3-point technical evaluation per stock
|
|
313
|
+
- Significantly improves uptrend ratio accuracy
|
|
314
|
+
- If unavailable, FINVIZ price-vs-SMA200 is used as proxy
|
|
315
|
+
|
|
316
|
+
### Quaternary: WebSearch (narrative layer)
|
|
317
|
+
|
|
318
|
+
- Used for narrative confirmation in Step 4
|
|
319
|
+
- Not automated; Claude performs searches during workflow
|
|
320
|
+
- Subjective assessment of media coverage and analyst sentiment
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
## Integration with uptrend-dashboard
|
|
325
|
+
|
|
326
|
+
When uptrend-dashboard data is available, the theme detector uses it for enhanced 3-point evaluation:
|
|
327
|
+
|
|
328
|
+
**3-Point Evaluation Criteria:**
|
|
329
|
+
1. Price > 50-day SMA (short-term trend)
|
|
330
|
+
2. 50-day SMA > 200-day SMA (medium-term trend, golden/death cross)
|
|
331
|
+
3. 200-day SMA is rising (long-term trend confirmation)
|
|
332
|
+
|
|
333
|
+
**Stocks meeting all 3 points** = in confirmed uptrend
|
|
334
|
+
**Stocks meeting 0 points** = in confirmed downtrend
|
|
335
|
+
|
|
336
|
+
This provides more accurate uptrend ratios than simple price-above-SMA200 proxy.
|
|
337
|
+
|
|
338
|
+
---
|
|
339
|
+
|
|
340
|
+
## Output Schema
|
|
341
|
+
|
|
342
|
+
### JSON Output Structure
|
|
343
|
+
|
|
344
|
+
```json
|
|
345
|
+
{
|
|
346
|
+
"metadata": {
|
|
347
|
+
"date": "2026-02-16",
|
|
348
|
+
"mode": "elite",
|
|
349
|
+
"themes_analyzed": 14,
|
|
350
|
+
"industries_scanned": 145,
|
|
351
|
+
"total_stocks": 5200,
|
|
352
|
+
"uptrend_data_available": true,
|
|
353
|
+
"execution_time_seconds": 150
|
|
354
|
+
},
|
|
355
|
+
"themes": [
|
|
356
|
+
{
|
|
357
|
+
"name": "AI & Semiconductors",
|
|
358
|
+
"direction": "Bullish",
|
|
359
|
+
"direction_strength": "Strong",
|
|
360
|
+
"theme_heat": 82,
|
|
361
|
+
"heat_components": {
|
|
362
|
+
"momentum": 90,
|
|
363
|
+
"volume": 75,
|
|
364
|
+
"uptrend": 85,
|
|
365
|
+
"breadth": 70
|
|
366
|
+
},
|
|
367
|
+
"lifecycle": {
|
|
368
|
+
"stage": "Late",
|
|
369
|
+
"duration_weeks": 12,
|
|
370
|
+
"extremity_pct": 45,
|
|
371
|
+
"relative_pe": 1.8,
|
|
372
|
+
"etf_proliferation_score": 100,
|
|
373
|
+
"etf_count": 11
|
|
374
|
+
},
|
|
375
|
+
"confidence": "High",
|
|
376
|
+
"confidence_components": {
|
|
377
|
+
"quantitative": "High",
|
|
378
|
+
"breadth_modifier": "+1",
|
|
379
|
+
"narrative_modifier": "pending"
|
|
380
|
+
},
|
|
381
|
+
"industries": [
|
|
382
|
+
{
|
|
383
|
+
"name": "Semiconductors",
|
|
384
|
+
"change_pct": 4.2,
|
|
385
|
+
"avg_relative_volume": 1.8,
|
|
386
|
+
"uptrend_ratio": 0.75,
|
|
387
|
+
"stock_count": 35
|
|
388
|
+
}
|
|
389
|
+
],
|
|
390
|
+
"top_stocks": [
|
|
391
|
+
{"ticker": "NVDA", "change_pct": 6.5, "relative_volume": 2.1},
|
|
392
|
+
{"ticker": "AVGO", "change_pct": 4.8, "relative_volume": 1.9}
|
|
393
|
+
],
|
|
394
|
+
"proxy_etfs": ["SMH", "SOXX", "AIQ", "BOTZ"]
|
|
395
|
+
}
|
|
396
|
+
],
|
|
397
|
+
"industry_rankings": {
|
|
398
|
+
"top_10": [...],
|
|
399
|
+
"bottom_10": [...]
|
|
400
|
+
},
|
|
401
|
+
"sector_summary": {
|
|
402
|
+
"Technology": {"uptrend_ratio": 0.65, "avg_change_pct": 2.1},
|
|
403
|
+
"Energy": {"uptrend_ratio": 0.40, "avg_change_pct": -1.5}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
---
|
|
409
|
+
|
|
410
|
+
## Known Limitations
|
|
411
|
+
|
|
412
|
+
1. **Static theme definitions**: Cross-sector themes are predefined in `cross_sector_themes.md`. New themes (e.g., a sudden meme-stock theme) are not automatically detected.
|
|
413
|
+
|
|
414
|
+
2. **Industry granularity**: FINVIZ industry classification may not perfectly map to investment themes. Some industries span multiple themes.
|
|
415
|
+
|
|
416
|
+
3. **Single-stock dominance**: Large-cap stocks (e.g., NVDA in AI) can skew theme-level metrics. Market-cap weighting amplifies this effect.
|
|
417
|
+
|
|
418
|
+
4. **Temporal lag**: Weekly performance data does not capture intraday or same-day momentum shifts.
|
|
419
|
+
|
|
420
|
+
5. **ETF catalog staleness**: The thematic ETF catalog is manually maintained and may not reflect recent ETF launches or closures.
|
|
421
|
+
|
|
422
|
+
6. **Public mode data limits**: Only ~20 stocks per industry are captured, which may underrepresent small/mid-cap participation.
|
|
423
|
+
|
|
424
|
+
7. **Duration tracking**: First-run analysis cannot assess theme duration without historical baseline data.
|
|
425
|
+
|
|
426
|
+
8. **Narrative subjectivity**: Confidence adjustment from WebSearch is inherently subjective and depends on search result quality.
|
|
427
|
+
|
|
428
|
+
9. **Survivorship bias**: Analysis only covers currently listed stocks and active ETFs, missing delisted or closed instruments.
|
|
429
|
+
|
|
430
|
+
10. **FINVIZ data delays**: Public FINVIZ data is 15-minute delayed; Elite provides real-time during market hours.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Theme Detector calculators package
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Theme Heat Calculator (0-100)
|
|
3
|
+
|
|
4
|
+
ThemeHeat = momentum_strength * 0.40
|
|
5
|
+
+ volume_intensity * 0.25
|
|
6
|
+
+ uptrend_signal * 0.20
|
|
7
|
+
+ breadth_signal * 0.15
|
|
8
|
+
|
|
9
|
+
All sub-scores are direction-neutral (0-100 for "strength").
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import math
|
|
13
|
+
from typing import List, Dict, Optional
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
HEAT_WEIGHTS = {
|
|
17
|
+
"momentum": 0.40,
|
|
18
|
+
"volume": 0.25,
|
|
19
|
+
"uptrend": 0.20,
|
|
20
|
+
"breadth": 0.15,
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def momentum_strength_score(weighted_return_pct: float) -> float:
|
|
25
|
+
"""Sigmoid score based on absolute weighted return.
|
|
26
|
+
|
|
27
|
+
Formula: 100 / (1 + exp(-0.15 * (abs(wr%) - 5.0)))
|
|
28
|
+
"""
|
|
29
|
+
x = abs(weighted_return_pct)
|
|
30
|
+
return 100.0 / (1.0 + math.exp(-0.15 * (x - 5.0)))
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def volume_intensity_score(vol_20d: Optional[float],
|
|
34
|
+
vol_60d: Optional[float]) -> float:
|
|
35
|
+
"""Score based on short-term vs long-term volume ratio.
|
|
36
|
+
|
|
37
|
+
Formula: min(100, max(0, (vol_20d/vol_60d - 0.8) * 250))
|
|
38
|
+
Returns 50.0 if either is None or vol_60d == 0.
|
|
39
|
+
"""
|
|
40
|
+
if vol_20d is None or vol_60d is None or vol_60d == 0:
|
|
41
|
+
return 50.0
|
|
42
|
+
ratio = vol_20d / vol_60d
|
|
43
|
+
return min(100.0, max(0.0, (ratio - 0.8) * 250.0))
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def uptrend_signal_score(sector_data: List[Dict],
|
|
47
|
+
is_bearish: bool) -> float:
|
|
48
|
+
"""Weighted average of per-sector uptrend direction scores.
|
|
49
|
+
|
|
50
|
+
Each sector entry: {"sector", "ratio", "ma_10", "slope", "weight"}
|
|
51
|
+
Scoring per sector:
|
|
52
|
+
ratio > ma_10 AND slope > 0 => 80
|
|
53
|
+
ratio > ma_10 OR slope > 0 => 60
|
|
54
|
+
neither => 20
|
|
55
|
+
If is_bearish: result = 100 - weighted_average
|
|
56
|
+
Returns 50.0 if empty.
|
|
57
|
+
"""
|
|
58
|
+
if not sector_data:
|
|
59
|
+
return 50.0
|
|
60
|
+
|
|
61
|
+
total_weight = 0.0
|
|
62
|
+
weighted_sum = 0.0
|
|
63
|
+
|
|
64
|
+
for entry in sector_data:
|
|
65
|
+
ratio = entry.get("ratio") or 0
|
|
66
|
+
ma_10 = entry.get("ma_10") or 0
|
|
67
|
+
slope = entry.get("slope") or 0
|
|
68
|
+
weight = entry.get("weight") or 1.0
|
|
69
|
+
|
|
70
|
+
above_ma = ratio > ma_10
|
|
71
|
+
positive_slope = slope > 0
|
|
72
|
+
|
|
73
|
+
if above_ma and positive_slope:
|
|
74
|
+
direction_score = 80.0
|
|
75
|
+
elif above_ma or positive_slope:
|
|
76
|
+
direction_score = 60.0
|
|
77
|
+
else:
|
|
78
|
+
direction_score = 20.0
|
|
79
|
+
|
|
80
|
+
weighted_sum += direction_score * weight
|
|
81
|
+
total_weight += weight
|
|
82
|
+
|
|
83
|
+
if total_weight == 0:
|
|
84
|
+
return 50.0
|
|
85
|
+
|
|
86
|
+
result = weighted_sum / total_weight
|
|
87
|
+
|
|
88
|
+
if is_bearish:
|
|
89
|
+
result = 100.0 - result
|
|
90
|
+
|
|
91
|
+
return result
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def breadth_signal_score(positive_ratio: Optional[float]) -> float:
|
|
95
|
+
"""Score based on breadth ratio (0-1).
|
|
96
|
+
|
|
97
|
+
Formula: min(100, max(0, positive_ratio * 100))
|
|
98
|
+
Returns 50.0 if None.
|
|
99
|
+
"""
|
|
100
|
+
if positive_ratio is None:
|
|
101
|
+
return 50.0
|
|
102
|
+
return min(100.0, max(0.0, positive_ratio * 100.0))
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def calculate_theme_heat(momentum: Optional[float],
|
|
106
|
+
volume: Optional[float],
|
|
107
|
+
uptrend: Optional[float],
|
|
108
|
+
breadth: Optional[float]) -> float:
|
|
109
|
+
"""Weighted sum of sub-scores, clamped 0-100.
|
|
110
|
+
|
|
111
|
+
Any None input defaults to 50.0.
|
|
112
|
+
"""
|
|
113
|
+
m = momentum if momentum is not None else 50.0
|
|
114
|
+
v = volume if volume is not None else 50.0
|
|
115
|
+
u = uptrend if uptrend is not None else 50.0
|
|
116
|
+
b = breadth if breadth is not None else 50.0
|
|
117
|
+
|
|
118
|
+
raw = (m * HEAT_WEIGHTS["momentum"]
|
|
119
|
+
+ v * HEAT_WEIGHTS["volume"]
|
|
120
|
+
+ u * HEAT_WEIGHTS["uptrend"]
|
|
121
|
+
+ b * HEAT_WEIGHTS["breadth"])
|
|
122
|
+
|
|
123
|
+
return float(min(100.0, max(0.0, raw)))
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Industry Ranker - Momentum scoring and ranking for industries.
|
|
4
|
+
|
|
5
|
+
Calculates direction-neutral momentum strength using a sigmoid function,
|
|
6
|
+
then ranks industries by weighted multi-timeframe returns.
|
|
7
|
+
|
|
8
|
+
Timeframe Weights:
|
|
9
|
+
- 1W: 10%
|
|
10
|
+
- 1M: 25%
|
|
11
|
+
- 3M: 35%
|
|
12
|
+
- 6M: 30%
|
|
13
|
+
Total: 100%
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
import math
|
|
17
|
+
from typing import Dict, List
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
TIMEFRAME_WEIGHTS: Dict[str, float] = {
|
|
21
|
+
"perf_1w": 0.10,
|
|
22
|
+
"perf_1m": 0.25,
|
|
23
|
+
"perf_3m": 0.35,
|
|
24
|
+
"perf_6m": 0.30,
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def momentum_strength_score(weighted_return_pct: float) -> float:
|
|
29
|
+
"""
|
|
30
|
+
Direction-neutral sigmoid momentum score.
|
|
31
|
+
|
|
32
|
+
Formula: 100 / (1 + exp(-0.15 * (abs(weighted_return) - 5.0)))
|
|
33
|
+
|
|
34
|
+
Returns a score in [0, 100] where:
|
|
35
|
+
|0%| -> ~32
|
|
36
|
+
|5%| -> 50 (midpoint)
|
|
37
|
+
|10%| -> ~68
|
|
38
|
+
|15%| -> ~82
|
|
39
|
+
|20%| -> ~90
|
|
40
|
+
"""
|
|
41
|
+
x = abs(weighted_return_pct)
|
|
42
|
+
return 100.0 / (1.0 + math.exp(-0.15 * (x - 5.0)))
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def rank_industries(industries: List[Dict]) -> List[Dict]:
|
|
46
|
+
"""
|
|
47
|
+
Rank industries by momentum strength score.
|
|
48
|
+
|
|
49
|
+
Each input dict must have keys: name, perf_1w, perf_1m, perf_3m, perf_6m.
|
|
50
|
+
Additional keys are preserved.
|
|
51
|
+
|
|
52
|
+
Adds fields: weighted_return, momentum_score, direction, rank.
|
|
53
|
+
Returns list sorted by momentum_score descending.
|
|
54
|
+
"""
|
|
55
|
+
if not industries:
|
|
56
|
+
return []
|
|
57
|
+
|
|
58
|
+
scored = []
|
|
59
|
+
for ind in industries:
|
|
60
|
+
weighted_return = sum(
|
|
61
|
+
ind.get(key, 0.0) * weight
|
|
62
|
+
for key, weight in TIMEFRAME_WEIGHTS.items()
|
|
63
|
+
)
|
|
64
|
+
score = momentum_strength_score(weighted_return)
|
|
65
|
+
direction = "bullish" if weighted_return > 0 else "bearish"
|
|
66
|
+
|
|
67
|
+
entry = dict(ind)
|
|
68
|
+
entry["weighted_return"] = round(weighted_return, 4)
|
|
69
|
+
entry["momentum_score"] = round(score, 2)
|
|
70
|
+
entry["direction"] = direction
|
|
71
|
+
scored.append(entry)
|
|
72
|
+
|
|
73
|
+
scored.sort(key=lambda x: x["momentum_score"], reverse=True)
|
|
74
|
+
|
|
75
|
+
for i, entry in enumerate(scored, start=1):
|
|
76
|
+
entry["rank"] = i
|
|
77
|
+
|
|
78
|
+
return scored
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def get_top_bottom_industries(ranked: List[Dict], n: int = 5) -> Dict[str, List[Dict]]:
|
|
82
|
+
"""
|
|
83
|
+
Extract top N and bottom N industries from a ranked list.
|
|
84
|
+
|
|
85
|
+
Args:
|
|
86
|
+
ranked: List sorted by momentum_score descending (output of rank_industries).
|
|
87
|
+
n: Number of industries for each group.
|
|
88
|
+
|
|
89
|
+
Returns:
|
|
90
|
+
{"top": [...], "bottom": [...]}
|
|
91
|
+
"""
|
|
92
|
+
if not ranked:
|
|
93
|
+
return {"top": [], "bottom": []}
|
|
94
|
+
|
|
95
|
+
top = ranked[:n]
|
|
96
|
+
bottom = ranked[-n:] if len(ranked) >= n else ranked[:]
|
|
97
|
+
|
|
98
|
+
return {"top": top, "bottom": bottom}
|