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,267 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Economic Calendar Fetcher using FMP API
|
|
4
|
+
Retrieves economic events and data releases for specified date range
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import sys
|
|
9
|
+
import json
|
|
10
|
+
import argparse
|
|
11
|
+
from datetime import datetime, timedelta
|
|
12
|
+
from typing import Dict, List, Optional
|
|
13
|
+
import urllib.request
|
|
14
|
+
import urllib.error
|
|
15
|
+
import urllib.parse
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def get_api_key() -> Optional[str]:
|
|
19
|
+
"""
|
|
20
|
+
Get FMP API key from environment variable.
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
API key string or None if not found
|
|
24
|
+
"""
|
|
25
|
+
api_key = os.environ.get('FMP_API_KEY')
|
|
26
|
+
if not api_key:
|
|
27
|
+
print("Warning: FMP_API_KEY environment variable not set", file=sys.stderr)
|
|
28
|
+
return api_key
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def fetch_economic_calendar(
|
|
32
|
+
from_date: str,
|
|
33
|
+
to_date: str,
|
|
34
|
+
api_key: str
|
|
35
|
+
) -> List[Dict]:
|
|
36
|
+
"""
|
|
37
|
+
Fetch economic calendar data from FMP API.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
from_date: Start date in YYYY-MM-DD format
|
|
41
|
+
to_date: End date in YYYY-MM-DD format
|
|
42
|
+
api_key: FMP API key
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
List of economic event dictionaries
|
|
46
|
+
|
|
47
|
+
Raises:
|
|
48
|
+
urllib.error.HTTPError: If API request fails
|
|
49
|
+
ValueError: If response is invalid
|
|
50
|
+
"""
|
|
51
|
+
base_url = "https://financialmodelingprep.com/api/v3/economic_calendar"
|
|
52
|
+
|
|
53
|
+
# Build query parameters
|
|
54
|
+
params = {
|
|
55
|
+
'from': from_date,
|
|
56
|
+
'to': to_date,
|
|
57
|
+
'apikey': api_key
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
# Construct URL with parameters
|
|
61
|
+
url = f"{base_url}?{urllib.parse.urlencode(params)}"
|
|
62
|
+
|
|
63
|
+
try:
|
|
64
|
+
# Make API request
|
|
65
|
+
with urllib.request.urlopen(url) as response:
|
|
66
|
+
if response.status != 200:
|
|
67
|
+
raise ValueError(f"API returned status code {response.status}")
|
|
68
|
+
|
|
69
|
+
data = json.loads(response.read().decode('utf-8'))
|
|
70
|
+
|
|
71
|
+
if not isinstance(data, list):
|
|
72
|
+
raise ValueError(f"Unexpected API response format: {type(data)}")
|
|
73
|
+
|
|
74
|
+
return data
|
|
75
|
+
|
|
76
|
+
except urllib.error.HTTPError as e:
|
|
77
|
+
error_body = e.read().decode('utf-8') if e.fp else 'No error details'
|
|
78
|
+
raise urllib.error.HTTPError(
|
|
79
|
+
e.url, e.code, f"FMP API error: {e.reason}. Details: {error_body}",
|
|
80
|
+
e.hdrs, e.fp
|
|
81
|
+
)
|
|
82
|
+
except urllib.error.URLError as e:
|
|
83
|
+
raise ValueError(f"Network error: {e.reason}")
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def validate_date_range(from_date: str, to_date: str) -> None:
|
|
87
|
+
"""
|
|
88
|
+
Validate date range is within FMP API limits (max 90 days).
|
|
89
|
+
|
|
90
|
+
Args:
|
|
91
|
+
from_date: Start date in YYYY-MM-DD format
|
|
92
|
+
to_date: End date in YYYY-MM-DD format
|
|
93
|
+
|
|
94
|
+
Raises:
|
|
95
|
+
ValueError: If date range is invalid or exceeds 90 days
|
|
96
|
+
"""
|
|
97
|
+
try:
|
|
98
|
+
start = datetime.strptime(from_date, '%Y-%m-%d')
|
|
99
|
+
end = datetime.strptime(to_date, '%Y-%m-%d')
|
|
100
|
+
except ValueError as e:
|
|
101
|
+
raise ValueError(f"Invalid date format. Use YYYY-MM-DD: {e}")
|
|
102
|
+
|
|
103
|
+
if start > end:
|
|
104
|
+
raise ValueError(f"Start date {from_date} is after end date {to_date}")
|
|
105
|
+
|
|
106
|
+
delta = (end - start).days
|
|
107
|
+
if delta > 90:
|
|
108
|
+
raise ValueError(f"Date range ({delta} days) exceeds maximum of 90 days")
|
|
109
|
+
|
|
110
|
+
# Warn if querying past dates
|
|
111
|
+
today = datetime.now().date()
|
|
112
|
+
if end.date() < today:
|
|
113
|
+
print(f"Warning: End date {to_date} is in the past", file=sys.stderr)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def format_event_output(events: List[Dict], output_format: str = 'json') -> str:
|
|
117
|
+
"""
|
|
118
|
+
Format economic events for output.
|
|
119
|
+
|
|
120
|
+
Args:
|
|
121
|
+
events: List of event dictionaries from FMP API
|
|
122
|
+
output_format: Output format ('json' or 'text')
|
|
123
|
+
|
|
124
|
+
Returns:
|
|
125
|
+
Formatted string
|
|
126
|
+
"""
|
|
127
|
+
if output_format == 'json':
|
|
128
|
+
return json.dumps(events, indent=2, ensure_ascii=False)
|
|
129
|
+
|
|
130
|
+
elif output_format == 'text':
|
|
131
|
+
lines = []
|
|
132
|
+
lines.append(f"Economic Calendar Events (Total: {len(events)})")
|
|
133
|
+
lines.append("=" * 80)
|
|
134
|
+
|
|
135
|
+
for event in events:
|
|
136
|
+
lines.append(f"\nDate: {event.get('date', 'N/A')}")
|
|
137
|
+
lines.append(f"Country: {event.get('country', 'N/A')}")
|
|
138
|
+
lines.append(f"Event: {event.get('event', 'N/A')}")
|
|
139
|
+
lines.append(f"Currency: {event.get('currency', 'N/A')}")
|
|
140
|
+
lines.append(f"Impact: {event.get('impact', 'N/A')}")
|
|
141
|
+
|
|
142
|
+
previous = event.get('previous')
|
|
143
|
+
estimate = event.get('estimate')
|
|
144
|
+
actual = event.get('actual')
|
|
145
|
+
|
|
146
|
+
if previous is not None:
|
|
147
|
+
lines.append(f"Previous: {previous}")
|
|
148
|
+
if estimate is not None:
|
|
149
|
+
lines.append(f"Estimate: {estimate}")
|
|
150
|
+
if actual is not None:
|
|
151
|
+
lines.append(f"Actual: {actual}")
|
|
152
|
+
|
|
153
|
+
change = event.get('change')
|
|
154
|
+
change_pct = event.get('changePercentage')
|
|
155
|
+
if change is not None:
|
|
156
|
+
lines.append(f"Change: {change}")
|
|
157
|
+
if change_pct is not None:
|
|
158
|
+
lines.append(f"Change %: {change_pct}%")
|
|
159
|
+
|
|
160
|
+
lines.append("-" * 80)
|
|
161
|
+
|
|
162
|
+
return "\n".join(lines)
|
|
163
|
+
|
|
164
|
+
else:
|
|
165
|
+
raise ValueError(f"Unknown output format: {output_format}")
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def main():
|
|
169
|
+
"""Main execution function."""
|
|
170
|
+
parser = argparse.ArgumentParser(
|
|
171
|
+
description='Fetch economic calendar events from FMP API',
|
|
172
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
173
|
+
epilog="""
|
|
174
|
+
Examples:
|
|
175
|
+
# Fetch events for next 7 days (default)
|
|
176
|
+
python get_economic_calendar.py
|
|
177
|
+
|
|
178
|
+
# Fetch events for specific date range
|
|
179
|
+
python get_economic_calendar.py --from 2025-01-01 --to 2025-01-31
|
|
180
|
+
|
|
181
|
+
# Provide API key via argument (overrides environment variable)
|
|
182
|
+
python get_economic_calendar.py --api-key YOUR_KEY_HERE
|
|
183
|
+
|
|
184
|
+
# Output as formatted text instead of JSON
|
|
185
|
+
python get_economic_calendar.py --format text
|
|
186
|
+
|
|
187
|
+
# Save output to file
|
|
188
|
+
python get_economic_calendar.py --output calendar.json
|
|
189
|
+
"""
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
# Date range arguments
|
|
193
|
+
today = datetime.now().date()
|
|
194
|
+
default_from = today.strftime('%Y-%m-%d')
|
|
195
|
+
default_to = (today + timedelta(days=7)).strftime('%Y-%m-%d')
|
|
196
|
+
|
|
197
|
+
parser.add_argument(
|
|
198
|
+
'--from', dest='from_date',
|
|
199
|
+
default=default_from,
|
|
200
|
+
help=f'Start date in YYYY-MM-DD format (default: {default_from})'
|
|
201
|
+
)
|
|
202
|
+
parser.add_argument(
|
|
203
|
+
'--to', dest='to_date',
|
|
204
|
+
default=default_to,
|
|
205
|
+
help=f'End date in YYYY-MM-DD format (default: {default_to})'
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
# API key argument
|
|
209
|
+
parser.add_argument(
|
|
210
|
+
'--api-key', dest='api_key',
|
|
211
|
+
help='FMP API key (overrides FMP_API_KEY environment variable)'
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
# Output format
|
|
215
|
+
parser.add_argument(
|
|
216
|
+
'--format', choices=['json', 'text'],
|
|
217
|
+
default='json',
|
|
218
|
+
help='Output format (default: json)'
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
# Output file
|
|
222
|
+
parser.add_argument(
|
|
223
|
+
'--output', '-o',
|
|
224
|
+
help='Output file path (default: stdout)'
|
|
225
|
+
)
|
|
226
|
+
|
|
227
|
+
# Parse arguments
|
|
228
|
+
args = parser.parse_args()
|
|
229
|
+
|
|
230
|
+
# Get API key
|
|
231
|
+
api_key = args.api_key or get_api_key()
|
|
232
|
+
if not api_key:
|
|
233
|
+
print("Error: FMP API key is required. Set FMP_API_KEY environment variable or use --api-key",
|
|
234
|
+
file=sys.stderr)
|
|
235
|
+
sys.exit(1)
|
|
236
|
+
|
|
237
|
+
try:
|
|
238
|
+
# Validate date range
|
|
239
|
+
validate_date_range(args.from_date, args.to_date)
|
|
240
|
+
|
|
241
|
+
# Fetch events
|
|
242
|
+
print(f"Fetching economic calendar from {args.from_date} to {args.to_date}...",
|
|
243
|
+
file=sys.stderr)
|
|
244
|
+
events = fetch_economic_calendar(args.from_date, args.to_date, api_key)
|
|
245
|
+
|
|
246
|
+
print(f"Retrieved {len(events)} events", file=sys.stderr)
|
|
247
|
+
|
|
248
|
+
# Format output
|
|
249
|
+
output = format_event_output(events, args.format)
|
|
250
|
+
|
|
251
|
+
# Write output
|
|
252
|
+
if args.output:
|
|
253
|
+
with open(args.output, 'w', encoding='utf-8') as f:
|
|
254
|
+
f.write(output)
|
|
255
|
+
print(f"Output written to {args.output}", file=sys.stderr)
|
|
256
|
+
else:
|
|
257
|
+
print(output)
|
|
258
|
+
|
|
259
|
+
sys.exit(0)
|
|
260
|
+
|
|
261
|
+
except Exception as e:
|
|
262
|
+
print(f"Error: {e}", file=sys.stderr)
|
|
263
|
+
sys.exit(1)
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
if __name__ == '__main__':
|
|
267
|
+
main()
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ftd-detector
|
|
3
|
+
description: 检测Follow-Through Day(FTD)信号以确认市场底部,采用William O'Neil的方法论。双指数跟踪(S&P 500 + NASDAQ),使用状态机进行反弹尝试、FTD确认和FTD后健康监控。当用户询问市场底部信号、Follow-Through Day、反弹尝试、调整后的重新入场时机,或是否可以安全增加股票仓位时使用。与market-top-detector(防御性)互补——本技能为进攻性(底部确认)。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# FTD检测器技能
|
|
7
|
+
|
|
8
|
+
## 目的
|
|
9
|
+
|
|
10
|
+
检测确认市场底部的Follow-Through Day(FTD)信号,采用William O'Neil经过验证的方法论。生成质量评分(0-100),并提供重新进入市场的仓位建议。
|
|
11
|
+
|
|
12
|
+
**与Market Top Detector互补:**
|
|
13
|
+
- Market Top Detector = 防御性(检测派发、轮动、恶化)
|
|
14
|
+
- FTD Detector = 进攻性(检测反弹尝试、底部确认)
|
|
15
|
+
|
|
16
|
+
## 何时使用本技能
|
|
17
|
+
|
|
18
|
+
**英文:**
|
|
19
|
+
- User asks "Is the market bottoming?" or "Is it safe to buy again?"
|
|
20
|
+
- User observes a market correction (3%+ decline) and wants re-entry timing
|
|
21
|
+
- User asks about Follow-Through Days or rally attempts
|
|
22
|
+
- User wants to assess if a recent bounce is sustainable
|
|
23
|
+
- User asks about increasing equity exposure after a correction
|
|
24
|
+
- Market Top Detector shows elevated risk and user wants bottom signals
|
|
25
|
+
|
|
26
|
+
**中文:**
|
|
27
|
+
- "市场见底了吗?""可以重新买入了吗?"
|
|
28
|
+
- 调整行情(3%以上的下跌)后的入场时机判断
|
|
29
|
+
- 关于Follow-Through Day或反弹尝试的问题
|
|
30
|
+
- 想要评估近期反弹是否可持续
|
|
31
|
+
- 调整后是否应增加仓位的判断
|
|
32
|
+
- Market Top Detector显示高风险后,确认底部信号
|
|
33
|
+
|
|
34
|
+
## 与Market Top Detector的区别
|
|
35
|
+
|
|
36
|
+
| 方面 | FTD Detector | Market Top Detector |
|
|
37
|
+
|------|-------------|-------------------|
|
|
38
|
+
| 关注点 | 底部确认(进攻性) | 顶部检测(防御性) |
|
|
39
|
+
| 触发条件 | 市场调整(3%+下跌) | 市场处于/接近高点 |
|
|
40
|
+
| 信号 | 反弹尝试 → FTD → 重新入场 | 派发 → 恶化 → 退出 |
|
|
41
|
+
| 评分 | 0-100 FTD质量 | 0-100 顶部概率 |
|
|
42
|
+
| 行动 | 何时增加仓位 | 何时减少仓位 |
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 执行工作流
|
|
47
|
+
|
|
48
|
+
### 第一阶段:执行Python脚本
|
|
49
|
+
|
|
50
|
+
运行FTD检测器脚本:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
python3 skills/ftd-detector/scripts/ftd_detector.py --api-key $FMP_API_KEY
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
脚本将执行以下操作:
|
|
57
|
+
1. 从FMP API获取S&P 500和QQQ的历史数据(60+个交易日)
|
|
58
|
+
2. 获取两个指数的当前报价
|
|
59
|
+
3. 运行双指数状态机(调整 → 反弹 → FTD检测)
|
|
60
|
+
4. 评估FTD后的健康状况(派发日、失效、强势趋势)
|
|
61
|
+
5. 计算质量评分(0-100)
|
|
62
|
+
6. 生成JSON和Markdown报告
|
|
63
|
+
|
|
64
|
+
**API预算:** 4次调用(完全在免费层250次/天的范围内)
|
|
65
|
+
|
|
66
|
+
### 第二阶段:展示结果
|
|
67
|
+
|
|
68
|
+
向用户展示生成的Markdown报告,重点说明:
|
|
69
|
+
- 当前市场状态(调整、反弹尝试、FTD已确认等)
|
|
70
|
+
- 质量评分和信号强度
|
|
71
|
+
- 建议的仓位水平
|
|
72
|
+
- 关键观察水平(摆动低点、FTD当日低点)
|
|
73
|
+
- FTD后的健康状况(派发日、强势趋势)
|
|
74
|
+
|
|
75
|
+
### 第三阶段:情境化指导
|
|
76
|
+
|
|
77
|
+
根据市场状态提供额外指导:
|
|
78
|
+
|
|
79
|
+
**如果FTD已确认(评分60+):**
|
|
80
|
+
- 建议关注处于正确形态的领涨股
|
|
81
|
+
- 参考CANSLIM筛选器寻找候选股票
|
|
82
|
+
- 提醒注意仓位大小和止损
|
|
83
|
+
|
|
84
|
+
**如果处于反弹尝试阶段(第1-3天):**
|
|
85
|
+
- 建议耐心等待,不要在FTD之前买入
|
|
86
|
+
- 建议构建观察列表
|
|
87
|
+
|
|
88
|
+
**如果没有调整:**
|
|
89
|
+
- FTD分析在上升趋势中不适用
|
|
90
|
+
- 转向Market Top Detector获取防御性信号
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 状态机
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
NO_SIGNAL → CORRECTION → RALLY_ATTEMPT → FTD_WINDOW → FTD_CONFIRMED
|
|
98
|
+
↑ ↓ ↓ ↓
|
|
99
|
+
└── RALLY_FAILED ←─────────────┘ FTD_INVALIDATED
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
| 状态 | 定义 |
|
|
103
|
+
|------|------|
|
|
104
|
+
| NO_SIGNAL | 上升趋势,无符合条件的调整 |
|
|
105
|
+
| CORRECTION | 3%+的下跌,伴随3+个下跌日 |
|
|
106
|
+
| RALLY_ATTEMPT | 从摆动低点开始的第1-3天反弹 |
|
|
107
|
+
| FTD_WINDOW | 第4-10天,等待符合条件的FTD |
|
|
108
|
+
| FTD_CONFIRMED | 检测到有效的FTD信号 |
|
|
109
|
+
| RALLY_FAILED | 反弹跌破摆动低点 |
|
|
110
|
+
| FTD_INVALIDATED | 收盘价低于FTD当日低点 |
|
|
111
|
+
|
|
112
|
+
## 质量评分(0-100)
|
|
113
|
+
|
|
114
|
+
| 评分 | 信号 | 仓位 |
|
|
115
|
+
|------|------|------|
|
|
116
|
+
| 80-100 | 强FTD | 75-100% |
|
|
117
|
+
| 60-79 | 中等FTD | 50-75% |
|
|
118
|
+
| 40-59 | 弱FTD | 25-50% |
|
|
119
|
+
| <40 | 无FTD / 失败 | 0-25% |
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## API要求
|
|
124
|
+
|
|
125
|
+
**必需:** FMP API密钥(免费层即可:每次执行4次调用)
|
|
126
|
+
|
|
127
|
+
## 输出文件
|
|
128
|
+
|
|
129
|
+
- JSON: `ftd_detector_YYYY-MM-DD_HHMMSS.json`
|
|
130
|
+
- Markdown: `ftd_detector_YYYY-MM-DD_HHMMSS.md`
|
|
131
|
+
|
|
132
|
+
## 参考文档
|
|
133
|
+
|
|
134
|
+
### `references/ftd_methodology.md`
|
|
135
|
+
- O'Neil的FTD规则详解
|
|
136
|
+
- 反弹尝试机制和天数计算
|
|
137
|
+
- 历史FTD案例(2020年3月、2022年10月)
|
|
138
|
+
|
|
139
|
+
### `references/post_ftd_guide.md`
|
|
140
|
+
- FTD后派发日失败率
|
|
141
|
+
- 强势趋势(Power Trend)的定义和条件
|
|
142
|
+
- 成功与失败模式对比
|
|
143
|
+
|
|
144
|
+
### 何时加载参考文档
|
|
145
|
+
- **首次使用:** 加载 `ftd_methodology.md` 以全面理解
|
|
146
|
+
- **FTD后的问题:** 加载 `post_ftd_guide.md`
|
|
147
|
+
- **常规执行:** 无需参考文档——脚本会处理分析
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
# Follow-Through Day (FTD) Methodology
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The Follow-Through Day (FTD) is William O'Neil's market timing signal for confirming a new uptrend after a correction. It is the **single most important signal** for re-entering the market after a decline. Without an FTD, no new bull market or sustained rally has ever begun (per IBD historical analysis).
|
|
6
|
+
|
|
7
|
+
**Key Insight:** FTD is a necessary but not sufficient condition. Historically, approximately 25% of FTDs lead to sustained uptrends. The remaining 75% fail, which is why quality scoring and post-FTD monitoring are critical.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Step 1: Identify the Correction
|
|
12
|
+
|
|
13
|
+
### Qualifying Correction
|
|
14
|
+
A correction must meet these criteria before FTD analysis begins:
|
|
15
|
+
|
|
16
|
+
- **Decline magnitude:** Index closes 3% or more below its recent high
|
|
17
|
+
- **Duration:** At least 3 down days during the decline
|
|
18
|
+
- **Index scope:** S&P 500 and/or NASDAQ Composite (either suffices)
|
|
19
|
+
|
|
20
|
+
### Swing Low Definition
|
|
21
|
+
The swing low is the lowest closing price during the correction that becomes the reference point for the rally attempt:
|
|
22
|
+
|
|
23
|
+
- Must be preceded by 3%+ decline from a recent high (within 40 trading days)
|
|
24
|
+
- Must have at least 3 down days between the high and the low
|
|
25
|
+
- Must be a local minimum (adjacent days have higher closes)
|
|
26
|
+
- Multiple swing lows can occur; use the most recent qualifying one
|
|
27
|
+
|
|
28
|
+
**Important:** The swing low is determined by *closing price*, not intraday low.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Step 2: Rally Attempt (Day 1-3)
|
|
33
|
+
|
|
34
|
+
### Day 1 Detection
|
|
35
|
+
Day 1 marks the beginning of a rally attempt. It occurs on the **first qualifying up day** after the swing low:
|
|
36
|
+
|
|
37
|
+
**Primary criterion:** Close > Previous day's close (up day)
|
|
38
|
+
|
|
39
|
+
**Alternative criterion:** Close in the top 50% of the day's price range
|
|
40
|
+
- Formula: (Close - Low) / (High - Low) >= 0.50
|
|
41
|
+
- This captures days where the market recovers significantly from intraday lows even if it doesn't close above the prior day's close
|
|
42
|
+
|
|
43
|
+
### Day 2-3 Integrity Check
|
|
44
|
+
For the rally attempt to remain valid through Day 2-3:
|
|
45
|
+
|
|
46
|
+
- **Close must not breach Day 1's intraday low** (not the close, the *low*)
|
|
47
|
+
- This is a strict rule; even a single day closing below Day 1's low invalidates the attempt
|
|
48
|
+
- Day 2 and Day 3 do NOT need to be up days; they just cannot close below Day 1's low
|
|
49
|
+
|
|
50
|
+
### Rally Invalidation (Reset)
|
|
51
|
+
The rally attempt resets completely if:
|
|
52
|
+
|
|
53
|
+
1. **Any day's close falls below the swing low price** → Start over from new potential swing low
|
|
54
|
+
2. **Day 2 or Day 3 closes below Day 1's intraday low** → Wait for new Day 1
|
|
55
|
+
|
|
56
|
+
When a rally resets, the new lower price may become the new swing low, and the cycle begins again.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Step 3: FTD Window (Day 4-10)
|
|
61
|
+
|
|
62
|
+
### FTD Qualification Criteria
|
|
63
|
+
A Follow-Through Day must satisfy ALL of these conditions:
|
|
64
|
+
|
|
65
|
+
1. **Day 4-10** of the rally attempt (Day 4-7 is the prime window; Day 8-10 still valid)
|
|
66
|
+
2. **Price gain >= 1.25%** (minimum threshold)
|
|
67
|
+
- 1.25-1.49%: Minimum qualifying gain
|
|
68
|
+
- 1.50-1.99%: Recommended gain (higher reliability)
|
|
69
|
+
- 2.00%+: Strong signal
|
|
70
|
+
3. **Volume > previous day's volume** (mandatory)
|
|
71
|
+
- This confirms institutional participation
|
|
72
|
+
- Volume does not need to exceed the 50-day average, though it's a positive if it does
|
|
73
|
+
|
|
74
|
+
### Day Counting Rules
|
|
75
|
+
- Day 1 = first qualifying up day after swing low
|
|
76
|
+
- Day 2, 3, etc. = every subsequent trading day (regardless of whether it's up or down)
|
|
77
|
+
- Days count continues as long as the rally is not invalidated
|
|
78
|
+
- The FTD itself must be an up day meeting the gain and volume requirements
|
|
79
|
+
|
|
80
|
+
### Prime vs Late Window
|
|
81
|
+
|
|
82
|
+
**Day 4-7 (Prime):**
|
|
83
|
+
- Historically higher success rate
|
|
84
|
+
- Base quality score: 60 points
|
|
85
|
+
- Institutional buyers are more likely to have conviction
|
|
86
|
+
|
|
87
|
+
**Day 8-10 (Late):**
|
|
88
|
+
- Still valid but statistically weaker
|
|
89
|
+
- Base quality score: 50 points
|
|
90
|
+
- May indicate hesitant institutional buying
|
|
91
|
+
|
|
92
|
+
**After Day 10:**
|
|
93
|
+
- No longer qualifies as a traditional FTD
|
|
94
|
+
- Rally without FTD by Day 10 is a warning sign
|
|
95
|
+
- May still develop into an uptrend but reliability drops significantly
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Step 4: Dual-Index Confirmation
|
|
100
|
+
|
|
101
|
+
### Single-Index FTD
|
|
102
|
+
An FTD on either the S&P 500 or NASDAQ is sufficient to trigger the signal. The signal is actionable on a single-index confirmation.
|
|
103
|
+
|
|
104
|
+
### Dual-Index FTD
|
|
105
|
+
When both S&P 500 and NASDAQ produce FTDs (within a few days of each other):
|
|
106
|
+
- Significantly higher reliability
|
|
107
|
+
- Quality score bonus: +15 points
|
|
108
|
+
- Indicates broader institutional conviction
|
|
109
|
+
- Both growth and value participants are buying
|
|
110
|
+
|
|
111
|
+
### Index Discrepancy
|
|
112
|
+
When one index confirms FTD but the other is still in rally attempt or correction:
|
|
113
|
+
- FTD is still valid from the confirming index
|
|
114
|
+
- Monitor the lagging index for convergence or divergence
|
|
115
|
+
- Divergence (one fails while other holds) is a cautionary signal
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Quality Score Framework
|
|
120
|
+
|
|
121
|
+
### Score Components (0-100)
|
|
122
|
+
|
|
123
|
+
| Factor | Criteria | Points |
|
|
124
|
+
|--------|----------|--------|
|
|
125
|
+
| **Base (FTD Day)** | Day 4-7 | 60 |
|
|
126
|
+
| | Day 8-10 | 50 |
|
|
127
|
+
| **Price Gain** | >= 2.0% | +15 |
|
|
128
|
+
| | >= 1.5% | +10 |
|
|
129
|
+
| | >= 1.25% | +5 |
|
|
130
|
+
| **Volume vs 50-day Avg** | Above average | +10 |
|
|
131
|
+
| | Below average | +0 |
|
|
132
|
+
| **Dual Index Confirm** | Both S&P 500 + NASDAQ | +15 |
|
|
133
|
+
| | Single index | +0 |
|
|
134
|
+
| **Post-FTD Health** | No distribution (5 days) | +10 |
|
|
135
|
+
| | Distribution Day 4-5 | -5 |
|
|
136
|
+
| | Distribution Day 3 | -15 |
|
|
137
|
+
| | Distribution Day 1-2 | -30 |
|
|
138
|
+
|
|
139
|
+
### Interpretation
|
|
140
|
+
|
|
141
|
+
| Score | Signal | Recommended Exposure |
|
|
142
|
+
|-------|--------|---------------------|
|
|
143
|
+
| 80-100 | Strong FTD | 75-100% equity |
|
|
144
|
+
| 60-79 | Moderate FTD | 50-75% equity |
|
|
145
|
+
| 40-59 | Weak FTD | 25-50% equity |
|
|
146
|
+
| < 40 | No FTD / Failed | 0-25% equity |
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Historical FTD Examples
|
|
151
|
+
|
|
152
|
+
### March 2020 (COVID Crash)
|
|
153
|
+
- **Swing Low:** March 23, 2020 (S&P 500: ~2,237)
|
|
154
|
+
- **Day 1:** March 24, 2020 (+9.4%)
|
|
155
|
+
- **FTD:** April 2, 2020 (Day 8 of rally, +2.3% on higher volume)
|
|
156
|
+
- **Outcome:** Successful - began one of the strongest bull markets in history
|
|
157
|
+
- **Quality:** Moderate (Day 8 = late window, but strong gain and volume)
|
|
158
|
+
- **Note:** Multiple failed rally attempts preceded this successful one
|
|
159
|
+
|
|
160
|
+
### October 2022 (Bear Market Bottom)
|
|
161
|
+
- **Swing Low:** October 13, 2022 (S&P 500: ~3,491)
|
|
162
|
+
- **Day 1:** October 14, 2022 (+2.6%)
|
|
163
|
+
- **FTD:** October 21, 2022 (Day 6, +2.4% on higher volume)
|
|
164
|
+
- **Outcome:** Successful - confirmed the end of the 2022 bear market
|
|
165
|
+
- **Quality:** High (Day 6 = prime window, strong gain, above-avg volume)
|
|
166
|
+
|
|
167
|
+
### June 2022 (Failed FTD)
|
|
168
|
+
- **Swing Low:** June 17, 2022 (S&P 500: ~3,666)
|
|
169
|
+
- **FTD:** Late June 2022
|
|
170
|
+
- **Outcome:** Failed - market made new lows by September 2022
|
|
171
|
+
- **Lesson:** FTD occurred but distribution days followed quickly; market environment (rising rates, inflation) was hostile
|
|
172
|
+
|
|
173
|
+
### December 2018 (Christmas Eve Low)
|
|
174
|
+
- **Swing Low:** December 24, 2018 (S&P 500: ~2,351)
|
|
175
|
+
- **FTD:** January 4, 2019 (Day 6, +3.4% on higher volume)
|
|
176
|
+
- **Outcome:** Successful - powerful rally through 2019
|
|
177
|
+
- **Quality:** Very high (prime window, strong gain, Fed pivot as catalyst)
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## Common Mistakes
|
|
182
|
+
|
|
183
|
+
1. **Buying before FTD confirmation:** Acting on Day 1-3 before FTD is confirmed
|
|
184
|
+
2. **Ignoring volume:** A large gain without volume increase is NOT an FTD
|
|
185
|
+
3. **Counting wrong:** Including non-trading days or resetting day count incorrectly
|
|
186
|
+
4. **Single vs. dual index:** Treating single-index FTD as equivalent to dual-index
|
|
187
|
+
5. **Ignoring post-FTD distribution:** Not monitoring for early distribution days
|
|
188
|
+
6. **FTD ≠ all clear:** Treating FTD as guarantee rather than probability shift
|