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,597 @@
|
|
|
1
|
+
# CANSLIM Scoring System - Phase 1 MVP
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This document specifies the composite scoring system for the CANSLIM screener. Phase 1 MVP implements **4 of 7** components (C, A, N, M), representing 55% of the full CANSLIM methodology weight. Component weights are renormalized to 100% for Phase 1 to provide meaningful composite scores.
|
|
6
|
+
|
|
7
|
+
**Full CANSLIM (Phases 2-3)** will restore original weights once S, L, I components are added.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Component Weights
|
|
12
|
+
|
|
13
|
+
### Phase 1 MVP Weights (4 Components)
|
|
14
|
+
|
|
15
|
+
| Component | Original Weight | Phase 1 Weight | Rationale |
|
|
16
|
+
|-----------|----------------|----------------|-----------|
|
|
17
|
+
| **C** - Current Earnings | 15% | **27%** | Most predictive single factor (O'Neil's #1) |
|
|
18
|
+
| **A** - Annual Growth | 20% | **36%** | Highest weight - validates sustainability |
|
|
19
|
+
| **N** - Newness | 15% | **27%** | Momentum confirmation critical |
|
|
20
|
+
| **M** - Market Direction | 5% | **10%** | Gating filter - affects all stocks |
|
|
21
|
+
| **Total (Phase 1)** | **55%** | **100%** | Renormalized |
|
|
22
|
+
|
|
23
|
+
**Missing in Phase 1** (to be added in Phases 2-3):
|
|
24
|
+
- **S** - Supply/Demand (15% original weight)
|
|
25
|
+
- **L** - Leadership (20% original weight)
|
|
26
|
+
- **I** - Institutional Sponsorship (10% original weight)
|
|
27
|
+
|
|
28
|
+
### Future Phase Weights
|
|
29
|
+
|
|
30
|
+
**Phase 2** (6 components - C, A, N, S, I, M):
|
|
31
|
+
- Restore S (15%) and I (10%)
|
|
32
|
+
- Total weight: 75% (L still missing)
|
|
33
|
+
- Renormalize to 100% temporarily
|
|
34
|
+
|
|
35
|
+
**Phase 3** (7 components - Complete CANSLIM):
|
|
36
|
+
- Add L (20%)
|
|
37
|
+
- Total weight: 100% (original weights restored)
|
|
38
|
+
- C 15%, A 20%, N 15%, S 15%, L 20%, I 10%, M 5%
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Component Scoring Formulas (0-100 Scale)
|
|
43
|
+
|
|
44
|
+
Each component is scored on a 0-100 point scale based on O'Neil's quantitative thresholds.
|
|
45
|
+
|
|
46
|
+
### C - Current Quarterly Earnings (0-100 Points)
|
|
47
|
+
|
|
48
|
+
**Input Data Required:**
|
|
49
|
+
- Latest quarterly EPS (most recent quarter)
|
|
50
|
+
- Year-ago quarterly EPS (same quarter, prior year)
|
|
51
|
+
- Latest quarterly revenue
|
|
52
|
+
- Year-ago quarterly revenue
|
|
53
|
+
|
|
54
|
+
**Calculation:**
|
|
55
|
+
```python
|
|
56
|
+
eps_growth_pct = ((latest_qtr_eps - year_ago_qtr_eps) / abs(year_ago_qtr_eps)) * 100
|
|
57
|
+
revenue_growth_pct = ((latest_qtr_revenue - year_ago_qtr_revenue) / year_ago_qtr_revenue) * 100
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**Scoring Logic:**
|
|
61
|
+
```python
|
|
62
|
+
if eps_growth_pct >= 50 and revenue_growth_pct >= 25:
|
|
63
|
+
c_score = 100 # Explosive growth
|
|
64
|
+
elif eps_growth_pct >= 30 and revenue_growth_pct >= 15:
|
|
65
|
+
c_score = 80 # Strong growth
|
|
66
|
+
elif eps_growth_pct >= 18 and revenue_growth_pct >= 10:
|
|
67
|
+
c_score = 60 # Meets CANSLIM minimum
|
|
68
|
+
elif eps_growth_pct >= 10:
|
|
69
|
+
c_score = 40 # Below threshold
|
|
70
|
+
else:
|
|
71
|
+
c_score = 0 # Weak or negative growth
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Interpretation:**
|
|
75
|
+
- **100 points**: Exceptional - Top-tier earnings acceleration
|
|
76
|
+
- **80 points**: Strong - Well above CANSLIM threshold
|
|
77
|
+
- **60 points**: Acceptable - Meets minimum 18% threshold
|
|
78
|
+
- **40 points**: Weak - Below CANSLIM standards
|
|
79
|
+
- **0 points**: Fails - Insufficient growth
|
|
80
|
+
|
|
81
|
+
**Quality Checks:**
|
|
82
|
+
- If revenue growth < 50% of EPS growth → Investigate earnings quality (potential buyback-driven)
|
|
83
|
+
- If revenue is negative while EPS is positive → Red flag (cost-cutting, not growth)
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
### A - Annual EPS Growth (0-100 Points)
|
|
88
|
+
|
|
89
|
+
**Input Data Required:**
|
|
90
|
+
- Annual EPS for current year and previous 3 years (4 years total)
|
|
91
|
+
- Annual revenue for same 4 years (validation)
|
|
92
|
+
|
|
93
|
+
**Calculation:**
|
|
94
|
+
```python
|
|
95
|
+
# 3-year CAGR (Compound Annual Growth Rate)
|
|
96
|
+
eps_cagr_3yr = (((current_year_eps / eps_3_years_ago) ** (1/3)) - 1) * 100
|
|
97
|
+
revenue_cagr_3yr = (((current_year_revenue / revenue_3_years_ago) ** (1/3)) - 1) * 100
|
|
98
|
+
|
|
99
|
+
# Growth stability check
|
|
100
|
+
eps_values = [year1_eps, year2_eps, year3_eps, year4_eps] # chronological order
|
|
101
|
+
stable = all(eps_values[i] >= eps_values[i-1] for i in range(1, 4)) # No down years
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
**Scoring Logic:**
|
|
105
|
+
```python
|
|
106
|
+
# Base score from EPS CAGR
|
|
107
|
+
if eps_cagr_3yr >= 40:
|
|
108
|
+
base_score = 90
|
|
109
|
+
elif eps_cagr_3yr >= 30:
|
|
110
|
+
base_score = 70
|
|
111
|
+
elif eps_cagr_3yr >= 25:
|
|
112
|
+
base_score = 50 # Meets CANSLIM minimum
|
|
113
|
+
elif eps_cagr_3yr >= 15:
|
|
114
|
+
base_score = 30
|
|
115
|
+
else:
|
|
116
|
+
base_score = 0
|
|
117
|
+
|
|
118
|
+
# Revenue growth validation penalty
|
|
119
|
+
if revenue_cagr_3yr < (eps_cagr_3yr * 0.5):
|
|
120
|
+
base_score = int(base_score * 0.8) # 20% penalty for weak revenue growth
|
|
121
|
+
|
|
122
|
+
# Stability bonus
|
|
123
|
+
if stable: # No down years
|
|
124
|
+
base_score += 10
|
|
125
|
+
|
|
126
|
+
a_score = min(base_score, 100) # Cap at 100
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**Interpretation:**
|
|
130
|
+
- **90-100 points**: Exceptional - Sustainable high growth with stability
|
|
131
|
+
- **70-89 points**: Strong - Well above 25% threshold
|
|
132
|
+
- **50-69 points**: Acceptable - Meets CANSLIM minimum
|
|
133
|
+
- **30-49 points**: Weak - Below threshold
|
|
134
|
+
- **0-29 points**: Fails - Insufficient or erratic growth
|
|
135
|
+
|
|
136
|
+
**Quality Checks:**
|
|
137
|
+
- Stability bonus (+10) rewards consistency (no down years)
|
|
138
|
+
- Revenue validation prevents buyback-driven EPS growth from scoring high
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
### N - Newness / New Highs (0-100 Points)
|
|
143
|
+
|
|
144
|
+
**Input Data Required:**
|
|
145
|
+
- Current stock price
|
|
146
|
+
- 52-week high price
|
|
147
|
+
- 52-week low price
|
|
148
|
+
- Recent daily volume data (30 days)
|
|
149
|
+
- Average volume (30-day average)
|
|
150
|
+
- Recent news headlines (optional, for new product detection)
|
|
151
|
+
|
|
152
|
+
**Calculation:**
|
|
153
|
+
```python
|
|
154
|
+
# Distance from 52-week high
|
|
155
|
+
distance_from_high_pct = ((current_price / week_52_high) - 1) * 100
|
|
156
|
+
|
|
157
|
+
# Breakout detection (new high on volume)
|
|
158
|
+
breakout_detected = (
|
|
159
|
+
current_price >= week_52_high * 0.995 and # Within 0.5% of high
|
|
160
|
+
recent_volume > avg_volume * 1.4 # Volume 40%+ above average
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
# New product signal detection (keyword search in news)
|
|
164
|
+
new_product_signals = search_news_keywords([
|
|
165
|
+
"FDA approval", "patent granted", "breakthrough", "game-changer",
|
|
166
|
+
"new product", "product launch", "expansion", "acquisition"
|
|
167
|
+
])
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**Scoring Logic:**
|
|
171
|
+
```python
|
|
172
|
+
# Base score from price position
|
|
173
|
+
if distance_from_high_pct >= -5 and breakout_detected and new_product_signals:
|
|
174
|
+
base_score = 100 # Perfect setup
|
|
175
|
+
elif distance_from_high_pct >= -10 and breakout_detected:
|
|
176
|
+
base_score = 80 # Strong momentum
|
|
177
|
+
elif distance_from_high_pct >= -15 or breakout_detected:
|
|
178
|
+
base_score = 60 # Acceptable
|
|
179
|
+
elif distance_from_high_pct >= -25:
|
|
180
|
+
base_score = 40 # Weak momentum
|
|
181
|
+
else:
|
|
182
|
+
base_score = 20 # Too far from highs
|
|
183
|
+
|
|
184
|
+
# Bonus for new product/catalyst signals (optional data)
|
|
185
|
+
if new_product_signals:
|
|
186
|
+
if "FDA approval" in signals or "breakthrough" in signals:
|
|
187
|
+
base_score += 20 # High-impact catalyst
|
|
188
|
+
elif "new product" in signals or "acquisition" in signals:
|
|
189
|
+
base_score += 10 # Moderate catalyst
|
|
190
|
+
|
|
191
|
+
n_score = min(base_score, 100) # Cap at 100
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
**Interpretation:**
|
|
195
|
+
- **90-100 points**: Exceptional - At new highs with catalysts
|
|
196
|
+
- **70-89 points**: Strong - Near highs with volume confirmation
|
|
197
|
+
- **50-69 points**: Acceptable - Within 15% of highs
|
|
198
|
+
- **30-49 points**: Weak - Lacks momentum
|
|
199
|
+
- **0-29 points**: Fails - Too far from highs, no sponsorship
|
|
200
|
+
|
|
201
|
+
**Note**: Price position is primary signal (80% of score). New product detection is supplementary (20% bonus).
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
### M - Market Direction (0-100 Points)
|
|
206
|
+
|
|
207
|
+
**Input Data Required:**
|
|
208
|
+
- S&P 500 current price
|
|
209
|
+
- S&P 500 50-day Exponential Moving Average (EMA)
|
|
210
|
+
- VIX current level
|
|
211
|
+
- Follow-through day detection (optional advanced feature)
|
|
212
|
+
|
|
213
|
+
**Calculation:**
|
|
214
|
+
```python
|
|
215
|
+
# Distance from 50-day EMA
|
|
216
|
+
distance_from_ema_pct = ((sp500_price / sp500_ema_50) - 1) * 100
|
|
217
|
+
|
|
218
|
+
# Trend determination
|
|
219
|
+
if distance_from_ema_pct >= 2.0:
|
|
220
|
+
trend = "strong_uptrend"
|
|
221
|
+
elif distance_from_ema_pct >= 0:
|
|
222
|
+
trend = "uptrend"
|
|
223
|
+
elif distance_from_ema_pct >= -2.0:
|
|
224
|
+
trend = "choppy"
|
|
225
|
+
elif distance_from_ema_pct >= -5.0:
|
|
226
|
+
trend = "downtrend"
|
|
227
|
+
else:
|
|
228
|
+
trend = "bear_market"
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**Scoring Logic:**
|
|
232
|
+
```python
|
|
233
|
+
# Base score from trend
|
|
234
|
+
if trend == "strong_uptrend" and vix < 15:
|
|
235
|
+
base_score = 100 # Ideal conditions
|
|
236
|
+
elif trend == "strong_uptrend" or (trend == "uptrend" and vix < 20):
|
|
237
|
+
base_score = 80 # Favorable
|
|
238
|
+
elif trend == "uptrend":
|
|
239
|
+
base_score = 60 # Acceptable
|
|
240
|
+
elif trend == "choppy":
|
|
241
|
+
base_score = 40 # Neutral/caution
|
|
242
|
+
elif trend == "downtrend":
|
|
243
|
+
base_score = 20 # Weak market
|
|
244
|
+
else: # bear_market or vix > 30
|
|
245
|
+
base_score = 0 # Avoid stocks entirely
|
|
246
|
+
|
|
247
|
+
# VIX adjustment (fear gauge)
|
|
248
|
+
if vix < 15:
|
|
249
|
+
base_score += 10 # Low fear, bullish
|
|
250
|
+
elif vix > 30:
|
|
251
|
+
base_score = 0 # Panic, override trend
|
|
252
|
+
|
|
253
|
+
# Follow-through day bonus (optional advanced feature)
|
|
254
|
+
if follow_through_day_detected:
|
|
255
|
+
base_score += 10 # Confirmed institutional buying
|
|
256
|
+
|
|
257
|
+
m_score = min(max(base_score, 0), 100) # Cap between 0-100
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
**Interpretation:**
|
|
261
|
+
- **90-100 points**: Strong bull market - Aggressive buying recommended
|
|
262
|
+
- **70-89 points**: Bull market - Standard position sizing
|
|
263
|
+
- **50-69 points**: Early uptrend - Small initial positions
|
|
264
|
+
- **30-49 points**: Choppy/neutral - Reduce exposure, be selective
|
|
265
|
+
- **10-29 points**: Downtrend - Defensive posture, minimal positions
|
|
266
|
+
- **0 points**: Bear market - Raise 80-100% cash, do not buy
|
|
267
|
+
|
|
268
|
+
**Critical Rule**: If M score = 0, **do not buy any stocks** regardless of C, A, N scores. Market direction trumps stock selection.
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
## Composite Score Calculation
|
|
273
|
+
|
|
274
|
+
### Formula (Phase 1 MVP)
|
|
275
|
+
|
|
276
|
+
```python
|
|
277
|
+
composite_score = (
|
|
278
|
+
c_score * 0.27 + # Current Earnings: 27% weight
|
|
279
|
+
a_score * 0.36 + # Annual Growth: 36% weight
|
|
280
|
+
n_score * 0.27 + # Newness: 27% weight
|
|
281
|
+
m_score * 0.10 # Market Direction: 10% weight
|
|
282
|
+
)
|
|
283
|
+
|
|
284
|
+
# Result: 0-100 composite score
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### Interpretation Bands (Phase 1)
|
|
288
|
+
|
|
289
|
+
| Score Range | Rating | Percentile | Meaning | Action |
|
|
290
|
+
|-------------|--------|------------|---------|--------|
|
|
291
|
+
| **80-100** | **Exceptional** | Top 5-10% | Rare setup - all components aligned | Strong buy, aggressive sizing (15-20% position) |
|
|
292
|
+
| **70-79** | **Strong** | Top 15-20% | Most components strong | Buy, standard sizing (10-15% position) |
|
|
293
|
+
| **60-69** | **Above Average** | Top 30% | Solid candidate, minor weaknesses | Buy on pullback, smaller sizing (5-10%) |
|
|
294
|
+
| **50-59** | **Average** | Top 50% | Meets minimums, lacks conviction | Watchlist, wait for improvement |
|
|
295
|
+
| **40-49** | **Below Average** | Bottom 50% | One or more components weak | Monitor only, do not buy |
|
|
296
|
+
| **<40** | **Weak** | Bottom 30% | Fails CANSLIM criteria | Avoid |
|
|
297
|
+
|
|
298
|
+
**Note**: Phase 1 scores are not directly comparable to full CANSLIM scores. An 80-point Phase 1 stock may score 140-160 with full 7 components (S, L, I added).
|
|
299
|
+
|
|
300
|
+
### Weakest Component Identification
|
|
301
|
+
|
|
302
|
+
For each stock, identify the component with the **lowest individual score** to guide further analysis:
|
|
303
|
+
|
|
304
|
+
```python
|
|
305
|
+
components = {
|
|
306
|
+
'C': c_score,
|
|
307
|
+
'A': a_score,
|
|
308
|
+
'N': n_score,
|
|
309
|
+
'M': m_score
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
weakest_component = min(components, key=components.get)
|
|
313
|
+
weakest_score = components[weakest_component]
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
**Use Case**: Helps user understand risks
|
|
317
|
+
- Weakest = C → Earnings deceleration risk
|
|
318
|
+
- Weakest = A → Lack of sustained growth history
|
|
319
|
+
- Weakest = N → Lacks momentum, far from highs
|
|
320
|
+
- Weakest = M → Poor market timing, consider waiting
|
|
321
|
+
|
|
322
|
+
### Formula (Phase 2 - 6 Components)
|
|
323
|
+
|
|
324
|
+
```python
|
|
325
|
+
composite_score = (
|
|
326
|
+
c_score * 0.19 + # Current Earnings: 19% weight
|
|
327
|
+
a_score * 0.25 + # Annual Growth: 25% weight
|
|
328
|
+
n_score * 0.19 + # Newness: 19% weight
|
|
329
|
+
s_score * 0.19 + # Supply/Demand: 19% weight (NEW)
|
|
330
|
+
i_score * 0.13 + # Institutional: 13% weight (NEW)
|
|
331
|
+
m_score * 0.06 # Market Direction: 6% weight
|
|
332
|
+
)
|
|
333
|
+
|
|
334
|
+
# Result: 0-100 composite score (Phase 2)
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
### Interpretation Bands (Phase 2)
|
|
338
|
+
|
|
339
|
+
| Score Range | Rating | Percentile | Meaning | Action |
|
|
340
|
+
|-------------|--------|------------|---------|--------|
|
|
341
|
+
| **90-100** | **Exceptional+** | Top 1-2% | Rare multi-bagger setup with full institutional backing | Immediate buy, aggressive sizing (15-20% position) |
|
|
342
|
+
| **80-89** | **Exceptional** | Top 5-10% | Outstanding fundamentals + accumulation | Strong buy, standard sizing (10-15% position) |
|
|
343
|
+
| **70-79** | **Strong** | Top 15-20% | High-quality CANSLIM stock | Buy on pullback, standard sizing (10-15%) |
|
|
344
|
+
| **60-69** | **Above Average** | Top 30% | Solid candidate, minor weaknesses | Watchlist, smaller sizing (5-10%) on pullback |
|
|
345
|
+
| **<60** | **Below Standard** | Bottom 70% | Fails one or more thresholds | Monitor only, do not buy |
|
|
346
|
+
|
|
347
|
+
**Key Improvement**: Phase 2 scores include institutional validation (S, I components), making them more predictive than Phase 1.
|
|
348
|
+
|
|
349
|
+
### Minimum Thresholds (Phase 2)
|
|
350
|
+
|
|
351
|
+
All 6 components must meet baseline criteria to qualify as a CANSLIM candidate:
|
|
352
|
+
|
|
353
|
+
```python
|
|
354
|
+
thresholds = {
|
|
355
|
+
"C": 60, # 18%+ quarterly EPS growth
|
|
356
|
+
"A": 50, # 25%+ annual CAGR
|
|
357
|
+
"N": 40, # Within 15% of 52-week high
|
|
358
|
+
"S": 40, # Accumulation pattern (ratio ≥ 1.0)
|
|
359
|
+
"I": 40, # 30+ holders OR 20%+ ownership
|
|
360
|
+
"M": 40 # Market in uptrend
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
# Stock passes if ALL components >= thresholds
|
|
364
|
+
passes_threshold = all(score >= thresholds[comp] for comp, score in scores.items())
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
**Failure Interpretation**:
|
|
368
|
+
- Fails C threshold → Earnings deceleration, avoid
|
|
369
|
+
- Fails A threshold → Lacks sustained growth, not a growth stock
|
|
370
|
+
- Fails N threshold → Too far from highs, wait for strength
|
|
371
|
+
- Fails S threshold → Distribution pattern, institutions selling
|
|
372
|
+
- Fails I threshold → Neglected by institutions, lacks backing
|
|
373
|
+
- Fails M threshold → Bear market, wait for market recovery
|
|
374
|
+
|
|
375
|
+
### Weakest Component Identification (Phase 2)
|
|
376
|
+
|
|
377
|
+
```python
|
|
378
|
+
components = {
|
|
379
|
+
'C': c_score,
|
|
380
|
+
'A': a_score,
|
|
381
|
+
'N': n_score,
|
|
382
|
+
'S': s_score, # NEW
|
|
383
|
+
'I': i_score, # NEW
|
|
384
|
+
'M': m_score
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
weakest_component = min(components, key=components.get)
|
|
388
|
+
weakest_score = components[weakest_component]
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
**Additional Interpretations**:
|
|
392
|
+
- Weakest = S → Distribution pattern, institutions selling - caution
|
|
393
|
+
- Weakest = I → Underowned or overcrowded, investigate further
|
|
394
|
+
|
|
395
|
+
---
|
|
396
|
+
|
|
397
|
+
## Example Calculations
|
|
398
|
+
|
|
399
|
+
### Example 1: NVDA (2023 Q2) - Exceptional Setup
|
|
400
|
+
|
|
401
|
+
**Component Scores:**
|
|
402
|
+
- **C Score**: 100 points (EPS +429% YoY, Revenue +101% YoY)
|
|
403
|
+
- **A Score**: 95 points (3yr CAGR 89%, stable, revenue strong)
|
|
404
|
+
- **N Score**: 98 points (New all-time high, AI catalyst, breakout volume)
|
|
405
|
+
- **M Score**: 100 points (S&P 500 in strong uptrend, VIX <15)
|
|
406
|
+
|
|
407
|
+
**Composite Calculation:**
|
|
408
|
+
```python
|
|
409
|
+
composite = (100 * 0.27) + (95 * 0.36) + (98 * 0.27) + (100 * 0.10)
|
|
410
|
+
= 27.0 + 34.2 + 26.46 + 10.0
|
|
411
|
+
= 97.66 points
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
**Rating**: Exceptional (97.66/100)
|
|
415
|
+
**Interpretation**: Textbook CANSLIM setup - all components aligned, rare multi-bagger candidate
|
|
416
|
+
**Weakest Component**: A (95) - even this is exceptional
|
|
417
|
+
**Action**: Strong buy, aggressive position sizing (15-20% of portfolio)
|
|
418
|
+
|
|
419
|
+
---
|
|
420
|
+
|
|
421
|
+
### Example 2: META (2023 Q3) - Strong Setup
|
|
422
|
+
|
|
423
|
+
**Component Scores:**
|
|
424
|
+
- **C Score**: 85 points (EPS +164% YoY, Revenue +23% YoY)
|
|
425
|
+
- **A Score**: 78 points (3yr CAGR 28%, recovery from 2022 trough, stable recent)
|
|
426
|
+
- **N Score**: 88 points (5% from 52-week high, breakout pattern)
|
|
427
|
+
- **M Score**: 80 points (S&P 500 above EMA, VIX 18)
|
|
428
|
+
|
|
429
|
+
**Composite Calculation:**
|
|
430
|
+
```python
|
|
431
|
+
composite = (85 * 0.27) + (78 * 0.36) + (88 * 0.27) + (80 * 0.10)
|
|
432
|
+
= 22.95 + 28.08 + 23.76 + 8.0
|
|
433
|
+
= 82.79 points
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
**Rating**: Exceptional (82.79/100)
|
|
437
|
+
**Interpretation**: Strong CANSLIM candidate, slight weakness in historical growth
|
|
438
|
+
**Weakest Component**: A (78) - recovering from prior downturn
|
|
439
|
+
**Action**: Buy, standard position sizing (10-15% of portfolio)
|
|
440
|
+
|
|
441
|
+
---
|
|
442
|
+
|
|
443
|
+
### Example 3: Hypothetical "Average" Stock
|
|
444
|
+
|
|
445
|
+
**Component Scores:**
|
|
446
|
+
- **C Score**: 60 points (EPS +20% YoY - meets minimum)
|
|
447
|
+
- **A Score**: 55 points (3yr CAGR 26%, one down year)
|
|
448
|
+
- **N Score**: 65 points (12% from high, no catalyst)
|
|
449
|
+
- **M Score**: 60 points (S&P 500 just above EMA, early uptrend)
|
|
450
|
+
|
|
451
|
+
**Composite Calculation:**
|
|
452
|
+
```python
|
|
453
|
+
composite = (60 * 0.27) + (55 * 0.36) + (65 * 0.27) + (60 * 0.10)
|
|
454
|
+
= 16.2 + 19.8 + 17.55 + 6.0
|
|
455
|
+
= 59.55 points
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
**Rating**: Average (59.55/100)
|
|
459
|
+
**Interpretation**: Meets minimum thresholds but lacks conviction
|
|
460
|
+
**Weakest Component**: A (55) - inconsistent growth history
|
|
461
|
+
**Action**: Watchlist only, wait for A or N component to strengthen
|
|
462
|
+
|
|
463
|
+
---
|
|
464
|
+
|
|
465
|
+
### Example 4: Bear Market Scenario (M Score = 0)
|
|
466
|
+
|
|
467
|
+
**Component Scores:**
|
|
468
|
+
- **C Score**: 100 points (Excellent earnings)
|
|
469
|
+
- **A Score**: 90 points (Excellent growth)
|
|
470
|
+
- **N Score**: 95 points (New highs)
|
|
471
|
+
- **M Score**: 0 points (S&P 500 in bear market, VIX > 30)
|
|
472
|
+
|
|
473
|
+
**Composite Calculation:**
|
|
474
|
+
```python
|
|
475
|
+
composite = (100 * 0.27) + (90 * 0.36) + (95 * 0.27) + (0 * 0.10)
|
|
476
|
+
= 27.0 + 32.4 + 25.65 + 0
|
|
477
|
+
= 85.05 points
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
**Rating**: Exceptional fundamentals (85.05) BUT bear market
|
|
481
|
+
**Interpretation**: **DO NOT BUY** despite high score - market direction overrides stock quality
|
|
482
|
+
**Weakest Component**: M (0) - bear market environment
|
|
483
|
+
**Action**: Raise cash, wait for M score > 40 (market recovery signal)
|
|
484
|
+
|
|
485
|
+
**Critical Lesson**: This example illustrates O'Neil's principle: "You can be right about a stock but wrong about the market, and still lose money."
|
|
486
|
+
|
|
487
|
+
---
|
|
488
|
+
|
|
489
|
+
## Phase 2-3 Scoring Evolution
|
|
490
|
+
|
|
491
|
+
### Phase 2 (6 Components: C, A, N, S, I, M)
|
|
492
|
+
|
|
493
|
+
**New Weights** (renormalized, L still missing):
|
|
494
|
+
- C: 19% (15% / 0.80)
|
|
495
|
+
- A: 25% (20% / 0.80)
|
|
496
|
+
- N: 19% (15% / 0.80)
|
|
497
|
+
- S: 19% (15% / 0.80) - NEW
|
|
498
|
+
- I: 13% (10% / 0.80) - NEW
|
|
499
|
+
- M: 6% (5% / 0.80)
|
|
500
|
+
- Total: 100%
|
|
501
|
+
|
|
502
|
+
**Expected Impact**:
|
|
503
|
+
- S component (volume/supply-demand) will further validate institutional accumulation
|
|
504
|
+
- I component (institutional sponsorship) will identify "smart money" confirmation
|
|
505
|
+
- Composite scores expected to shift ±5-10 points with S, I added
|
|
506
|
+
|
|
507
|
+
### Phase 3 (7 Components: Complete CANSLIM)
|
|
508
|
+
|
|
509
|
+
**Final Weights** (original O'Neil methodology):
|
|
510
|
+
- C: 15%
|
|
511
|
+
- A: 20%
|
|
512
|
+
- N: 15%
|
|
513
|
+
- S: 15%
|
|
514
|
+
- L: 20% - NEW (largest single component!)
|
|
515
|
+
- I: 10%
|
|
516
|
+
- M: 5%
|
|
517
|
+
- Total: 100%
|
|
518
|
+
|
|
519
|
+
**Expected Impact**:
|
|
520
|
+
- L component (relative strength leadership) will identify sector leaders and laggards
|
|
521
|
+
- Stocks in top quartile of their sector will score significantly higher
|
|
522
|
+
- Final scores will range 0-200 points (double Phase 1 range due to 0-100 per component)
|
|
523
|
+
|
|
524
|
+
**Interpretation Bands (Phase 3 Full CANSLIM)**:
|
|
525
|
+
- **160-200 points**: Exceptional (top 1-2% of stocks)
|
|
526
|
+
- **140-159 points**: Strong (top 5-10%)
|
|
527
|
+
- **120-139 points**: Above Average (top 20%)
|
|
528
|
+
- **100-119 points**: Average (meets minimums)
|
|
529
|
+
- **<100 points**: Below standard
|
|
530
|
+
|
|
531
|
+
---
|
|
532
|
+
|
|
533
|
+
## Usage Notes
|
|
534
|
+
|
|
535
|
+
### For Screener Implementation
|
|
536
|
+
|
|
537
|
+
1. **Calculate all 4 component scores** (C, A, N, M) for each stock
|
|
538
|
+
2. **Apply composite formula** with Phase 1 weights
|
|
539
|
+
3. **Identify weakest component** for each stock
|
|
540
|
+
4. **Rank stocks** by composite score (highest to lowest)
|
|
541
|
+
5. **Apply market filter** FIRST: If M score < 40, warn user to reduce exposure
|
|
542
|
+
|
|
543
|
+
### For User Reports
|
|
544
|
+
|
|
545
|
+
**Include in output**:
|
|
546
|
+
- Composite score (0-100)
|
|
547
|
+
- Rating (Exceptional / Strong / Above Average / Average / Below Average / Weak)
|
|
548
|
+
- Individual component scores (C, A, N, M)
|
|
549
|
+
- Weakest component identification
|
|
550
|
+
- Interpretation guidance
|
|
551
|
+
- Recommended action (buy / watchlist / avoid)
|
|
552
|
+
|
|
553
|
+
**Format Example**:
|
|
554
|
+
```
|
|
555
|
+
NVDA - NVIDIA Corporation
|
|
556
|
+
Composite Score: 97.7 / 100 (Exceptional)
|
|
557
|
+
|
|
558
|
+
Component Breakdown:
|
|
559
|
+
C (Current Earnings): 100 / 100 - Explosive growth (EPS +429% YoY)
|
|
560
|
+
A (Annual Growth): 95 / 100 - Exceptional 3yr CAGR (89%)
|
|
561
|
+
N (Newness): 98 / 100 - At new highs with AI catalyst
|
|
562
|
+
M (Market Direction): 100 / 100 - Strong bull market
|
|
563
|
+
|
|
564
|
+
Weakest Component: A (95) - Still exceptional
|
|
565
|
+
Recommendation: Strong buy - Rare multi-bagger setup
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
---
|
|
569
|
+
|
|
570
|
+
## Validation and Testing
|
|
571
|
+
|
|
572
|
+
### Test Cases
|
|
573
|
+
|
|
574
|
+
Validate scoring system with known CANSLIM winners:
|
|
575
|
+
|
|
576
|
+
**Expected Results (Phase 1 MVP)**:
|
|
577
|
+
- NVDA (2023 Q2): 95-100 points (Exceptional)
|
|
578
|
+
- META (2023 Q3): 80-90 points (Exceptional/Strong)
|
|
579
|
+
- AAPL (2009 Q3): 85-95 points (Exceptional)
|
|
580
|
+
- TSLA (2020 Q3): 80-90 points (Exceptional)
|
|
581
|
+
|
|
582
|
+
**Expected Results for Non-CANSLIM Stocks**:
|
|
583
|
+
- Declining earnings stocks: C < 40 → Composite < 50
|
|
584
|
+
- Stocks far from highs: N < 40 → Composite < 60
|
|
585
|
+
- In bear markets: M = 0 → Warning generated regardless of other scores
|
|
586
|
+
|
|
587
|
+
### Scoring System Integrity Checks
|
|
588
|
+
|
|
589
|
+
1. **Range Validation**: All component scores must be 0-100
|
|
590
|
+
2. **Weight Validation**: Sum of weights = 100% (0.27 + 0.36 + 0.27 + 0.10 = 1.00)
|
|
591
|
+
3. **Monotonicity**: Higher inputs → Higher scores (linear or step-function increases)
|
|
592
|
+
4. **Boundary Conditions**: Test edge cases (zero EPS, negative growth, etc.)
|
|
593
|
+
5. **Historical Validation**: Backtest on known winners 2019-2024
|
|
594
|
+
|
|
595
|
+
---
|
|
596
|
+
|
|
597
|
+
This scoring system provides a quantitative, objective framework for implementing O'Neil's CANSLIM methodology. Phase 1 captures the most predictive components (earnings and growth) while setting the foundation for full implementation in Phases 2-3.
|