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.
Files changed (362) hide show
  1. package/.claude/skills/README.md +80 -0
  2. package/.claude/skills/backtest-expert/SKILL.md +206 -0
  3. package/.claude/skills/backtest-expert/references/failed_tests.md +236 -0
  4. package/.claude/skills/backtest-expert/references/methodology.md +227 -0
  5. package/.claude/skills/breadth-chart-analyst/SKILL.md +583 -0
  6. package/.claude/skills/breadth-chart-analyst/assets/SP500_Breadth_Index_200MA_8MA.jpeg +0 -0
  7. package/.claude/skills/breadth-chart-analyst/assets/US_Stock_Market_Uptrend_Ratio.jpeg +0 -0
  8. package/.claude/skills/breadth-chart-analyst/assets/breadth_analysis_template.md +558 -0
  9. package/.claude/skills/breadth-chart-analyst/references/breadth_chart_methodology.md +590 -0
  10. package/.claude/skills/canslim-screener/SKILL.md +599 -0
  11. package/.claude/skills/canslim-screener/references/canslim_methodology.md +606 -0
  12. package/.claude/skills/canslim-screener/references/fmp_api_endpoints.md +707 -0
  13. package/.claude/skills/canslim-screener/references/interpretation_guide.md +516 -0
  14. package/.claude/skills/canslim-screener/references/scoring_system.md +597 -0
  15. package/.claude/skills/canslim-screener/scripts/calculators/earnings_calculator.py +343 -0
  16. package/.claude/skills/canslim-screener/scripts/calculators/growth_calculator.py +334 -0
  17. package/.claude/skills/canslim-screener/scripts/calculators/institutional_calculator.py +347 -0
  18. package/.claude/skills/canslim-screener/scripts/calculators/leadership_calculator.py +380 -0
  19. package/.claude/skills/canslim-screener/scripts/calculators/market_calculator.py +244 -0
  20. package/.claude/skills/canslim-screener/scripts/calculators/new_highs_calculator.py +194 -0
  21. package/.claude/skills/canslim-screener/scripts/calculators/supply_demand_calculator.py +221 -0
  22. package/.claude/skills/canslim-screener/scripts/finviz_stock_client.py +227 -0
  23. package/.claude/skills/canslim-screener/scripts/fmp_client.py +393 -0
  24. package/.claude/skills/canslim-screener/scripts/report_generator.py +405 -0
  25. package/.claude/skills/canslim-screener/scripts/scorer.py +625 -0
  26. package/.claude/skills/canslim-screener/scripts/screen_canslim.py +361 -0
  27. package/.claude/skills/canslim-screener/scripts/test_institutional_endpoint.py +109 -0
  28. package/.claude/skills/chart/SKILL.md +20 -0
  29. package/.claude/skills/dividend-growth-pullback-screener/SKILL.md +322 -0
  30. package/.claude/skills/dividend-growth-pullback-screener/references/dividend_growth_compounding.md +400 -0
  31. package/.claude/skills/dividend-growth-pullback-screener/references/fmp_api_guide.md +642 -0
  32. package/.claude/skills/dividend-growth-pullback-screener/references/rsi_oversold_strategy.md +333 -0
  33. package/.claude/skills/dividend-growth-pullback-screener/scripts/screen_dividend_growth_rsi.py +1155 -0
  34. package/.claude/skills/earnings-calendar/SKILL.md +721 -0
  35. package/.claude/skills/earnings-calendar/assets/earnings_report_template.md +102 -0
  36. package/.claude/skills/earnings-calendar/references/fmp_api_guide.md +590 -0
  37. package/.claude/skills/earnings-calendar/scripts/fetch_earnings_fmp.py +443 -0
  38. package/.claude/skills/earnings-calendar/scripts/generate_report.py +366 -0
  39. package/.claude/skills/economic-calendar-fetcher/SKILL.md +365 -0
  40. package/.claude/skills/economic-calendar-fetcher/references/fmp_api_documentation.md +345 -0
  41. package/.claude/skills/economic-calendar-fetcher/scripts/get_economic_calendar.py +267 -0
  42. package/.claude/skills/ftd-detector/SKILL.md +147 -0
  43. package/.claude/skills/ftd-detector/references/ftd_methodology.md +188 -0
  44. package/.claude/skills/ftd-detector/references/post_ftd_guide.md +185 -0
  45. package/.claude/skills/ftd-detector/scripts/fmp_client.py +158 -0
  46. package/.claude/skills/ftd-detector/scripts/ftd_detector.py +280 -0
  47. package/.claude/skills/ftd-detector/scripts/post_ftd_monitor.py +404 -0
  48. package/.claude/skills/ftd-detector/scripts/rally_tracker.py +508 -0
  49. package/.claude/skills/ftd-detector/scripts/report_generator.py +341 -0
  50. package/.claude/skills/ftd-detector/scripts/tests/conftest.py +9 -0
  51. package/.claude/skills/ftd-detector/scripts/tests/helpers.py +107 -0
  52. package/.claude/skills/ftd-detector/scripts/tests/test_post_ftd_monitor.py +311 -0
  53. package/.claude/skills/ftd-detector/scripts/tests/test_rally_tracker.py +302 -0
  54. package/.claude/skills/institutional-flow-tracker/README.md +362 -0
  55. package/.claude/skills/institutional-flow-tracker/SKILL.md +357 -0
  56. package/.claude/skills/institutional-flow-tracker/references/13f_filings_guide.md +383 -0
  57. package/.claude/skills/institutional-flow-tracker/references/institutional_investor_types.md +580 -0
  58. package/.claude/skills/institutional-flow-tracker/references/interpretation_framework.md +573 -0
  59. package/.claude/skills/institutional-flow-tracker/scripts/analyze_single_stock.py +457 -0
  60. package/.claude/skills/institutional-flow-tracker/scripts/track_institution_portfolio.py +108 -0
  61. package/.claude/skills/institutional-flow-tracker/scripts/track_institutional_flow.py +450 -0
  62. package/.claude/skills/macro-regime-detector/SKILL.md +86 -0
  63. package/.claude/skills/macro-regime-detector/references/historical_regimes.md +124 -0
  64. package/.claude/skills/macro-regime-detector/references/indicator_interpretation_guide.md +144 -0
  65. package/.claude/skills/macro-regime-detector/references/regime_detection_methodology.md +138 -0
  66. package/.claude/skills/macro-regime-detector/scripts/calculators/__init__.py +1 -0
  67. package/.claude/skills/macro-regime-detector/scripts/calculators/concentration_calculator.py +165 -0
  68. package/.claude/skills/macro-regime-detector/scripts/calculators/credit_conditions_calculator.py +124 -0
  69. package/.claude/skills/macro-regime-detector/scripts/calculators/equity_bond_calculator.py +198 -0
  70. package/.claude/skills/macro-regime-detector/scripts/calculators/sector_rotation_calculator.py +123 -0
  71. package/.claude/skills/macro-regime-detector/scripts/calculators/size_factor_calculator.py +131 -0
  72. package/.claude/skills/macro-regime-detector/scripts/calculators/utils.py +347 -0
  73. package/.claude/skills/macro-regime-detector/scripts/calculators/yield_curve_calculator.py +279 -0
  74. package/.claude/skills/macro-regime-detector/scripts/fmp_client.py +134 -0
  75. package/.claude/skills/macro-regime-detector/scripts/macro_regime_detector.py +278 -0
  76. package/.claude/skills/macro-regime-detector/scripts/report_generator.py +327 -0
  77. package/.claude/skills/macro-regime-detector/scripts/scorer.py +574 -0
  78. package/.claude/skills/macro-regime-detector/scripts/tests/conftest.py +9 -0
  79. package/.claude/skills/macro-regime-detector/scripts/tests/test_concentration.py +78 -0
  80. package/.claude/skills/macro-regime-detector/scripts/tests/test_credit_conditions.py +59 -0
  81. package/.claude/skills/macro-regime-detector/scripts/tests/test_equity_bond.py +74 -0
  82. package/.claude/skills/macro-regime-detector/scripts/tests/test_helpers.py +90 -0
  83. package/.claude/skills/macro-regime-detector/scripts/tests/test_scorer.py +439 -0
  84. package/.claude/skills/macro-regime-detector/scripts/tests/test_sector_rotation.py +78 -0
  85. package/.claude/skills/macro-regime-detector/scripts/tests/test_size_factor.py +59 -0
  86. package/.claude/skills/macro-regime-detector/scripts/tests/test_utils.py +126 -0
  87. package/.claude/skills/macro-regime-detector/scripts/tests/test_yield_curve.py +64 -0
  88. package/.claude/skills/market-breadth-analyzer/SKILL.md +121 -0
  89. package/.claude/skills/market-breadth-analyzer/references/breadth_analysis_methodology.md +168 -0
  90. package/.claude/skills/market-breadth-analyzer/scripts/calculators/__init__.py +1 -0
  91. package/.claude/skills/market-breadth-analyzer/scripts/calculators/bearish_signal_calculator.py +150 -0
  92. package/.claude/skills/market-breadth-analyzer/scripts/calculators/cycle_calculator.py +168 -0
  93. package/.claude/skills/market-breadth-analyzer/scripts/calculators/divergence_calculator.py +119 -0
  94. package/.claude/skills/market-breadth-analyzer/scripts/calculators/historical_context_calculator.py +120 -0
  95. package/.claude/skills/market-breadth-analyzer/scripts/calculators/ma_crossover_calculator.py +115 -0
  96. package/.claude/skills/market-breadth-analyzer/scripts/calculators/trend_level_calculator.py +103 -0
  97. package/.claude/skills/market-breadth-analyzer/scripts/csv_client.py +225 -0
  98. package/.claude/skills/market-breadth-analyzer/scripts/market_breadth_analyzer.py +307 -0
  99. package/.claude/skills/market-breadth-analyzer/scripts/report_generator.py +330 -0
  100. package/.claude/skills/market-breadth-analyzer/scripts/scorer.py +271 -0
  101. package/.claude/skills/market-environment-analysis/SKILL.md +139 -0
  102. package/.claude/skills/market-environment-analysis/references/analysis_patterns.md +124 -0
  103. package/.claude/skills/market-environment-analysis/references/indicators.md +99 -0
  104. package/.claude/skills/market-environment-analysis/scripts/market_utils.py +127 -0
  105. package/.claude/skills/market-news-analyst/SKILL.md +714 -0
  106. package/.claude/skills/market-news-analyst/references/corporate_news_impact.md +446 -0
  107. package/.claude/skills/market-news-analyst/references/geopolitical_commodity_correlations.md +499 -0
  108. package/.claude/skills/market-news-analyst/references/market_event_patterns.md +393 -0
  109. package/.claude/skills/market-news-analyst/references/trusted_news_sources.md +510 -0
  110. package/.claude/skills/market-top-detector/SKILL.md +159 -0
  111. package/.claude/skills/market-top-detector/references/distribution_day_guide.md +100 -0
  112. package/.claude/skills/market-top-detector/references/historical_tops.md +142 -0
  113. package/.claude/skills/market-top-detector/references/market_top_methodology.md +167 -0
  114. package/.claude/skills/market-top-detector/scripts/calculators/__init__.py +17 -0
  115. package/.claude/skills/market-top-detector/scripts/calculators/breadth_calculator.py +116 -0
  116. package/.claude/skills/market-top-detector/scripts/calculators/defensive_rotation_calculator.py +127 -0
  117. package/.claude/skills/market-top-detector/scripts/calculators/distribution_day_calculator.py +161 -0
  118. package/.claude/skills/market-top-detector/scripts/calculators/index_technical_calculator.py +254 -0
  119. package/.claude/skills/market-top-detector/scripts/calculators/leading_stock_calculator.py +198 -0
  120. package/.claude/skills/market-top-detector/scripts/calculators/sentiment_calculator.py +213 -0
  121. package/.claude/skills/market-top-detector/scripts/fmp_client.py +158 -0
  122. package/.claude/skills/market-top-detector/scripts/market_top_detector.py +349 -0
  123. package/.claude/skills/market-top-detector/scripts/report_generator.py +314 -0
  124. package/.claude/skills/market-top-detector/scripts/scorer.py +473 -0
  125. package/.claude/skills/market-top-detector/scripts/tests/conftest.py +9 -0
  126. package/.claude/skills/market-top-detector/scripts/tests/helpers.py +49 -0
  127. package/.claude/skills/market-top-detector/scripts/tests/test_breadth.py +62 -0
  128. package/.claude/skills/market-top-detector/scripts/tests/test_defensive_rotation.py +56 -0
  129. package/.claude/skills/market-top-detector/scripts/tests/test_distribution_day.py +92 -0
  130. package/.claude/skills/market-top-detector/scripts/tests/test_index_technical.py +73 -0
  131. package/.claude/skills/market-top-detector/scripts/tests/test_leading_stock.py +57 -0
  132. package/.claude/skills/market-top-detector/scripts/tests/test_scorer.py +180 -0
  133. package/.claude/skills/market-top-detector/scripts/tests/test_sentiment.py +64 -0
  134. package/.claude/skills/options-strategy-advisor/README.md +469 -0
  135. package/.claude/skills/options-strategy-advisor/SKILL.md +959 -0
  136. package/.claude/skills/options-strategy-advisor/scripts/black_scholes.py +495 -0
  137. package/.claude/skills/pair-trade-screener/README.md +389 -0
  138. package/.claude/skills/pair-trade-screener/SKILL.md +622 -0
  139. package/.claude/skills/pair-trade-screener/references/cointegration_guide.md +745 -0
  140. package/.claude/skills/pair-trade-screener/references/methodology.md +853 -0
  141. package/.claude/skills/pair-trade-screener/scripts/analyze_spread.py +394 -0
  142. package/.claude/skills/pair-trade-screener/scripts/find_pairs.py +535 -0
  143. package/.claude/skills/portfolio-manager/README.md +394 -0
  144. package/.claude/skills/portfolio-manager/SKILL.md +750 -0
  145. package/.claude/skills/portfolio-manager/references/alpaca-mcp-setup.md +367 -0
  146. package/.claude/skills/portfolio-manager/references/asset-allocation.md +502 -0
  147. package/.claude/skills/portfolio-manager/references/diversification-principles.md +553 -0
  148. package/.claude/skills/portfolio-manager/references/portfolio-risk-metrics.md +603 -0
  149. package/.claude/skills/portfolio-manager/references/position-evaluation.md +477 -0
  150. package/.claude/skills/portfolio-manager/references/rebalancing-strategies.md +715 -0
  151. package/.claude/skills/portfolio-manager/references/risk-profile-questionnaire.md +608 -0
  152. package/.claude/skills/portfolio-manager/references/target-allocations.md +558 -0
  153. package/.claude/skills/portfolio-manager/scripts/test_alpaca_connection.py +286 -0
  154. package/.claude/skills/scenario-analyzer/SKILL.md +317 -0
  155. package/.claude/skills/scenario-analyzer/references/headline_event_patterns.md +264 -0
  156. package/.claude/skills/scenario-analyzer/references/scenario_playbooks.md +320 -0
  157. package/.claude/skills/scenario-analyzer/references/sector_sensitivity_matrix.md +217 -0
  158. package/.claude/skills/sector-analyst/SKILL.md +206 -0
  159. package/.claude/skills/sector-analyst/assets/industory_performance_1.jpeg +0 -0
  160. package/.claude/skills/sector-analyst/assets/industory_performance_2.jpeg +0 -0
  161. package/.claude/skills/sector-analyst/assets/sector_performance.jpeg +0 -0
  162. package/.claude/skills/sector-analyst/references/sector_rotation.md +170 -0
  163. package/.claude/skills/stanley-druckenmiller-investment/SKILL.md +84 -0
  164. package/.claude/skills/stanley-druckenmiller-investment/references/case-studies.md +148 -0
  165. package/.claude/skills/stanley-druckenmiller-investment/references/investment-philosophy.md +80 -0
  166. package/.claude/skills/stanley-druckenmiller-investment/references/market-analysis-guide.md +146 -0
  167. package/.claude/skills/stock/NOTION_SETUP.md +33 -0
  168. package/.claude/skills/stock/SKILL.md +38 -0
  169. package/.claude/skills/technical-analyst/SKILL.md +238 -0
  170. package/.claude/skills/technical-analyst/assets/analysis_template.md +183 -0
  171. package/.claude/skills/technical-analyst/references/technical_analysis_framework.md +282 -0
  172. package/.claude/skills/theme-detector/SKILL.md +320 -0
  173. package/.claude/skills/theme-detector/assets/report_template.md +155 -0
  174. package/.claude/skills/theme-detector/references/cross_sector_themes.md +252 -0
  175. package/.claude/skills/theme-detector/references/finviz_industry_codes.md +403 -0
  176. package/.claude/skills/theme-detector/references/thematic_etf_catalog.md +333 -0
  177. package/.claude/skills/theme-detector/references/theme_detection_methodology.md +430 -0
  178. package/.claude/skills/theme-detector/scripts/calculators/__init__.py +1 -0
  179. package/.claude/skills/theme-detector/scripts/calculators/heat_calculator.py +123 -0
  180. package/.claude/skills/theme-detector/scripts/calculators/industry_ranker.py +98 -0
  181. package/.claude/skills/theme-detector/scripts/calculators/lifecycle_calculator.py +172 -0
  182. package/.claude/skills/theme-detector/scripts/calculators/theme_classifier.py +195 -0
  183. package/.claude/skills/theme-detector/scripts/calculators/theme_discoverer.py +280 -0
  184. package/.claude/skills/theme-detector/scripts/config_loader.py +142 -0
  185. package/.claude/skills/theme-detector/scripts/default_theme_config.py +254 -0
  186. package/.claude/skills/theme-detector/scripts/etf_scanner.py +609 -0
  187. package/.claude/skills/theme-detector/scripts/finviz_performance_client.py +131 -0
  188. package/.claude/skills/theme-detector/scripts/report_generator.py +490 -0
  189. package/.claude/skills/theme-detector/scripts/representative_stock_selector.py +673 -0
  190. package/.claude/skills/theme-detector/scripts/scorer.py +87 -0
  191. package/.claude/skills/theme-detector/scripts/tests/README.md +21 -0
  192. package/.claude/skills/theme-detector/scripts/tests/conftest.py +9 -0
  193. package/.claude/skills/theme-detector/scripts/tests/test_config_loader.py +239 -0
  194. package/.claude/skills/theme-detector/scripts/tests/test_etf_scanner.py +810 -0
  195. package/.claude/skills/theme-detector/scripts/tests/test_heat_calculator.py +245 -0
  196. package/.claude/skills/theme-detector/scripts/tests/test_industry_ranker.py +256 -0
  197. package/.claude/skills/theme-detector/scripts/tests/test_lifecycle_calculator.py +301 -0
  198. package/.claude/skills/theme-detector/scripts/tests/test_report_generator.py +624 -0
  199. package/.claude/skills/theme-detector/scripts/tests/test_representative_stock_selector.py +898 -0
  200. package/.claude/skills/theme-detector/scripts/tests/test_scorer.py +185 -0
  201. package/.claude/skills/theme-detector/scripts/tests/test_theme_classifier.py +534 -0
  202. package/.claude/skills/theme-detector/scripts/tests/test_theme_detector_e2e.py +467 -0
  203. package/.claude/skills/theme-detector/scripts/tests/test_theme_discoverer.py +458 -0
  204. package/.claude/skills/theme-detector/scripts/tests/test_uptrend_client.py +76 -0
  205. package/.claude/skills/theme-detector/scripts/theme_detector.py +815 -0
  206. package/.claude/skills/theme-detector/scripts/themes.yaml +168 -0
  207. package/.claude/skills/theme-detector/scripts/uptrend_client.py +241 -0
  208. package/.claude/skills/uptrend-analyzer/SKILL.md +108 -0
  209. package/.claude/skills/uptrend-analyzer/references/uptrend_methodology.md +215 -0
  210. package/.claude/skills/uptrend-analyzer/scripts/calculators/__init__.py +1 -0
  211. package/.claude/skills/uptrend-analyzer/scripts/calculators/historical_context_calculator.py +122 -0
  212. package/.claude/skills/uptrend-analyzer/scripts/calculators/market_breadth_calculator.py +145 -0
  213. package/.claude/skills/uptrend-analyzer/scripts/calculators/momentum_calculator.py +183 -0
  214. package/.claude/skills/uptrend-analyzer/scripts/calculators/sector_participation_calculator.py +204 -0
  215. package/.claude/skills/uptrend-analyzer/scripts/calculators/sector_rotation_calculator.py +218 -0
  216. package/.claude/skills/uptrend-analyzer/scripts/data_fetcher.py +236 -0
  217. package/.claude/skills/uptrend-analyzer/scripts/report_generator.py +329 -0
  218. package/.claude/skills/uptrend-analyzer/scripts/scorer.py +276 -0
  219. package/.claude/skills/uptrend-analyzer/scripts/uptrend_analyzer.py +219 -0
  220. package/.claude/skills/us-market-bubble-detector/CHANGELOG.md +118 -0
  221. package/.claude/skills/us-market-bubble-detector/SKILL.md +545 -0
  222. package/.claude/skills/us-market-bubble-detector/references/bubble_framework.md +335 -0
  223. package/.claude/skills/us-market-bubble-detector/references/historical_cases.md +327 -0
  224. package/.claude/skills/us-market-bubble-detector/references/implementation_guide.md +473 -0
  225. package/.claude/skills/us-market-bubble-detector/references/quick_reference.md +354 -0
  226. package/.claude/skills/us-market-bubble-detector/references/quick_reference_en.md +342 -0
  227. package/.claude/skills/us-market-bubble-detector/scripts/bubble_scorer.py +309 -0
  228. package/.claude/skills/us-stock-analysis/SKILL.md +294 -0
  229. package/.claude/skills/us-stock-analysis/references/financial-metrics.md +172 -0
  230. package/.claude/skills/us-stock-analysis/references/fundamental-analysis.md +129 -0
  231. package/.claude/skills/us-stock-analysis/references/report-template.md +207 -0
  232. package/.claude/skills/us-stock-analysis/references/technical-analysis.md +93 -0
  233. package/.claude/skills/value-dividend-screener/SKILL.md +562 -0
  234. package/.claude/skills/value-dividend-screener/references/fmp_api_guide.md +348 -0
  235. package/.claude/skills/value-dividend-screener/references/screening_methodology.md +315 -0
  236. package/.claude/skills/value-dividend-screener/scripts/screen_dividend_stocks.py +1138 -0
  237. package/.claude/skills/vcp-screener/SKILL.md +79 -0
  238. package/.claude/skills/vcp-screener/references/fmp_api_endpoints.md +45 -0
  239. package/.claude/skills/vcp-screener/references/scoring_system.md +154 -0
  240. package/.claude/skills/vcp-screener/references/vcp_methodology.md +124 -0
  241. package/.claude/skills/vcp-screener/scripts/calculators/__init__.py +1 -0
  242. package/.claude/skills/vcp-screener/scripts/calculators/pivot_proximity_calculator.py +139 -0
  243. package/.claude/skills/vcp-screener/scripts/calculators/relative_strength_calculator.py +161 -0
  244. package/.claude/skills/vcp-screener/scripts/calculators/trend_template_calculator.py +228 -0
  245. package/.claude/skills/vcp-screener/scripts/calculators/vcp_pattern_calculator.py +322 -0
  246. package/.claude/skills/vcp-screener/scripts/calculators/volume_pattern_calculator.py +121 -0
  247. package/.claude/skills/vcp-screener/scripts/fmp_client.py +162 -0
  248. package/.claude/skills/vcp-screener/scripts/report_generator.py +317 -0
  249. package/.claude/skills/vcp-screener/scripts/scorer.py +155 -0
  250. package/.claude/skills/vcp-screener/scripts/screen_vcp.py +536 -0
  251. package/.claude/skills/vcp-screener/scripts/tests/__init__.py +0 -0
  252. package/.claude/skills/vcp-screener/scripts/tests/conftest.py +9 -0
  253. package/.claude/skills/vcp-screener/scripts/tests/test_vcp_screener.py +834 -0
  254. package/.claude/skills/weekly-trade-strategy/.claude/agents/druckenmiller-strategy-planner.md +300 -0
  255. package/.claude/skills/weekly-trade-strategy/.claude/agents/market-news-analyzer.md +239 -0
  256. package/.claude/skills/weekly-trade-strategy/.claude/agents/technical-market-analyst.md +187 -0
  257. package/.claude/skills/weekly-trade-strategy/.claude/agents/us-market-analyst.md +218 -0
  258. package/.claude/skills/weekly-trade-strategy/.claude/agents/weekly-trade-blog-writer.md +318 -0
  259. package/.claude/skills/weekly-trade-strategy/.claude/skills/breadth-chart-analyst/SKILL.md +662 -0
  260. package/.claude/skills/weekly-trade-strategy/.claude/skills/breadth-chart-analyst/assets/SP500_Breadth_Index_200MA_8MA.jpeg +0 -0
  261. package/.claude/skills/weekly-trade-strategy/.claude/skills/breadth-chart-analyst/assets/US_Stock_Market_Uptrend_Ratio.jpeg +0 -0
  262. package/.claude/skills/weekly-trade-strategy/.claude/skills/breadth-chart-analyst/assets/breadth_analysis_template.md +558 -0
  263. package/.claude/skills/weekly-trade-strategy/.claude/skills/breadth-chart-analyst/references/breadth_chart_methodology.md +590 -0
  264. package/.claude/skills/weekly-trade-strategy/.claude/skills/earnings-calendar/SKILL.md +721 -0
  265. package/.claude/skills/weekly-trade-strategy/.claude/skills/earnings-calendar/assets/earnings_report_template.md +102 -0
  266. package/.claude/skills/weekly-trade-strategy/.claude/skills/earnings-calendar/earnings_calendar_2025-11-02.md +447 -0
  267. package/.claude/skills/weekly-trade-strategy/.claude/skills/earnings-calendar/references/fmp_api_guide.md +590 -0
  268. package/.claude/skills/weekly-trade-strategy/.claude/skills/earnings-calendar/scripts/fetch_earnings_fmp.py +443 -0
  269. package/.claude/skills/weekly-trade-strategy/.claude/skills/earnings-calendar/scripts/generate_report.py +366 -0
  270. package/.claude/skills/weekly-trade-strategy/.claude/skills/economic-calendar-fetcher/SKILL.md +365 -0
  271. package/.claude/skills/weekly-trade-strategy/.claude/skills/economic-calendar-fetcher/references/fmp_api_documentation.md +345 -0
  272. package/.claude/skills/weekly-trade-strategy/.claude/skills/economic-calendar-fetcher/scripts/get_economic_calendar.py +267 -0
  273. package/.claude/skills/weekly-trade-strategy/.claude/skills/market-environment-analysis/SKILL.md +139 -0
  274. package/.claude/skills/weekly-trade-strategy/.claude/skills/market-environment-analysis/references/analysis_patterns.md +124 -0
  275. package/.claude/skills/weekly-trade-strategy/.claude/skills/market-environment-analysis/references/indicators.md +99 -0
  276. package/.claude/skills/weekly-trade-strategy/.claude/skills/market-environment-analysis/scripts/market_utils.py +127 -0
  277. package/.claude/skills/weekly-trade-strategy/.claude/skills/market-news-analyst/SKILL.md +714 -0
  278. package/.claude/skills/weekly-trade-strategy/.claude/skills/market-news-analyst/references/corporate_news_impact.md +446 -0
  279. package/.claude/skills/weekly-trade-strategy/.claude/skills/market-news-analyst/references/geopolitical_commodity_correlations.md +499 -0
  280. package/.claude/skills/weekly-trade-strategy/.claude/skills/market-news-analyst/references/market_event_patterns.md +393 -0
  281. package/.claude/skills/weekly-trade-strategy/.claude/skills/market-news-analyst/references/trusted_news_sources.md +510 -0
  282. package/.claude/skills/weekly-trade-strategy/.claude/skills/sector-analyst/SKILL.md +206 -0
  283. package/.claude/skills/weekly-trade-strategy/.claude/skills/sector-analyst/assets/industory_performance_1.jpeg +0 -0
  284. package/.claude/skills/weekly-trade-strategy/.claude/skills/sector-analyst/assets/industory_performance_2.jpeg +0 -0
  285. package/.claude/skills/weekly-trade-strategy/.claude/skills/sector-analyst/assets/sector_performance.jpeg +0 -0
  286. package/.claude/skills/weekly-trade-strategy/.claude/skills/sector-analyst/references/sector_rotation.md +170 -0
  287. package/.claude/skills/weekly-trade-strategy/.claude/skills/stanley-druckenmiller-investment/SKILL.md +84 -0
  288. package/.claude/skills/weekly-trade-strategy/.claude/skills/stanley-druckenmiller-investment/references/case-studies.md +148 -0
  289. package/.claude/skills/weekly-trade-strategy/.claude/skills/stanley-druckenmiller-investment/references/investment-philosophy.md +80 -0
  290. package/.claude/skills/weekly-trade-strategy/.claude/skills/stanley-druckenmiller-investment/references/market-analysis-guide.md +146 -0
  291. package/.claude/skills/weekly-trade-strategy/.claude/skills/technical-analyst/SKILL.md +238 -0
  292. package/.claude/skills/weekly-trade-strategy/.claude/skills/technical-analyst/assets/analysis_template.md +183 -0
  293. package/.claude/skills/weekly-trade-strategy/.claude/skills/technical-analyst/references/technical_analysis_framework.md +282 -0
  294. package/.claude/skills/weekly-trade-strategy/.claude/skills/us-market-bubble-detector/CHANGELOG.md +118 -0
  295. package/.claude/skills/weekly-trade-strategy/.claude/skills/us-market-bubble-detector/SKILL.md +545 -0
  296. package/.claude/skills/weekly-trade-strategy/.claude/skills/us-market-bubble-detector/references/bubble_framework.md +335 -0
  297. package/.claude/skills/weekly-trade-strategy/.claude/skills/us-market-bubble-detector/references/historical_cases.md +327 -0
  298. package/.claude/skills/weekly-trade-strategy/.claude/skills/us-market-bubble-detector/references/implementation_guide.md +473 -0
  299. package/.claude/skills/weekly-trade-strategy/.claude/skills/us-market-bubble-detector/references/quick_reference.md +354 -0
  300. package/.claude/skills/weekly-trade-strategy/.claude/skills/us-market-bubble-detector/references/quick_reference_en.md +342 -0
  301. package/.claude/skills/weekly-trade-strategy/.claude/skills/us-market-bubble-detector/scripts/bubble_scorer.py +309 -0
  302. package/.claude/skills/weekly-trade-strategy/.claude/skills/us-stock-analysis/SKILL.md +294 -0
  303. package/.claude/skills/weekly-trade-strategy/.claude/skills/us-stock-analysis/references/financial-metrics.md +172 -0
  304. package/.claude/skills/weekly-trade-strategy/.claude/skills/us-stock-analysis/references/fundamental-analysis.md +129 -0
  305. package/.claude/skills/weekly-trade-strategy/.claude/skills/us-stock-analysis/references/report-template.md +207 -0
  306. package/.claude/skills/weekly-trade-strategy/.claude/skills/us-stock-analysis/references/technical-analysis.md +93 -0
  307. package/.claude/skills/weekly-trade-strategy/CLAUDE.md +454 -0
  308. package/.claude/skills/weekly-trade-strategy/README.md +287 -0
  309. package/.claude/skills/weekly-trade-strategy/blogs/.gitkeep +0 -0
  310. package/.claude/skills/weekly-trade-strategy/charts/.gitkeep +0 -0
  311. package/.claude/skills/weekly-trade-strategy/earnings_data.json +10054 -0
  312. package/.claude/skills/weekly-trade-strategy/skills/breadth-chart-analyst/SKILL.md +662 -0
  313. package/.claude/skills/weekly-trade-strategy/skills/breadth-chart-analyst/assets/SP500_Breadth_Index_200MA_8MA.jpeg +0 -0
  314. package/.claude/skills/weekly-trade-strategy/skills/breadth-chart-analyst/assets/US_Stock_Market_Uptrend_Ratio.jpeg +0 -0
  315. package/.claude/skills/weekly-trade-strategy/skills/breadth-chart-analyst/assets/breadth_analysis_template.md +558 -0
  316. package/.claude/skills/weekly-trade-strategy/skills/breadth-chart-analyst/references/breadth_chart_methodology.md +590 -0
  317. package/.claude/skills/weekly-trade-strategy/skills/earnings-calendar/SKILL.md +721 -0
  318. package/.claude/skills/weekly-trade-strategy/skills/earnings-calendar/assets/earnings_report_template.md +102 -0
  319. package/.claude/skills/weekly-trade-strategy/skills/earnings-calendar/earnings_calendar_2025-11-02.md +447 -0
  320. package/.claude/skills/weekly-trade-strategy/skills/earnings-calendar/references/fmp_api_guide.md +590 -0
  321. package/.claude/skills/weekly-trade-strategy/skills/earnings-calendar/scripts/fetch_earnings_fmp.py +443 -0
  322. package/.claude/skills/weekly-trade-strategy/skills/earnings-calendar/scripts/generate_report.py +366 -0
  323. package/.claude/skills/weekly-trade-strategy/skills/economic-calendar-fetcher/SKILL.md +365 -0
  324. package/.claude/skills/weekly-trade-strategy/skills/economic-calendar-fetcher/references/fmp_api_documentation.md +345 -0
  325. package/.claude/skills/weekly-trade-strategy/skills/economic-calendar-fetcher/scripts/get_economic_calendar.py +267 -0
  326. package/.claude/skills/weekly-trade-strategy/skills/market-environment-analysis/SKILL.md +139 -0
  327. package/.claude/skills/weekly-trade-strategy/skills/market-environment-analysis/references/analysis_patterns.md +124 -0
  328. package/.claude/skills/weekly-trade-strategy/skills/market-environment-analysis/references/indicators.md +99 -0
  329. package/.claude/skills/weekly-trade-strategy/skills/market-environment-analysis/scripts/market_utils.py +127 -0
  330. package/.claude/skills/weekly-trade-strategy/skills/market-news-analyst/SKILL.md +714 -0
  331. package/.claude/skills/weekly-trade-strategy/skills/market-news-analyst/references/corporate_news_impact.md +446 -0
  332. package/.claude/skills/weekly-trade-strategy/skills/market-news-analyst/references/geopolitical_commodity_correlations.md +499 -0
  333. package/.claude/skills/weekly-trade-strategy/skills/market-news-analyst/references/market_event_patterns.md +393 -0
  334. package/.claude/skills/weekly-trade-strategy/skills/market-news-analyst/references/trusted_news_sources.md +510 -0
  335. package/.claude/skills/weekly-trade-strategy/skills/sector-analyst/SKILL.md +206 -0
  336. package/.claude/skills/weekly-trade-strategy/skills/sector-analyst/assets/industory_performance_1.jpeg +0 -0
  337. package/.claude/skills/weekly-trade-strategy/skills/sector-analyst/assets/industory_performance_2.jpeg +0 -0
  338. package/.claude/skills/weekly-trade-strategy/skills/sector-analyst/assets/sector_performance.jpeg +0 -0
  339. package/.claude/skills/weekly-trade-strategy/skills/sector-analyst/references/sector_rotation.md +170 -0
  340. package/.claude/skills/weekly-trade-strategy/skills/stanley-druckenmiller-investment/SKILL.md +84 -0
  341. package/.claude/skills/weekly-trade-strategy/skills/stanley-druckenmiller-investment/references/case-studies.md +148 -0
  342. package/.claude/skills/weekly-trade-strategy/skills/stanley-druckenmiller-investment/references/investment-philosophy.md +80 -0
  343. package/.claude/skills/weekly-trade-strategy/skills/stanley-druckenmiller-investment/references/market-analysis-guide.md +146 -0
  344. package/.claude/skills/weekly-trade-strategy/skills/technical-analyst/SKILL.md +238 -0
  345. package/.claude/skills/weekly-trade-strategy/skills/technical-analyst/assets/analysis_template.md +183 -0
  346. package/.claude/skills/weekly-trade-strategy/skills/technical-analyst/references/technical_analysis_framework.md +282 -0
  347. package/.claude/skills/weekly-trade-strategy/skills/us-market-bubble-detector/CHANGELOG.md +118 -0
  348. package/.claude/skills/weekly-trade-strategy/skills/us-market-bubble-detector/SKILL.md +545 -0
  349. package/.claude/skills/weekly-trade-strategy/skills/us-market-bubble-detector/references/bubble_framework.md +335 -0
  350. package/.claude/skills/weekly-trade-strategy/skills/us-market-bubble-detector/references/historical_cases.md +327 -0
  351. package/.claude/skills/weekly-trade-strategy/skills/us-market-bubble-detector/references/implementation_guide.md +473 -0
  352. package/.claude/skills/weekly-trade-strategy/skills/us-market-bubble-detector/references/quick_reference.md +354 -0
  353. package/.claude/skills/weekly-trade-strategy/skills/us-market-bubble-detector/references/quick_reference_en.md +342 -0
  354. package/.claude/skills/weekly-trade-strategy/skills/us-market-bubble-detector/scripts/bubble_scorer.py +309 -0
  355. package/.claude/skills/weekly-trade-strategy/skills/us-stock-analysis/SKILL.md +294 -0
  356. package/.claude/skills/weekly-trade-strategy/skills/us-stock-analysis/references/financial-metrics.md +172 -0
  357. package/.claude/skills/weekly-trade-strategy/skills/us-stock-analysis/references/fundamental-analysis.md +129 -0
  358. package/.claude/skills/weekly-trade-strategy/skills/us-stock-analysis/references/report-template.md +207 -0
  359. package/.claude/skills/weekly-trade-strategy/skills/us-stock-analysis/references/technical-analysis.md +93 -0
  360. package/.mcp.json +3 -0
  361. package/cli.mjs +16 -16
  362. 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