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,450 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Institutional Flow Tracker - Main Screening Script
|
|
4
|
+
|
|
5
|
+
Screens for stocks with significant institutional ownership changes by analyzing
|
|
6
|
+
13F filings data. Identifies stocks where smart money is accumulating or distributing.
|
|
7
|
+
|
|
8
|
+
Usage:
|
|
9
|
+
python3 track_institutional_flow.py --top 50 --min-change-percent 10
|
|
10
|
+
python3 track_institutional_flow.py --sector Technology --min-institutions 20
|
|
11
|
+
python3 track_institutional_flow.py --api-key YOUR_KEY --output results.json
|
|
12
|
+
|
|
13
|
+
Requirements:
|
|
14
|
+
- FMP API key (set FMP_API_KEY environment variable or pass --api-key)
|
|
15
|
+
- Free tier: 250 requests/day (sufficient for ~40-50 stocks)
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
import argparse
|
|
19
|
+
import json
|
|
20
|
+
import os
|
|
21
|
+
import sys
|
|
22
|
+
from datetime import datetime
|
|
23
|
+
from typing import List, Dict, Optional
|
|
24
|
+
import time
|
|
25
|
+
|
|
26
|
+
try:
|
|
27
|
+
import requests
|
|
28
|
+
except ImportError:
|
|
29
|
+
print("Error: 'requests' library not installed. Install with: pip install requests")
|
|
30
|
+
sys.exit(1)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class InstitutionalFlowTracker:
|
|
34
|
+
"""Track institutional ownership changes across stocks"""
|
|
35
|
+
|
|
36
|
+
def __init__(self, api_key: str):
|
|
37
|
+
self.api_key = api_key
|
|
38
|
+
self.base_url = "https://financialmodelingprep.com/api/v3"
|
|
39
|
+
self.base_url_v4 = "https://financialmodelingprep.com/api/v4"
|
|
40
|
+
|
|
41
|
+
def get_stock_screener(
|
|
42
|
+
self,
|
|
43
|
+
market_cap_min: int = 1000000000,
|
|
44
|
+
limit: int = 500
|
|
45
|
+
) -> List[Dict]:
|
|
46
|
+
"""Get list of stocks meeting market cap criteria"""
|
|
47
|
+
url = f"{self.base_url}/stock-screener"
|
|
48
|
+
params = {
|
|
49
|
+
"marketCapMoreThan": market_cap_min,
|
|
50
|
+
"limit": limit,
|
|
51
|
+
"apikey": self.api_key
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
try:
|
|
55
|
+
response = requests.get(url, params=params, timeout=30)
|
|
56
|
+
response.raise_for_status()
|
|
57
|
+
return response.json()
|
|
58
|
+
except requests.exceptions.RequestException as e:
|
|
59
|
+
print(f"Error fetching stock screener: {e}")
|
|
60
|
+
return []
|
|
61
|
+
|
|
62
|
+
def get_institutional_holders(self, symbol: str) -> List[Dict]:
|
|
63
|
+
"""Get institutional holders for a specific stock"""
|
|
64
|
+
url = f"{self.base_url}/institutional-holder/{symbol}"
|
|
65
|
+
params = {"apikey": self.api_key}
|
|
66
|
+
|
|
67
|
+
try:
|
|
68
|
+
response = requests.get(url, params=params, timeout=30)
|
|
69
|
+
response.raise_for_status()
|
|
70
|
+
data = response.json()
|
|
71
|
+
return data if isinstance(data, list) else []
|
|
72
|
+
except requests.exceptions.RequestException as e:
|
|
73
|
+
print(f"Error fetching institutional holders for {symbol}: {e}")
|
|
74
|
+
return []
|
|
75
|
+
|
|
76
|
+
def calculate_ownership_metrics(
|
|
77
|
+
self,
|
|
78
|
+
symbol: str,
|
|
79
|
+
company_name: str,
|
|
80
|
+
market_cap: float
|
|
81
|
+
) -> Optional[Dict]:
|
|
82
|
+
"""Calculate institutional ownership metrics for a stock"""
|
|
83
|
+
holders = self.get_institutional_holders(symbol)
|
|
84
|
+
|
|
85
|
+
if not holders or len(holders) < 2:
|
|
86
|
+
return None
|
|
87
|
+
|
|
88
|
+
# Group by date to get quarterly snapshots
|
|
89
|
+
quarters = {}
|
|
90
|
+
for holder in holders:
|
|
91
|
+
date = holder.get('dateReported', '')
|
|
92
|
+
if not date:
|
|
93
|
+
continue
|
|
94
|
+
if date not in quarters:
|
|
95
|
+
quarters[date] = []
|
|
96
|
+
quarters[date].append(holder)
|
|
97
|
+
|
|
98
|
+
# Need at least 2 quarters for comparison
|
|
99
|
+
if len(quarters) < 2:
|
|
100
|
+
return None
|
|
101
|
+
|
|
102
|
+
# Get most recent 2 quarters
|
|
103
|
+
sorted_quarters = sorted(quarters.keys(), reverse=True)
|
|
104
|
+
current_q = sorted_quarters[0]
|
|
105
|
+
previous_q = sorted_quarters[1]
|
|
106
|
+
|
|
107
|
+
current_holders = quarters[current_q]
|
|
108
|
+
previous_holders = quarters[previous_q]
|
|
109
|
+
|
|
110
|
+
# Calculate aggregate metrics
|
|
111
|
+
current_total_shares = sum(h.get('totalShares', 0) for h in current_holders)
|
|
112
|
+
previous_total_shares = sum(h.get('totalShares', 0) for h in previous_holders)
|
|
113
|
+
|
|
114
|
+
# Calculate changes
|
|
115
|
+
shares_change = current_total_shares - previous_total_shares
|
|
116
|
+
if previous_total_shares > 0:
|
|
117
|
+
percent_change = (shares_change / previous_total_shares) * 100
|
|
118
|
+
else:
|
|
119
|
+
percent_change = 0
|
|
120
|
+
|
|
121
|
+
# Count institutions
|
|
122
|
+
current_count = len(current_holders)
|
|
123
|
+
previous_count = len(previous_holders)
|
|
124
|
+
institution_change = current_count - previous_count
|
|
125
|
+
|
|
126
|
+
# Calculate dollar value (approximate)
|
|
127
|
+
# Note: This is approximate as we don't have exact prices
|
|
128
|
+
current_value = sum(h.get('totalInvested', 0) for h in current_holders)
|
|
129
|
+
previous_value = sum(h.get('totalInvested', 0) for h in previous_holders)
|
|
130
|
+
value_change = current_value - previous_value
|
|
131
|
+
|
|
132
|
+
# Get top holders
|
|
133
|
+
top_holders = sorted(
|
|
134
|
+
current_holders,
|
|
135
|
+
key=lambda x: x.get('totalShares', 0),
|
|
136
|
+
reverse=True
|
|
137
|
+
)[:10]
|
|
138
|
+
|
|
139
|
+
top_holder_names = [
|
|
140
|
+
{
|
|
141
|
+
'name': h.get('holder', 'Unknown'),
|
|
142
|
+
'shares': h.get('totalShares', 0),
|
|
143
|
+
'change': h.get('change', 0)
|
|
144
|
+
}
|
|
145
|
+
for h in top_holders
|
|
146
|
+
]
|
|
147
|
+
|
|
148
|
+
return {
|
|
149
|
+
'symbol': symbol,
|
|
150
|
+
'company_name': company_name,
|
|
151
|
+
'market_cap': market_cap,
|
|
152
|
+
'current_quarter': current_q,
|
|
153
|
+
'previous_quarter': previous_q,
|
|
154
|
+
'current_total_shares': current_total_shares,
|
|
155
|
+
'previous_total_shares': previous_total_shares,
|
|
156
|
+
'shares_change': shares_change,
|
|
157
|
+
'percent_change': round(percent_change, 2),
|
|
158
|
+
'current_institution_count': current_count,
|
|
159
|
+
'previous_institution_count': previous_count,
|
|
160
|
+
'institution_count_change': institution_change,
|
|
161
|
+
'current_value': current_value,
|
|
162
|
+
'previous_value': previous_value,
|
|
163
|
+
'value_change': value_change,
|
|
164
|
+
'top_holders': top_holder_names
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
def screen_stocks(
|
|
168
|
+
self,
|
|
169
|
+
min_market_cap: int = 1000000000,
|
|
170
|
+
min_change_percent: float = 10.0,
|
|
171
|
+
min_institutions: int = 10,
|
|
172
|
+
sector: Optional[str] = None,
|
|
173
|
+
top: int = 50,
|
|
174
|
+
sort_by: str = 'ownership_change'
|
|
175
|
+
) -> List[Dict]:
|
|
176
|
+
"""Screen for stocks with significant institutional changes"""
|
|
177
|
+
|
|
178
|
+
print(f"Fetching stocks with market cap >= ${min_market_cap:,}...")
|
|
179
|
+
stocks = self.get_stock_screener(market_cap_min=min_market_cap, limit=500)
|
|
180
|
+
|
|
181
|
+
if not stocks:
|
|
182
|
+
print("No stocks found in screener")
|
|
183
|
+
return []
|
|
184
|
+
|
|
185
|
+
# Filter by sector if specified
|
|
186
|
+
if sector:
|
|
187
|
+
stocks = [s for s in stocks if s.get('sector', '').lower() == sector.lower()]
|
|
188
|
+
print(f"Filtered to {len(stocks)} stocks in {sector} sector")
|
|
189
|
+
|
|
190
|
+
print(f"Analyzing institutional ownership for {len(stocks)} stocks...")
|
|
191
|
+
print("This may take a few minutes. Please wait...\n")
|
|
192
|
+
|
|
193
|
+
results = []
|
|
194
|
+
for i, stock in enumerate(stocks, 1):
|
|
195
|
+
symbol = stock.get('symbol', '')
|
|
196
|
+
company_name = stock.get('companyName', '')
|
|
197
|
+
market_cap = stock.get('marketCap', 0)
|
|
198
|
+
|
|
199
|
+
if i % 10 == 0:
|
|
200
|
+
print(f"Progress: {i}/{len(stocks)} stocks analyzed...")
|
|
201
|
+
|
|
202
|
+
# Rate limiting: max 5 requests per second
|
|
203
|
+
time.sleep(0.2)
|
|
204
|
+
|
|
205
|
+
metrics = self.calculate_ownership_metrics(symbol, company_name, market_cap)
|
|
206
|
+
|
|
207
|
+
if metrics:
|
|
208
|
+
# Apply filters
|
|
209
|
+
if abs(metrics['percent_change']) >= min_change_percent:
|
|
210
|
+
if metrics['current_institution_count'] >= min_institutions:
|
|
211
|
+
results.append(metrics)
|
|
212
|
+
|
|
213
|
+
print(f"\nFound {len(results)} stocks meeting criteria")
|
|
214
|
+
|
|
215
|
+
# Sort results
|
|
216
|
+
if sort_by == 'ownership_change':
|
|
217
|
+
results.sort(key=lambda x: abs(x['percent_change']), reverse=True)
|
|
218
|
+
elif sort_by == 'institution_count_change':
|
|
219
|
+
results.sort(key=lambda x: abs(x['institution_count_change']), reverse=True)
|
|
220
|
+
elif sort_by == 'dollar_value_change':
|
|
221
|
+
results.sort(key=lambda x: abs(x['value_change']), reverse=True)
|
|
222
|
+
|
|
223
|
+
return results[:top]
|
|
224
|
+
|
|
225
|
+
def generate_report(self, results: List[Dict], output_file: str = None):
|
|
226
|
+
"""Generate markdown report from screening results"""
|
|
227
|
+
|
|
228
|
+
if not results:
|
|
229
|
+
print("No results to report")
|
|
230
|
+
return
|
|
231
|
+
|
|
232
|
+
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
233
|
+
|
|
234
|
+
report = f"""# Institutional Flow Analysis Report
|
|
235
|
+
**Generated:** {timestamp}
|
|
236
|
+
**Stocks Analyzed:** {len(results)}
|
|
237
|
+
|
|
238
|
+
## Summary
|
|
239
|
+
|
|
240
|
+
This report identifies stocks with significant institutional ownership changes based on 13F filings data.
|
|
241
|
+
|
|
242
|
+
### Key Findings
|
|
243
|
+
|
|
244
|
+
**Top Accumulators (Institutions Buying):**
|
|
245
|
+
"""
|
|
246
|
+
|
|
247
|
+
# Top accumulators
|
|
248
|
+
accumulators = [r for r in results if r['percent_change'] > 0][:10]
|
|
249
|
+
if accumulators:
|
|
250
|
+
report += "\n| Symbol | Company | Ownership Change | Institution Change | Top Holder |\n"
|
|
251
|
+
report += "|--------|---------|-----------------|-------------------|------------|\n"
|
|
252
|
+
for r in accumulators:
|
|
253
|
+
top_holder = r['top_holders'][0]['name'] if r['top_holders'] else 'N/A'
|
|
254
|
+
report += f"| {r['symbol']} | {r['company_name'][:30]} | **+{r['percent_change']}%** | +{r['institution_count_change']} | {top_holder[:30]} |\n"
|
|
255
|
+
else:
|
|
256
|
+
report += "\nNo significant accumulation detected.\n"
|
|
257
|
+
|
|
258
|
+
report += "\n**Top Distributors (Institutions Selling):**\n"
|
|
259
|
+
|
|
260
|
+
# Top distributors
|
|
261
|
+
distributors = [r for r in results if r['percent_change'] < 0][:10]
|
|
262
|
+
if distributors:
|
|
263
|
+
report += "\n| Symbol | Company | Ownership Change | Institution Change | Previously Top Holder |\n"
|
|
264
|
+
report += "|--------|---------|-----------------|-------------------|-----------------------|\n"
|
|
265
|
+
for r in distributors:
|
|
266
|
+
top_holder = r['top_holders'][0]['name'] if r['top_holders'] else 'N/A'
|
|
267
|
+
report += f"| {r['symbol']} | {r['company_name'][:30]} | **{r['percent_change']}%** | {r['institution_count_change']} | {top_holder[:30]} |\n"
|
|
268
|
+
else:
|
|
269
|
+
report += "\nNo significant distribution detected.\n"
|
|
270
|
+
|
|
271
|
+
report += "\n## Detailed Results\n\n"
|
|
272
|
+
|
|
273
|
+
for r in results[:20]: # Top 20 detailed
|
|
274
|
+
direction = "Accumulation" if r['percent_change'] > 0 else "Distribution"
|
|
275
|
+
report += f"""### {r['symbol']} - {r['company_name']}
|
|
276
|
+
|
|
277
|
+
**Signal:** {direction} ({r['percent_change']:+.2f}% institutional ownership change)
|
|
278
|
+
|
|
279
|
+
**Metrics:**
|
|
280
|
+
- Market Cap: ${r['market_cap']:,.0f}
|
|
281
|
+
- Current Quarter: {r['current_quarter']}
|
|
282
|
+
- Previous Quarter: {r['previous_quarter']}
|
|
283
|
+
- Institution Count Change: {r['institution_count_change']:+d} ({r['previous_institution_count']} → {r['current_institution_count']})
|
|
284
|
+
- Total Shares Change: {r['shares_change']:+,.0f}
|
|
285
|
+
- Estimated Value Change: ${r['value_change']:+,.0f}
|
|
286
|
+
|
|
287
|
+
**Top 5 Current Holders:**
|
|
288
|
+
"""
|
|
289
|
+
for i, holder in enumerate(r['top_holders'][:5], 1):
|
|
290
|
+
report += f"{i}. {holder['name']}: {holder['shares']:,} shares (Change: {holder['change']:+,})\n"
|
|
291
|
+
|
|
292
|
+
report += "\n---\n\n"
|
|
293
|
+
|
|
294
|
+
report += f"""
|
|
295
|
+
## Interpretation Guide
|
|
296
|
+
|
|
297
|
+
**Strong Accumulation (>15% increase):**
|
|
298
|
+
- Monitor for potential breakout
|
|
299
|
+
- Validate with fundamental analysis
|
|
300
|
+
- Consider initiating/adding to position
|
|
301
|
+
|
|
302
|
+
**Moderate Accumulation (7-15% increase):**
|
|
303
|
+
- Positive signal
|
|
304
|
+
- Combine with other analysis
|
|
305
|
+
- Watch for continuation
|
|
306
|
+
|
|
307
|
+
**Strong Distribution (>15% decrease):**
|
|
308
|
+
- Warning sign
|
|
309
|
+
- Re-evaluate thesis
|
|
310
|
+
- Consider trimming/exiting
|
|
311
|
+
|
|
312
|
+
**Moderate Distribution (7-15% decrease):**
|
|
313
|
+
- Early warning
|
|
314
|
+
- Monitor closely
|
|
315
|
+
- Tighten stop-loss
|
|
316
|
+
|
|
317
|
+
For detailed interpretation framework, see:
|
|
318
|
+
`institutional-flow-tracker/references/interpretation_framework.md`
|
|
319
|
+
|
|
320
|
+
---
|
|
321
|
+
|
|
322
|
+
**Data Source:** Financial Modeling Prep API (13F Filings)
|
|
323
|
+
**Note:** 13F data has ~45-day reporting lag. Use as confirming indicator, not real-time signal.
|
|
324
|
+
"""
|
|
325
|
+
|
|
326
|
+
# Save to file
|
|
327
|
+
if output_file:
|
|
328
|
+
output_path = output_file if output_file.endswith('.md') else f"{output_file}.md"
|
|
329
|
+
with open(output_path, 'w') as f:
|
|
330
|
+
f.write(report)
|
|
331
|
+
print(f"\nReport saved to: {output_path}")
|
|
332
|
+
else:
|
|
333
|
+
output_path = f"institutional_flow_screening_{datetime.now().strftime('%Y%m%d')}.md"
|
|
334
|
+
with open(output_path, 'w') as f:
|
|
335
|
+
f.write(report)
|
|
336
|
+
print(f"\nReport saved to: {output_path}")
|
|
337
|
+
|
|
338
|
+
return report
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
def main():
|
|
342
|
+
parser = argparse.ArgumentParser(
|
|
343
|
+
description='Track institutional ownership changes across stocks',
|
|
344
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
345
|
+
epilog="""
|
|
346
|
+
Examples:
|
|
347
|
+
# Screen top 50 stocks by institutional change (>10%)
|
|
348
|
+
python3 track_institutional_flow.py --top 50 --min-change-percent 10
|
|
349
|
+
|
|
350
|
+
# Focus on Technology sector
|
|
351
|
+
python3 track_institutional_flow.py --sector Technology --min-institutions 20
|
|
352
|
+
|
|
353
|
+
# Custom screening with output
|
|
354
|
+
python3 track_institutional_flow.py --min-market-cap 2000000000 --top 100 --output results.json
|
|
355
|
+
"""
|
|
356
|
+
)
|
|
357
|
+
|
|
358
|
+
parser.add_argument(
|
|
359
|
+
'--api-key',
|
|
360
|
+
type=str,
|
|
361
|
+
default=os.getenv('FMP_API_KEY'),
|
|
362
|
+
help='FMP API key (or set FMP_API_KEY environment variable)'
|
|
363
|
+
)
|
|
364
|
+
parser.add_argument(
|
|
365
|
+
'--top',
|
|
366
|
+
type=int,
|
|
367
|
+
default=50,
|
|
368
|
+
help='Number of top stocks to return (default: 50)'
|
|
369
|
+
)
|
|
370
|
+
parser.add_argument(
|
|
371
|
+
'--min-change-percent',
|
|
372
|
+
type=float,
|
|
373
|
+
default=10.0,
|
|
374
|
+
help='Minimum %% change in institutional ownership (default: 10.0)'
|
|
375
|
+
)
|
|
376
|
+
parser.add_argument(
|
|
377
|
+
'--min-market-cap',
|
|
378
|
+
type=int,
|
|
379
|
+
default=1000000000,
|
|
380
|
+
help='Minimum market cap in dollars (default: 1B)'
|
|
381
|
+
)
|
|
382
|
+
parser.add_argument(
|
|
383
|
+
'--sector',
|
|
384
|
+
type=str,
|
|
385
|
+
help='Filter by specific sector (e.g., Technology, Healthcare)'
|
|
386
|
+
)
|
|
387
|
+
parser.add_argument(
|
|
388
|
+
'--min-institutions',
|
|
389
|
+
type=int,
|
|
390
|
+
default=10,
|
|
391
|
+
help='Minimum number of institutional holders (default: 10)'
|
|
392
|
+
)
|
|
393
|
+
parser.add_argument(
|
|
394
|
+
'--sort-by',
|
|
395
|
+
type=str,
|
|
396
|
+
choices=['ownership_change', 'institution_count_change', 'dollar_value_change'],
|
|
397
|
+
default='ownership_change',
|
|
398
|
+
help='Sort results by metric (default: ownership_change)'
|
|
399
|
+
)
|
|
400
|
+
parser.add_argument(
|
|
401
|
+
'--output',
|
|
402
|
+
type=str,
|
|
403
|
+
help='Output file path for JSON results'
|
|
404
|
+
)
|
|
405
|
+
|
|
406
|
+
args = parser.parse_args()
|
|
407
|
+
|
|
408
|
+
# Validate API key
|
|
409
|
+
if not args.api_key:
|
|
410
|
+
print("Error: FMP API key required")
|
|
411
|
+
print("Set FMP_API_KEY environment variable or pass --api-key argument")
|
|
412
|
+
print("Get free API key at: https://financialmodelingprep.com/developer/docs")
|
|
413
|
+
sys.exit(1)
|
|
414
|
+
|
|
415
|
+
# Initialize tracker
|
|
416
|
+
tracker = InstitutionalFlowTracker(args.api_key)
|
|
417
|
+
|
|
418
|
+
# Run screening
|
|
419
|
+
results = tracker.screen_stocks(
|
|
420
|
+
min_market_cap=args.min_market_cap,
|
|
421
|
+
min_change_percent=args.min_change_percent,
|
|
422
|
+
min_institutions=args.min_institutions,
|
|
423
|
+
sector=args.sector,
|
|
424
|
+
top=args.top,
|
|
425
|
+
sort_by=args.sort_by
|
|
426
|
+
)
|
|
427
|
+
|
|
428
|
+
# Save JSON results if requested
|
|
429
|
+
if args.output:
|
|
430
|
+
json_output = args.output if args.output.endswith('.json') else f"{args.output}.json"
|
|
431
|
+
with open(json_output, 'w') as f:
|
|
432
|
+
json.dump(results, f, indent=2)
|
|
433
|
+
print(f"JSON results saved to: {json_output}")
|
|
434
|
+
|
|
435
|
+
# Generate markdown report
|
|
436
|
+
tracker.generate_report(results)
|
|
437
|
+
|
|
438
|
+
# Print summary
|
|
439
|
+
if results:
|
|
440
|
+
print("\n" + "="*80)
|
|
441
|
+
print("TOP 10 INSTITUTIONAL FLOW CHANGES")
|
|
442
|
+
print("="*80)
|
|
443
|
+
print(f"{'Symbol':<8} {'Company':<30} {'Change':>10} {'Institutions':>12}")
|
|
444
|
+
print("-"*80)
|
|
445
|
+
for r in results[:10]:
|
|
446
|
+
print(f"{r['symbol']:<8} {r['company_name'][:30]:<30} {r['percent_change']:>9.2f}% {r['institution_count_change']:>+11d}")
|
|
447
|
+
|
|
448
|
+
|
|
449
|
+
if __name__ == '__main__':
|
|
450
|
+
main()
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: macro-regime-detector
|
|
3
|
+
description: Detect structural macro regime transitions (1-2 year horizon) using cross-asset ratio analysis. Analyze RSP/SPY concentration, yield curve, credit conditions, size factor, equity-bond relationship, and sector rotation to identify regime shifts between Concentration, Broadening, Contraction, Inflationary, and Transitional states. Run when user asks about macro regime, market regime change, structural rotation, or long-term market positioning.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Macro Regime Detector
|
|
7
|
+
|
|
8
|
+
Detect structural macro regime transitions using monthly-frequency cross-asset ratio analysis. This skill identifies 1-2 year regime shifts that inform strategic portfolio positioning.
|
|
9
|
+
|
|
10
|
+
## When to Use
|
|
11
|
+
|
|
12
|
+
- User asks about current macro regime or regime transitions
|
|
13
|
+
- User wants to understand structural market rotations (concentration vs broadening)
|
|
14
|
+
- User asks about long-term positioning based on yield curve, credit, or cross-asset signals
|
|
15
|
+
- User references RSP/SPY ratio, IWM/SPY, HYG/LQD, or other cross-asset ratios
|
|
16
|
+
- User wants to assess whether a regime change is underway
|
|
17
|
+
|
|
18
|
+
## Workflow
|
|
19
|
+
|
|
20
|
+
1. Load reference documents for methodology context:
|
|
21
|
+
- `references/regime_detection_methodology.md`
|
|
22
|
+
- `references/indicator_interpretation_guide.md`
|
|
23
|
+
|
|
24
|
+
2. Execute the main analysis script:
|
|
25
|
+
```bash
|
|
26
|
+
python3 skills/macro-regime-detector/scripts/macro_regime_detector.py
|
|
27
|
+
```
|
|
28
|
+
This fetches 600 days of data for 9 ETFs + Treasury rates (10 API calls total).
|
|
29
|
+
|
|
30
|
+
3. Read the generated Markdown report and present findings to user.
|
|
31
|
+
|
|
32
|
+
4. Provide additional context using `references/historical_regimes.md` when user asks about historical parallels.
|
|
33
|
+
|
|
34
|
+
## Prerequisites
|
|
35
|
+
|
|
36
|
+
- **FMP API Key** (required): Set `FMP_API_KEY` environment variable or pass `--api-key`
|
|
37
|
+
- Free tier (250 calls/day) is sufficient (script uses ~10 calls)
|
|
38
|
+
|
|
39
|
+
## 6 Components
|
|
40
|
+
|
|
41
|
+
| # | Component | Ratio/Data | Weight | What It Detects |
|
|
42
|
+
|---|-----------|------------|--------|-----------------|
|
|
43
|
+
| 1 | Market Concentration | RSP/SPY | 25% | Mega-cap concentration vs market broadening |
|
|
44
|
+
| 2 | Yield Curve | 10Y-2Y spread | 20% | Interest rate cycle transitions |
|
|
45
|
+
| 3 | Credit Conditions | HYG/LQD | 15% | Credit cycle risk appetite |
|
|
46
|
+
| 4 | Size Factor | IWM/SPY | 15% | Small vs large cap rotation |
|
|
47
|
+
| 5 | Equity-Bond | SPY/TLT + correlation | 15% | Stock-bond relationship regime |
|
|
48
|
+
| 6 | Sector Rotation | XLY/XLP | 10% | Cyclical vs defensive appetite |
|
|
49
|
+
|
|
50
|
+
## 5 Regime Classifications
|
|
51
|
+
|
|
52
|
+
- **Concentration**: Mega-cap leadership, narrow market
|
|
53
|
+
- **Broadening**: Expanding participation, small-cap/value rotation
|
|
54
|
+
- **Contraction**: Credit tightening, defensive rotation, risk-off
|
|
55
|
+
- **Inflationary**: Positive stock-bond correlation, traditional hedging fails
|
|
56
|
+
- **Transitional**: Multiple signals but unclear pattern
|
|
57
|
+
|
|
58
|
+
## Output
|
|
59
|
+
|
|
60
|
+
- `macro_regime_YYYY-MM-DD_HHMMSS.json` — Structured data for programmatic use
|
|
61
|
+
- `macro_regime_YYYY-MM-DD_HHMMSS.md` — Human-readable report with:
|
|
62
|
+
1. Current Regime Assessment
|
|
63
|
+
2. Transition Signal Dashboard
|
|
64
|
+
3. Component Details
|
|
65
|
+
4. Regime Classification Evidence
|
|
66
|
+
5. Portfolio Posture Recommendations
|
|
67
|
+
|
|
68
|
+
## Relationship to Other Skills
|
|
69
|
+
|
|
70
|
+
| Aspect | Macro Regime Detector | Market Top Detector | Market Breadth Analyzer |
|
|
71
|
+
|--------|----------------------|--------------------|-----------------------|
|
|
72
|
+
| Time Horizon | 1-2 years (structural) | 2-8 weeks (tactical) | Current snapshot |
|
|
73
|
+
| Data Granularity | Monthly (6M/12M SMA) | Daily (25 business days) | Daily CSV |
|
|
74
|
+
| Detection Target | Regime transitions | 10-20% corrections | Breadth health score |
|
|
75
|
+
| API Calls | ~10 | ~33 | 0 (Free CSV) |
|
|
76
|
+
|
|
77
|
+
## Script Arguments
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
python3 macro_regime_detector.py [options]
|
|
81
|
+
|
|
82
|
+
Options:
|
|
83
|
+
--api-key KEY FMP API key (default: $FMP_API_KEY)
|
|
84
|
+
--output-dir DIR Output directory (default: current directory)
|
|
85
|
+
--days N Days of history to fetch (default: 600)
|
|
86
|
+
```
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# Historical Regime Examples
|
|
2
|
+
|
|
3
|
+
Reference cases for the 5 regime classifications. Use these to contextualize current readings and identify historical parallels.
|
|
4
|
+
|
|
5
|
+
## Concentration Regimes
|
|
6
|
+
|
|
7
|
+
### 2023-2024: Magnificent Seven Dominance
|
|
8
|
+
|
|
9
|
+
- **RSP/SPY**: Declined from ~0.32 to ~0.29, a multi-year low
|
|
10
|
+
- **IWM/SPY**: Persistent underperformance of small-caps
|
|
11
|
+
- **Credit**: Stable to easing (HYG/LQD steady)
|
|
12
|
+
- **Characteristics**: Top 7 stocks drove ~60% of S&P 500 returns
|
|
13
|
+
- **Duration**: ~18 months
|
|
14
|
+
- **Resolution**: Early signs of broadening in late 2024 (RSP/SPY bottoming)
|
|
15
|
+
- **Portfolio posture**: Mega-cap growth overweight was the only winning strategy
|
|
16
|
+
|
|
17
|
+
### 2019-2020 (Pre-COVID): FAANG+ Concentration
|
|
18
|
+
|
|
19
|
+
- **RSP/SPY**: Gradual decline through 2019
|
|
20
|
+
- **IWM/SPY**: Small-cap underperformance
|
|
21
|
+
- **Ended**: Abruptly with COVID crash (exogenous shock)
|
|
22
|
+
|
|
23
|
+
## Broadening Regimes
|
|
24
|
+
|
|
25
|
+
### 2003-2004: Post-Dot-Com Recovery
|
|
26
|
+
|
|
27
|
+
- **RSP/SPY**: Rose significantly as value and small-caps recovered
|
|
28
|
+
- **IWM/SPY**: Strong small-cap outperformance
|
|
29
|
+
- **Credit**: HYG/LQD rising as credit conditions eased
|
|
30
|
+
- **Yield curve**: Steep (accommodative Fed)
|
|
31
|
+
- **Duration**: ~24 months
|
|
32
|
+
- **Portfolio posture**: Small-cap value, equal-weight strategies outperformed
|
|
33
|
+
|
|
34
|
+
### 2016-2017: Post-Election Broadening
|
|
35
|
+
|
|
36
|
+
- **RSP/SPY**: Rose as cyclicals and financials rallied
|
|
37
|
+
- **IWM/SPY**: Small-cap surge post-election
|
|
38
|
+
- **Credit**: Stable to improving
|
|
39
|
+
- **XLY/XLP**: Strong cyclical outperformance
|
|
40
|
+
- **Duration**: ~12 months
|
|
41
|
+
- **Portfolio posture**: Cyclicals, financials, small-cap growth
|
|
42
|
+
|
|
43
|
+
## Contraction Regimes
|
|
44
|
+
|
|
45
|
+
### 2007-2009: Global Financial Crisis
|
|
46
|
+
|
|
47
|
+
- **Credit**: HYG/LQD collapsed (credit freeze)
|
|
48
|
+
- **XLY/XLP**: Extreme defensive rotation
|
|
49
|
+
- **SPY/TLT**: Sharp decline as bonds rallied
|
|
50
|
+
- **Yield curve**: Initially inverted, then steepened dramatically
|
|
51
|
+
- **Duration**: ~18 months (bear phase)
|
|
52
|
+
- **Portfolio posture**: Cash, Treasuries, defensive sectors
|
|
53
|
+
|
|
54
|
+
### 2020 Q1: COVID Crash
|
|
55
|
+
|
|
56
|
+
- **Credit**: HYG/LQD dropped sharply in March
|
|
57
|
+
- **XLY/XLP**: Rapid defensive rotation
|
|
58
|
+
- **SPY/TLT**: Crashed as equities sold off
|
|
59
|
+
- **Duration**: ~6 weeks (shortest contraction on record)
|
|
60
|
+
- **Resolution**: Massive fiscal/monetary response triggered V-shaped recovery
|
|
61
|
+
- **Lesson**: Not all contractions are prolonged; policy response matters
|
|
62
|
+
|
|
63
|
+
## Inflationary Regimes
|
|
64
|
+
|
|
65
|
+
### 2022: Inflation Shock
|
|
66
|
+
|
|
67
|
+
- **Stock-bond correlation**: Turned positive (both fell together)
|
|
68
|
+
- **SPY/TLT**: Both declined simultaneously
|
|
69
|
+
- **10Y-2Y**: Deep inversion (most inverted since 1980s)
|
|
70
|
+
- **Yield curve**: Aggressive flattening then inversion
|
|
71
|
+
- **Duration**: ~12 months
|
|
72
|
+
- **Portfolio posture**: Energy, commodities, real assets, short-duration bonds
|
|
73
|
+
- **Key characteristic**: Traditional 60/40 portfolio failed as bonds didn't hedge
|
|
74
|
+
|
|
75
|
+
### 1970s Stagflation (Historical Reference)
|
|
76
|
+
|
|
77
|
+
- **Stock-bond correlation**: Persistently positive
|
|
78
|
+
- **Commodities**: Outperformed financial assets
|
|
79
|
+
- **Duration**: Extended (years)
|
|
80
|
+
- **Modern parallel**: 2022 showed echoes but resolved faster
|
|
81
|
+
|
|
82
|
+
## Transitional Regimes
|
|
83
|
+
|
|
84
|
+
### 2024 Q4 - 2025 Q1: Current Example
|
|
85
|
+
|
|
86
|
+
- **RSP/SPY**: Near historical lows (~0.297) but showing early bottoming signs
|
|
87
|
+
- **IWM/SPY**: Mixed signals, brief outperformance then reversal
|
|
88
|
+
- **Credit**: Stable (HYG/LQD holding)
|
|
89
|
+
- **Yield curve**: Normalizing from inversion
|
|
90
|
+
- **XLY/XLP**: Choppy, no clear direction
|
|
91
|
+
- **Interpretation**: Multiple indicators shifting but no clear new regime yet
|
|
92
|
+
- **Portfolio posture**: Maintain diversification, gradual position adjustments
|
|
93
|
+
|
|
94
|
+
### 2018: Failed Broadening
|
|
95
|
+
|
|
96
|
+
- **RSP/SPY**: Brief broadening attempt in early 2018
|
|
97
|
+
- **Credit**: Tightened in Q4 2018 (HYG selloff)
|
|
98
|
+
- **Resolution**: Fed pivot in early 2019 prevented full contraction
|
|
99
|
+
- **Lesson**: Transitional periods can resolve in any direction
|
|
100
|
+
|
|
101
|
+
## Regime Transition Patterns
|
|
102
|
+
|
|
103
|
+
### Common Sequences
|
|
104
|
+
|
|
105
|
+
1. **Concentration → Broadening**: Usually requires catalyst (Fed easing, fiscal stimulus, valuation compression in leaders)
|
|
106
|
+
|
|
107
|
+
2. **Broadening → Contraction**: Credit tightening is the typical trigger. Watch HYG/LQD for early warning.
|
|
108
|
+
|
|
109
|
+
3. **Contraction → Broadening**: Policy response (rate cuts, QE) → credit easing → small-cap recovery
|
|
110
|
+
|
|
111
|
+
4. **Any → Inflationary**: Positive stock-bond correlation is the key signal. Can emerge from either broadening or contraction.
|
|
112
|
+
|
|
113
|
+
### Transition Timing
|
|
114
|
+
|
|
115
|
+
- Average regime duration: 12-24 months
|
|
116
|
+
- Transition phase: Typically 3-6 months of ambiguous signals
|
|
117
|
+
- Early signals appear 2-4 months before consensus recognition
|
|
118
|
+
- MA crossovers (6M vs 12M) confirm after the fact but provide low false-positive rate
|
|
119
|
+
|
|
120
|
+
### False Signals
|
|
121
|
+
|
|
122
|
+
- 2018 Q1: Broadening signal reversed by Q4 (trade war + Fed tightening)
|
|
123
|
+
- 2015: Multiple signals of contraction that never fully materialized
|
|
124
|
+
- Lesson: Require 3+ months of sustained signals before high-conviction repositioning
|