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,642 @@
|
|
|
1
|
+
# Financial Modeling Prep (FMP) API Guide
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Financial Modeling Prep provides comprehensive financial data APIs for stocks, forex, cryptocurrencies, and more. This guide focuses on endpoints used for dividend growth stock screening with RSI technical indicators.
|
|
6
|
+
|
|
7
|
+
### Two-Stage Screening Approach
|
|
8
|
+
|
|
9
|
+
This screener supports two screening modes:
|
|
10
|
+
|
|
11
|
+
**1. Two-Stage (FINVIZ + FMP) - RECOMMENDED**
|
|
12
|
+
- **Stage 1**: FINVIZ Elite API pre-screens with RSI filter (1 API call → 10-50 candidates)
|
|
13
|
+
- **Stage 2**: FMP API performs detailed fundamental analysis on pre-screened candidates
|
|
14
|
+
- **Advantage**: Dramatically reduces FMP API calls by leveraging FINVIZ's technical filters
|
|
15
|
+
- **Cost**: FINVIZ Elite $40/month + FMP free tier
|
|
16
|
+
|
|
17
|
+
**2. FMP-Only (Original Method)**
|
|
18
|
+
- **Single Stage**: FMP stock-screener + detailed analysis
|
|
19
|
+
- **Limitation**: FMP free tier (250 requests/day) limits to ~40 stocks
|
|
20
|
+
- **Cost**: FMP free tier (upgrades available)
|
|
21
|
+
|
|
22
|
+
**Recommended**: Two-stage approach for regular screening (daily/weekly) to maximize coverage while minimizing costs.
|
|
23
|
+
|
|
24
|
+
## API Key Setup
|
|
25
|
+
|
|
26
|
+
### Obtaining an API Key
|
|
27
|
+
|
|
28
|
+
1. Visit https://financialmodelingprep.com/developer/docs
|
|
29
|
+
2. Sign up for a free account
|
|
30
|
+
3. Navigate to Dashboard → API Keys
|
|
31
|
+
4. Copy your API key
|
|
32
|
+
|
|
33
|
+
### Free Tier Limits
|
|
34
|
+
|
|
35
|
+
- **250 requests per day**
|
|
36
|
+
- **Rate limit**: ~5 requests per second
|
|
37
|
+
- **No credit card required**
|
|
38
|
+
- Sufficient for daily/weekly screening runs
|
|
39
|
+
|
|
40
|
+
### Paid Tiers (Optional)
|
|
41
|
+
|
|
42
|
+
- **Starter ($14/month)**: 500 requests/day
|
|
43
|
+
- **Professional ($29/month)**: 1,000 requests/day
|
|
44
|
+
- **Enterprise ($99/month)**: 10,000 requests/day
|
|
45
|
+
|
|
46
|
+
## Setting API Key
|
|
47
|
+
|
|
48
|
+
### Method 1: Environment Variable (Recommended)
|
|
49
|
+
|
|
50
|
+
**Linux/macOS:**
|
|
51
|
+
```bash
|
|
52
|
+
export FMP_API_KEY=your_api_key_here
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**Windows (Command Prompt):**
|
|
56
|
+
```cmd
|
|
57
|
+
set FMP_API_KEY=your_api_key_here
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**Windows (PowerShell):**
|
|
61
|
+
```powershell
|
|
62
|
+
$env:FMP_API_KEY="your_api_key_here"
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Persistent (add to shell profile):**
|
|
66
|
+
```bash
|
|
67
|
+
# Add to ~/.bashrc or ~/.zshrc
|
|
68
|
+
echo 'export FMP_API_KEY=your_api_key_here' >> ~/.bashrc
|
|
69
|
+
source ~/.bashrc
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Method 2: Command-Line Argument
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
python3 scripts/screen_dividend_growth_rsi.py --fmp-api-key your_api_key_here
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## FINVIZ API Setup (Optional - For Two-Stage Screening)
|
|
79
|
+
|
|
80
|
+
### Obtaining FINVIZ Elite API Key
|
|
81
|
+
|
|
82
|
+
1. Visit https://elite.finviz.com
|
|
83
|
+
2. Subscribe to FINVIZ Elite ($40/month or $400/year)
|
|
84
|
+
3. Navigate to Settings → API
|
|
85
|
+
4. Copy your API key
|
|
86
|
+
|
|
87
|
+
### Setting FINVIZ API Key
|
|
88
|
+
|
|
89
|
+
**Environment Variable (Recommended):**
|
|
90
|
+
```bash
|
|
91
|
+
export FINVIZ_API_KEY=your_finviz_key_here
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**Command-Line Argument:**
|
|
95
|
+
```bash
|
|
96
|
+
python3 screen_dividend_growth_rsi.py --use-finviz --finviz-api-key YOUR_KEY
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### FINVIZ Pre-Screening Filters
|
|
100
|
+
|
|
101
|
+
When using `--use-finviz`, the screener applies these filters via FINVIZ Elite API:
|
|
102
|
+
|
|
103
|
+
- **Market Cap**: Mid-cap or higher (≥$2B)
|
|
104
|
+
- **Dividend Yield**: 0.5-3% (captures dividend growers, excludes high-yield REITs/utilities)
|
|
105
|
+
- **Dividend Growth (3Y)**: 10%+ (FMP verifies 12%+)
|
|
106
|
+
- **EPS Growth (3Y)**: 5%+ (positive earnings momentum)
|
|
107
|
+
- **Sales Growth (3Y)**: 5%+ (positive revenue momentum)
|
|
108
|
+
- **RSI (14-period)**: Under 40 (oversold/pullback)
|
|
109
|
+
- **Geography**: USA
|
|
110
|
+
|
|
111
|
+
**Output**: Set of stock symbols (typically 30-50 stocks) passed to FMP for detailed analysis.
|
|
112
|
+
|
|
113
|
+
**Rationale for balanced filters:**
|
|
114
|
+
- 10%+ dividend growth ensures high-quality dividend compounders
|
|
115
|
+
- 5%+ EPS/sales growth captures growing businesses (not just mature dividend payers)
|
|
116
|
+
- 0.5-3% yield range excludes mature high-yielders (>4%) and focuses on growth stocks
|
|
117
|
+
- Reduces FINVIZ candidates from ~90 to ~30-50 stocks
|
|
118
|
+
- Stays within FMP free tier limits with efficient analysis (250 requests/day)
|
|
119
|
+
|
|
120
|
+
## Key Endpoints Used
|
|
121
|
+
|
|
122
|
+
### 1. Stock Screener
|
|
123
|
+
|
|
124
|
+
**Endpoint:** `/v3/stock-screener`
|
|
125
|
+
|
|
126
|
+
**Purpose:** Initial filtering by market cap and exchange
|
|
127
|
+
|
|
128
|
+
**Parameters:**
|
|
129
|
+
- `marketCapMoreThan`: Minimum market cap (e.g., 2000000000 = $2B)
|
|
130
|
+
- `exchange`: Exchanges to include (e.g., "NASDAQ,NYSE")
|
|
131
|
+
- `limit`: Max results (default: 1000)
|
|
132
|
+
|
|
133
|
+
**Note:** This screener does NOT pre-filter by dividend yield (unlike value-dividend-screener). We retrieve a broader universe and calculate actual yields from dividend history to ensure accuracy.
|
|
134
|
+
|
|
135
|
+
**Example Request:**
|
|
136
|
+
```
|
|
137
|
+
https://financialmodelingprep.com/api/v3/stock-screener?
|
|
138
|
+
marketCapMoreThan=2000000000&
|
|
139
|
+
exchange=NASDAQ,NYSE&
|
|
140
|
+
limit=1000&
|
|
141
|
+
apikey=YOUR_API_KEY
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**Response Format:**
|
|
145
|
+
```json
|
|
146
|
+
[
|
|
147
|
+
{
|
|
148
|
+
"symbol": "AAPL",
|
|
149
|
+
"companyName": "Apple Inc.",
|
|
150
|
+
"marketCap": 2800000000000,
|
|
151
|
+
"sector": "Technology",
|
|
152
|
+
"industry": "Consumer Electronics",
|
|
153
|
+
"price": 185.50,
|
|
154
|
+
"exchange": "NASDAQ",
|
|
155
|
+
"isActivelyTrading": true
|
|
156
|
+
}
|
|
157
|
+
]
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### 2. Historical Dividend
|
|
161
|
+
|
|
162
|
+
**Endpoint:** `/v3/historical-price-full/stock_dividend/{symbol}`
|
|
163
|
+
|
|
164
|
+
**Purpose:** Dividend history for growth rate calculation and yield verification
|
|
165
|
+
|
|
166
|
+
**Example Request:**
|
|
167
|
+
```
|
|
168
|
+
https://financialmodelingprep.com/api/v3/historical-price-full/stock_dividend/AAPL?
|
|
169
|
+
apikey=YOUR_API_KEY
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
**Response Format:**
|
|
173
|
+
```json
|
|
174
|
+
{
|
|
175
|
+
"symbol": "AAPL",
|
|
176
|
+
"historical": [
|
|
177
|
+
{
|
|
178
|
+
"date": "2024-11-08",
|
|
179
|
+
"label": "November 08, 24",
|
|
180
|
+
"adjDividend": 0.25,
|
|
181
|
+
"dividend": 0.25,
|
|
182
|
+
"recordDate": "2024-11-11",
|
|
183
|
+
"paymentDate": "2024-11-14",
|
|
184
|
+
"declarationDate": "2024-10-31"
|
|
185
|
+
}
|
|
186
|
+
]
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
**Usage in Script:**
|
|
191
|
+
- Aggregate dividends by calendar year (sum all payments in each year)
|
|
192
|
+
- Calculate 3-year dividend CAGR: `((Div_Year3 / Div_Year0) ^ (1/3) - 1) × 100`
|
|
193
|
+
- Extract latest annual dividend for yield calculation
|
|
194
|
+
- Verify consistency (no significant cuts year-over-year)
|
|
195
|
+
|
|
196
|
+
### 3. Historical Prices (NEW for RSI)
|
|
197
|
+
|
|
198
|
+
**Endpoint:** `/v3/historical-price-full/{symbol}`
|
|
199
|
+
|
|
200
|
+
**Purpose:** Daily price data for RSI calculation
|
|
201
|
+
|
|
202
|
+
**Parameters:**
|
|
203
|
+
- `symbol`: Stock ticker
|
|
204
|
+
- `timeseries`: Number of days to retrieve (e.g., 30)
|
|
205
|
+
|
|
206
|
+
**Example Request:**
|
|
207
|
+
```
|
|
208
|
+
https://financialmodelingprep.com/api/v3/historical-price-full/AAPL?
|
|
209
|
+
timeseries=30&
|
|
210
|
+
apikey=YOUR_API_KEY
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
**Response Format:**
|
|
214
|
+
```json
|
|
215
|
+
{
|
|
216
|
+
"symbol": "AAPL",
|
|
217
|
+
"historical": [
|
|
218
|
+
{
|
|
219
|
+
"date": "2024-11-01",
|
|
220
|
+
"open": 184.50,
|
|
221
|
+
"high": 186.20,
|
|
222
|
+
"low": 183.80,
|
|
223
|
+
"close": 185.50,
|
|
224
|
+
"adjClose": 185.50,
|
|
225
|
+
"volume": 45000000,
|
|
226
|
+
"unadjustedVolume": 45000000,
|
|
227
|
+
"change": 1.00,
|
|
228
|
+
"changePercent": 0.54,
|
|
229
|
+
"vwap": 185.10,
|
|
230
|
+
"label": "November 01, 24",
|
|
231
|
+
"changeOverTime": 0.0054
|
|
232
|
+
}
|
|
233
|
+
]
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
**Usage in Script:**
|
|
238
|
+
- Extract `close` prices from last 30 days
|
|
239
|
+
- Sort chronologically (oldest first)
|
|
240
|
+
- Calculate 14-period RSI:
|
|
241
|
+
1. Compute price changes (close[i] - close[i-1])
|
|
242
|
+
2. Separate gains and losses
|
|
243
|
+
3. Calculate average gain and average loss over 14 periods
|
|
244
|
+
4. RS = Average Gain / Average Loss
|
|
245
|
+
5. RSI = 100 - (100 / (1 + RS))
|
|
246
|
+
|
|
247
|
+
**RSI Filter:** Stocks with RSI > 40 are excluded (not oversold/pullback)
|
|
248
|
+
|
|
249
|
+
### 4. Income Statement
|
|
250
|
+
|
|
251
|
+
**Endpoint:** `/v3/income-statement/{symbol}`
|
|
252
|
+
|
|
253
|
+
**Purpose:** Revenue, EPS, net income analysis
|
|
254
|
+
|
|
255
|
+
**Parameters:**
|
|
256
|
+
- `symbol`: Stock ticker (e.g., "AAPL")
|
|
257
|
+
- `limit`: Number of periods (e.g., 5 for 5 years)
|
|
258
|
+
- `period`: "annual" (default)
|
|
259
|
+
|
|
260
|
+
**Example Request:**
|
|
261
|
+
```
|
|
262
|
+
https://financialmodelingprep.com/api/v3/income-statement/AAPL?
|
|
263
|
+
limit=5&
|
|
264
|
+
apikey=YOUR_API_KEY
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
**Key Fields Used:**
|
|
268
|
+
- `revenue`: Total revenue
|
|
269
|
+
- `eps`: Earnings per share
|
|
270
|
+
- `netIncome`: Net income (for payout ratio calculation)
|
|
271
|
+
- `date`: Fiscal period end date
|
|
272
|
+
|
|
273
|
+
**Usage in Script:**
|
|
274
|
+
- Calculate 3-year revenue CAGR (must be positive for qualification)
|
|
275
|
+
- Calculate 3-year EPS CAGR (must be positive)
|
|
276
|
+
- Extract net income for payout ratio calculation
|
|
277
|
+
|
|
278
|
+
### 5. Balance Sheet Statement
|
|
279
|
+
|
|
280
|
+
**Endpoint:** `/v3/balance-sheet-statement/{symbol}`
|
|
281
|
+
|
|
282
|
+
**Purpose:** Debt, equity, liquidity analysis
|
|
283
|
+
|
|
284
|
+
**Parameters:**
|
|
285
|
+
- `symbol`: Stock ticker
|
|
286
|
+
- `limit`: Number of periods (typically 5)
|
|
287
|
+
|
|
288
|
+
**Key Fields Used:**
|
|
289
|
+
- `totalDebt`: Total debt (short-term + long-term)
|
|
290
|
+
- `totalStockholdersEquity`: Shareholders' equity
|
|
291
|
+
- `totalCurrentAssets`: Current assets
|
|
292
|
+
- `totalCurrentLiabilities`: Current liabilities
|
|
293
|
+
|
|
294
|
+
**Usage in Script:**
|
|
295
|
+
- Debt-to-Equity: totalDebt / totalStockholdersEquity (must be < 2.0)
|
|
296
|
+
- Current Ratio: totalCurrentAssets / totalCurrentLiabilities (must be > 1.0)
|
|
297
|
+
- Financial health check (both ratios must pass)
|
|
298
|
+
|
|
299
|
+
### 6. Cash Flow Statement
|
|
300
|
+
|
|
301
|
+
**Endpoint:** `/v3/cash-flow-statement/{symbol}`
|
|
302
|
+
|
|
303
|
+
**Purpose:** Free cash flow analysis for dividend sustainability
|
|
304
|
+
|
|
305
|
+
**Parameters:**
|
|
306
|
+
- `symbol`: Stock ticker
|
|
307
|
+
- `limit`: Number of periods
|
|
308
|
+
|
|
309
|
+
**Key Fields Used:**
|
|
310
|
+
- `freeCashFlow`: Free cash flow (OCF - Capex)
|
|
311
|
+
- `dividendsPaid`: Actual dividends paid (negative value)
|
|
312
|
+
|
|
313
|
+
**Usage in Script:**
|
|
314
|
+
- FCF Payout Ratio: dividendsPaid / freeCashFlow
|
|
315
|
+
- Validates dividend is covered by cash generation (< 100% is sustainable)
|
|
316
|
+
|
|
317
|
+
### 7. Key Metrics
|
|
318
|
+
|
|
319
|
+
**Endpoint:** `/v3/key-metrics/{symbol}`
|
|
320
|
+
|
|
321
|
+
**Purpose:** ROE, profit margins, valuation ratios
|
|
322
|
+
|
|
323
|
+
**Parameters:**
|
|
324
|
+
- `symbol`: Stock ticker
|
|
325
|
+
- `limit`: Number of periods (typically 1 for latest)
|
|
326
|
+
|
|
327
|
+
**Key Fields Used:**
|
|
328
|
+
- `roe`: Return on Equity (decimal, e.g., 0.15 = 15%)
|
|
329
|
+
- `netProfitMargin`: Net profit margin (decimal)
|
|
330
|
+
- `peRatio`: Price-to-Earnings ratio
|
|
331
|
+
- `pbRatio`: Price-to-Book ratio
|
|
332
|
+
- `numberOfShares`: Shares outstanding (for payout ratio calculation)
|
|
333
|
+
|
|
334
|
+
**Usage in Script:**
|
|
335
|
+
- ROE: Quality metric for composite scoring (higher is better)
|
|
336
|
+
- Profit Margin: Profitability metric for scoring
|
|
337
|
+
- P/E and P/B: Context only (no exclusionary limits in this screener)
|
|
338
|
+
- Number of Shares: Used to calculate total dividend payout
|
|
339
|
+
|
|
340
|
+
## Rate Limiting Strategy
|
|
341
|
+
|
|
342
|
+
### Built-in Protection
|
|
343
|
+
|
|
344
|
+
The screening script includes rate limiting:
|
|
345
|
+
- **0.3 second delay** between requests (~3 requests/second)
|
|
346
|
+
- **Automatic retry** on 429 (rate limit exceeded) with 60-second backoff
|
|
347
|
+
- **Timeout**: 30 seconds per request
|
|
348
|
+
- **Graceful degradation**: Stops analysis if rate limit reached, returns partial results
|
|
349
|
+
|
|
350
|
+
### Managing Request Budget
|
|
351
|
+
|
|
352
|
+
For free tier (250 requests/day):
|
|
353
|
+
|
|
354
|
+
**Requests per stock analyzed:**
|
|
355
|
+
- Stock Screener: 1 request (returns 100-1000 stocks)
|
|
356
|
+
- Dividend History: 1 request per symbol
|
|
357
|
+
- Historical Prices (RSI): 1 request per symbol
|
|
358
|
+
- Income Statement: 1 request per symbol
|
|
359
|
+
- Balance Sheet: 1 request per symbol
|
|
360
|
+
- Cash Flow: 1 request per symbol
|
|
361
|
+
- Key Metrics: 1 request per symbol
|
|
362
|
+
|
|
363
|
+
**Total: 6 requests per symbol + 1 screener request**
|
|
364
|
+
|
|
365
|
+
**Budget allocation:**
|
|
366
|
+
- Initial screener: 1 request
|
|
367
|
+
- Detailed analysis: 6 × N stocks = 6N requests
|
|
368
|
+
- **Maximum stocks per run**: (250 - 1) / 6 = ~41 stocks
|
|
369
|
+
|
|
370
|
+
**FMP-Only Mode Optimization**: Use `--max-candidates` parameter to limit analysis:
|
|
371
|
+
```bash
|
|
372
|
+
python3 screen_dividend_growth_rsi.py --max-candidates 40
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
**Two-Stage Mode (RECOMMENDED)**:
|
|
376
|
+
|
|
377
|
+
When using FINVIZ pre-screening (`--use-finviz`):
|
|
378
|
+
|
|
379
|
+
**Request breakdown:**
|
|
380
|
+
- FINVIZ pre-screen: 1 FINVIZ API call → 10-50 symbols
|
|
381
|
+
- FMP quote fetching: 1 request per symbol (to get current price)
|
|
382
|
+
- FMP detailed analysis: 6 requests per symbol (dividend, prices, income, balance, cashflow, metrics)
|
|
383
|
+
|
|
384
|
+
**Total FMP requests**:
|
|
385
|
+
- 10 symbols: 10 + (6 × 10) = 70 requests
|
|
386
|
+
- 30 symbols: 30 + (6 × 30) = 210 requests
|
|
387
|
+
- 50 symbols: 50 + (6 × 50) = 350 requests (exceeds free tier)
|
|
388
|
+
|
|
389
|
+
**Advantage**: FINVIZ's RSI filter typically returns 10-30 stocks (not 1000), making FMP analysis feasible within free tier limits.
|
|
390
|
+
|
|
391
|
+
**Cost comparison:**
|
|
392
|
+
- **FMP Starter Plan** ($14/month, 500 requests): ~80 stocks/day
|
|
393
|
+
- **FINVIZ Elite + FMP Free** ($40/month, 250 FMP requests): ~30 stocks/day with RSI pre-filtering
|
|
394
|
+
- **Result**: FINVIZ approach provides higher-quality candidates (RSI pre-filtered) despite lower volume
|
|
395
|
+
|
|
396
|
+
### Best Practices
|
|
397
|
+
|
|
398
|
+
1. **Use FINVIZ two-stage for regular screening**: Maximizes candidate quality, stays within FMP free tier
|
|
399
|
+
2. **Run FMP-only for one-time analysis**: Good for testing or when FINVIZ subscription not available
|
|
400
|
+
3. **Run during off-peak hours**: Lower chance of rate limits
|
|
401
|
+
4. **Space out runs**: Once daily or weekly, not multiple times per hour
|
|
402
|
+
5. **Cache results**: Save JSON output and analyze locally
|
|
403
|
+
6. **Upgrade if needed**: If screening >30 stocks daily, consider FMP Starter ($14/month)
|
|
404
|
+
|
|
405
|
+
## Error Handling
|
|
406
|
+
|
|
407
|
+
### Common Errors
|
|
408
|
+
|
|
409
|
+
**1. Invalid API Key**
|
|
410
|
+
```json
|
|
411
|
+
{
|
|
412
|
+
"Error Message": "Invalid API KEY. Please retry or visit our documentation."
|
|
413
|
+
}
|
|
414
|
+
```
|
|
415
|
+
**Solution**: Check API key, verify it's active in FMP dashboard
|
|
416
|
+
|
|
417
|
+
**2. Rate Limit Exceeded (429)**
|
|
418
|
+
```json
|
|
419
|
+
{
|
|
420
|
+
"Error Message": "You have exceeded the rate limit. Please wait."
|
|
421
|
+
}
|
|
422
|
+
```
|
|
423
|
+
**Solution**: Script automatically retries once after 60 seconds. If persistent, wait 24 hours for rate limit reset.
|
|
424
|
+
|
|
425
|
+
**3. Symbol Not Found**
|
|
426
|
+
```json
|
|
427
|
+
{
|
|
428
|
+
"Error Message": "Invalid ticker symbol"
|
|
429
|
+
}
|
|
430
|
+
```
|
|
431
|
+
**Solution**: Script skips symbol and continues (expected for delisted/invalid tickers)
|
|
432
|
+
|
|
433
|
+
**4. Insufficient Price Data for RSI**
|
|
434
|
+
- Empty array or < 20 days of price data
|
|
435
|
+
**Solution**: Script skips symbol (common for newly listed stocks, low-volume stocks, or data gaps)
|
|
436
|
+
|
|
437
|
+
**5. Insufficient Dividend Data**
|
|
438
|
+
- Empty dividend history or < 4 years of data
|
|
439
|
+
**Solution**: Script skips symbol (requires 4+ years to calculate 3-year CAGR)
|
|
440
|
+
|
|
441
|
+
### Debugging
|
|
442
|
+
|
|
443
|
+
**Check request count:**
|
|
444
|
+
```bash
|
|
445
|
+
# Count API calls in script output
|
|
446
|
+
python3 scripts/screen_dividend_growth_rsi.py 2>&1 | grep "Analyzing" | wc -l
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
**Monitor rate limit status:**
|
|
450
|
+
Script outputs warning when approaching limit:
|
|
451
|
+
```
|
|
452
|
+
⚠️ API rate limit reached after analyzing 41 stocks.
|
|
453
|
+
Returning results collected so far: 3 qualified stocks
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
**Verbose debugging (if needed):**
|
|
457
|
+
Add at top of script:
|
|
458
|
+
```python
|
|
459
|
+
import logging
|
|
460
|
+
logging.basicConfig(level=logging.DEBUG)
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
## Data Quality Considerations
|
|
464
|
+
|
|
465
|
+
### Data Freshness
|
|
466
|
+
|
|
467
|
+
- **Annual statements**: Updated after fiscal year end (delays possible)
|
|
468
|
+
- **Real-time prices**: Updated during market hours
|
|
469
|
+
- **Dividend history**: Updated after declaration/payment
|
|
470
|
+
- **RSI calculation**: Based on most recent 30 days of price data
|
|
471
|
+
|
|
472
|
+
### Data Gaps
|
|
473
|
+
|
|
474
|
+
Some stocks may have:
|
|
475
|
+
- **Incomplete price history**: < 30 days (newly public, suspended trading)
|
|
476
|
+
- **Missing dividends**: Not all dividend-paying stocks report via API
|
|
477
|
+
- **Inconsistent metrics**: Different accounting standards, restatements
|
|
478
|
+
- **Adjusted prices**: Stock splits, dividends affect historical prices
|
|
479
|
+
|
|
480
|
+
**Script behavior**: Skips stocks with insufficient data (requires 4+ years dividends, 30+ days prices)
|
|
481
|
+
|
|
482
|
+
### Data Accuracy
|
|
483
|
+
|
|
484
|
+
FMP sources data from:
|
|
485
|
+
- SEC EDGAR filings (US companies)
|
|
486
|
+
- Exchange data feeds (real-time prices)
|
|
487
|
+
- Company investor relations
|
|
488
|
+
|
|
489
|
+
**Note**: Always verify critical investment decisions with:
|
|
490
|
+
- Company filings (10-K, 10-Q) at sec.gov
|
|
491
|
+
- Company investor relations websites
|
|
492
|
+
- Multiple data sources for confirmation
|
|
493
|
+
|
|
494
|
+
### RSI Calculation Accuracy
|
|
495
|
+
|
|
496
|
+
**Inputs:**
|
|
497
|
+
- 30 days of closing prices (ensures 14-period RSI + buffer)
|
|
498
|
+
- Standard 14-period RSI formula
|
|
499
|
+
|
|
500
|
+
**Potential issues:**
|
|
501
|
+
- **Data gaps**: Weekends, holidays, halted trading (script uses available data)
|
|
502
|
+
- **Split adjustments**: FMP provides adjusted prices (correct behavior)
|
|
503
|
+
- **Intraday volatility**: RSI uses only closing prices (not intraday highs/lows)
|
|
504
|
+
|
|
505
|
+
**Validation**: Compare calculated RSI with other sources (TradingView, Yahoo Finance) to verify accuracy.
|
|
506
|
+
|
|
507
|
+
## Screening Workflow
|
|
508
|
+
|
|
509
|
+
### Request Sequence
|
|
510
|
+
|
|
511
|
+
```
|
|
512
|
+
1. Stock Screener (1 request)
|
|
513
|
+
↓ Returns 100-1000 candidates
|
|
514
|
+
|
|
515
|
+
For each candidate (up to max-candidates limit):
|
|
516
|
+
|
|
517
|
+
2. Dividend History (1 request)
|
|
518
|
+
↓ Calculate dividend yield and CAGR
|
|
519
|
+
↓ If yield < 1.5% or CAGR < 12% → Skip
|
|
520
|
+
|
|
521
|
+
3. Historical Prices (1 request)
|
|
522
|
+
↓ Calculate RSI
|
|
523
|
+
↓ If RSI > 40 → Skip
|
|
524
|
+
|
|
525
|
+
4. Income Statement (1 request)
|
|
526
|
+
↓ Calculate revenue/EPS growth
|
|
527
|
+
↓ If negative growth → Skip
|
|
528
|
+
|
|
529
|
+
5. Balance Sheet (1 request)
|
|
530
|
+
↓ Check financial health
|
|
531
|
+
↓ If unhealthy ratios → Skip
|
|
532
|
+
|
|
533
|
+
6. Cash Flow (1 request)
|
|
534
|
+
↓ Calculate FCF payout ratio
|
|
535
|
+
|
|
536
|
+
7. Key Metrics (1 request)
|
|
537
|
+
↓ Extract ROE, margins, valuation
|
|
538
|
+
|
|
539
|
+
8. Composite Scoring
|
|
540
|
+
↓ Rank qualified stocks
|
|
541
|
+
|
|
542
|
+
9. Output JSON + Markdown Report
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
**Optimization**: Early exits reduce API calls. If a stock fails dividend or RSI checks (steps 2-3), remaining 4 API calls are skipped.
|
|
546
|
+
|
|
547
|
+
## API Documentation
|
|
548
|
+
|
|
549
|
+
**Official Docs**: https://financialmodelingprep.com/developer/docs
|
|
550
|
+
|
|
551
|
+
**Key Sections:**
|
|
552
|
+
- Stock Fundamentals API
|
|
553
|
+
- Stock Screener API
|
|
554
|
+
- Historical Dividend API
|
|
555
|
+
- Historical Price API
|
|
556
|
+
- Ratios API
|
|
557
|
+
|
|
558
|
+
**Support**: support@financialmodelingprep.com
|
|
559
|
+
|
|
560
|
+
## Alternative Data Sources
|
|
561
|
+
|
|
562
|
+
If FMP limits are restrictive:
|
|
563
|
+
|
|
564
|
+
1. **Alpha Vantage**: Free tier, 500 requests/day, includes RSI endpoint
|
|
565
|
+
2. **Yahoo Finance (yfinance)**: Free, unlimited, Python library available
|
|
566
|
+
3. **Quandl/Nasdaq Data Link**: Free tier available for fundamental data
|
|
567
|
+
4. **IEX Cloud**: Free tier, 50k messages/month
|
|
568
|
+
|
|
569
|
+
**Implementation Notes:**
|
|
570
|
+
- Alternative sources require script modifications for different data formats
|
|
571
|
+
- Yahoo Finance (yfinance) provides built-in RSI calculation
|
|
572
|
+
- Alpha Vantage has dedicated technical indicators endpoint
|
|
573
|
+
|
|
574
|
+
**yfinance Example (Free Alternative):**
|
|
575
|
+
```python
|
|
576
|
+
import yfinance as yf
|
|
577
|
+
|
|
578
|
+
# Get stock data
|
|
579
|
+
ticker = yf.Ticker("AAPL")
|
|
580
|
+
|
|
581
|
+
# Dividend history
|
|
582
|
+
dividends = ticker.dividends
|
|
583
|
+
|
|
584
|
+
# Historical prices
|
|
585
|
+
prices = ticker.history(period="1mo")
|
|
586
|
+
|
|
587
|
+
# Calculate RSI manually or use TA-Lib
|
|
588
|
+
```
|
|
589
|
+
|
|
590
|
+
**Trade-offs:**
|
|
591
|
+
- FMP: Structured, comprehensive, rate-limited
|
|
592
|
+
- yfinance: Free, unlimited, less reliable (Yahoo API changes frequently)
|
|
593
|
+
- Alpha Vantage: Good for technical indicators, limited fundamental data
|
|
594
|
+
|
|
595
|
+
## Troubleshooting
|
|
596
|
+
|
|
597
|
+
### "No Results Found"
|
|
598
|
+
|
|
599
|
+
**Possible Causes:**
|
|
600
|
+
1. All stocks failed RSI check (market not oversold)
|
|
601
|
+
2. High dividend growth (12%+) is rare
|
|
602
|
+
3. API rate limit reached before finding qualified stocks
|
|
603
|
+
|
|
604
|
+
**Solutions:**
|
|
605
|
+
- Relax RSI: `--rsi-max 45`
|
|
606
|
+
- Lower dividend growth: `--min-div-growth 10.0`
|
|
607
|
+
- Reduce candidates: `--max-candidates 30` to avoid rate limit
|
|
608
|
+
- Check during market corrections (more oversold opportunities)
|
|
609
|
+
|
|
610
|
+
### "Rate Limit Reached Quickly"
|
|
611
|
+
|
|
612
|
+
**Causes:**
|
|
613
|
+
- Used API for other purposes earlier today
|
|
614
|
+
- Script analyzed many stocks before finding qualified ones
|
|
615
|
+
- API limit reset not yet occurred (resets at UTC midnight)
|
|
616
|
+
|
|
617
|
+
**Solutions:**
|
|
618
|
+
- Wait 24 hours for rate limit reset
|
|
619
|
+
- Use `--max-candidates 30` to conserve requests
|
|
620
|
+
- Upgrade to paid tier ($14/month for 500 requests/day)
|
|
621
|
+
- Check current usage in FMP dashboard
|
|
622
|
+
|
|
623
|
+
### "RSI Calculation Errors"
|
|
624
|
+
|
|
625
|
+
**Causes:**
|
|
626
|
+
- Stock has < 20 days of trading history
|
|
627
|
+
- Data gaps (suspended trading, newly listed)
|
|
628
|
+
- API returned incomplete price data
|
|
629
|
+
|
|
630
|
+
**Solution:**
|
|
631
|
+
Script automatically skips these stocks with warning:
|
|
632
|
+
```
|
|
633
|
+
⚠️ Insufficient price data for RSI calculation
|
|
634
|
+
```
|
|
635
|
+
|
|
636
|
+
No action needed - this is expected behavior.
|
|
637
|
+
|
|
638
|
+
---
|
|
639
|
+
|
|
640
|
+
**Last Updated**: November 2025
|
|
641
|
+
**Script Version**: 1.0
|
|
642
|
+
**FMP API Version**: v3
|