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,134 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ FMP API Client for Macro Regime Detector
4
+
5
+ Provides rate-limited access to Financial Modeling Prep API endpoints
6
+ for macro regime detection analysis.
7
+
8
+ Features:
9
+ - Rate limiting (0.3s between requests)
10
+ - Automatic retry on 429 errors
11
+ - Session caching for duplicate requests
12
+ - Batch historical data support
13
+ - Treasury rates endpoint support
14
+ """
15
+
16
+ import os
17
+ import sys
18
+ import time
19
+ from typing import Dict, List, Optional
20
+
21
+ try:
22
+ import requests
23
+ except ImportError:
24
+ print("ERROR: requests library not found. Install with: pip install requests", file=sys.stderr)
25
+ sys.exit(1)
26
+
27
+
28
+ class FMPClient:
29
+ """Client for Financial Modeling Prep API with rate limiting and caching"""
30
+
31
+ BASE_URL = "https://financialmodelingprep.com/api/v3"
32
+ STABLE_URL = "https://financialmodelingprep.com/stable"
33
+ RATE_LIMIT_DELAY = 0.3 # 300ms between requests
34
+
35
+ def __init__(self, api_key: Optional[str] = None):
36
+ self.api_key = api_key or os.getenv("FMP_API_KEY")
37
+ if not self.api_key:
38
+ raise ValueError(
39
+ "FMP API key required. Set FMP_API_KEY environment variable "
40
+ "or pass api_key parameter."
41
+ )
42
+ self.session = requests.Session()
43
+ self.cache = {}
44
+ self.last_call_time = 0
45
+ self.rate_limit_reached = False
46
+ self.retry_count = 0
47
+ self.max_retries = 1
48
+ self.api_calls_made = 0
49
+
50
+ def _rate_limited_get(self, url: str, params: Optional[Dict] = None) -> Optional[Dict]:
51
+ if self.rate_limit_reached:
52
+ return None
53
+
54
+ if params is None:
55
+ params = {}
56
+ params['apikey'] = self.api_key
57
+
58
+ elapsed = time.time() - self.last_call_time
59
+ if elapsed < self.RATE_LIMIT_DELAY:
60
+ time.sleep(self.RATE_LIMIT_DELAY - elapsed)
61
+
62
+ try:
63
+ response = self.session.get(url, params=params, timeout=30)
64
+ self.last_call_time = time.time()
65
+ self.api_calls_made += 1
66
+
67
+ if response.status_code == 200:
68
+ self.retry_count = 0
69
+ return response.json()
70
+ elif response.status_code == 429:
71
+ self.retry_count += 1
72
+ if self.retry_count <= self.max_retries:
73
+ print("WARNING: Rate limit exceeded. Waiting 60 seconds...", file=sys.stderr)
74
+ time.sleep(60)
75
+ return self._rate_limited_get(url, params)
76
+ else:
77
+ print("ERROR: Daily API rate limit reached.", file=sys.stderr)
78
+ self.rate_limit_reached = True
79
+ return None
80
+ else:
81
+ print(f"ERROR: API request failed: {response.status_code} - {response.text[:200]}",
82
+ file=sys.stderr)
83
+ return None
84
+ except requests.exceptions.RequestException as e:
85
+ print(f"ERROR: Request exception: {e}", file=sys.stderr)
86
+ return None
87
+
88
+ def get_historical_prices(self, symbol: str, days: int = 600) -> Optional[Dict]:
89
+ """Fetch historical daily OHLCV data"""
90
+ cache_key = f"prices_{symbol}_{days}"
91
+ if cache_key in self.cache:
92
+ return self.cache[cache_key]
93
+
94
+ url = f"{self.BASE_URL}/historical-price-full/{symbol}"
95
+ params = {"timeseries": days}
96
+ data = self._rate_limited_get(url, params)
97
+ if data:
98
+ self.cache[cache_key] = data
99
+ return data
100
+
101
+ def get_batch_historical(self, symbols: List[str], days: int = 600) -> Dict[str, List[Dict]]:
102
+ """Fetch historical prices for multiple symbols"""
103
+ results = {}
104
+ for symbol in symbols:
105
+ data = self.get_historical_prices(symbol, days=days)
106
+ if data and 'historical' in data:
107
+ results[symbol] = data['historical']
108
+ return results
109
+
110
+ def get_treasury_rates(self, days: int = 600) -> Optional[List[Dict]]:
111
+ """
112
+ Fetch treasury rate data from FMP stable endpoint.
113
+
114
+ Returns list of dicts with keys like 'date', 'year2', 'year10', etc.
115
+ Most recent first.
116
+ """
117
+ cache_key = f"treasury_{days}"
118
+ if cache_key in self.cache:
119
+ return self.cache[cache_key]
120
+
121
+ url = f"{self.STABLE_URL}/treasury-rates"
122
+ params = {"limit": days}
123
+ data = self._rate_limited_get(url, params)
124
+ if data and isinstance(data, list):
125
+ self.cache[cache_key] = data
126
+ return data
127
+ return None
128
+
129
+ def get_api_stats(self) -> Dict:
130
+ return {
131
+ "cache_entries": len(self.cache),
132
+ "api_calls_made": self.api_calls_made,
133
+ "rate_limit_reached": self.rate_limit_reached,
134
+ }
@@ -0,0 +1,278 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Macro Regime Detector - Main Orchestrator
4
+
5
+ Detects structural macro regime transitions (1-2 year horizon) using
6
+ cross-asset ratio analysis on monthly data.
7
+
8
+ 6 Components:
9
+ 1. Market Concentration (RSP/SPY) - 25%
10
+ 2. Yield Curve (10Y-2Y spread) - 20%
11
+ 3. Credit Conditions (HYG/LQD) - 15%
12
+ 4. Size Factor (IWM/SPY) - 15%
13
+ 5. Equity-Bond (SPY/TLT + correlation) - 15%
14
+ 6. Sector Rotation (XLY/XLP) - 10%
15
+
16
+ 5 Regime Classifications:
17
+ - Concentration, Broadening, Contraction, Inflationary, Transitional
18
+
19
+ Usage:
20
+ # With FMP API key in environment:
21
+ export FMP_API_KEY=YOUR_KEY
22
+ python3 macro_regime_detector.py
23
+
24
+ # With explicit API key:
25
+ python3 macro_regime_detector.py --api-key YOUR_KEY
26
+
27
+ # Custom output directory:
28
+ python3 macro_regime_detector.py --output-dir ./reports
29
+
30
+ Output:
31
+ - JSON: macro_regime_YYYY-MM-DD_HHMMSS.json
32
+ - Markdown: macro_regime_YYYY-MM-DD_HHMMSS.md
33
+ """
34
+
35
+ import argparse
36
+ import os
37
+ import sys
38
+ from datetime import datetime
39
+
40
+ # Add parent directory to path for imports
41
+ sys.path.insert(0, os.path.dirname(__file__))
42
+
43
+ from fmp_client import FMPClient
44
+ from calculators.concentration_calculator import calculate_concentration
45
+ from calculators.yield_curve_calculator import calculate_yield_curve
46
+ from calculators.credit_conditions_calculator import calculate_credit_conditions
47
+ from calculators.size_factor_calculator import calculate_size_factor
48
+ from calculators.equity_bond_calculator import calculate_equity_bond
49
+ from calculators.sector_rotation_calculator import calculate_sector_rotation
50
+ from scorer import calculate_composite_score, classify_regime, check_regime_consistency
51
+ from report_generator import generate_json_report, generate_markdown_report
52
+
53
+
54
+ # ETF symbols needed for analysis
55
+ REQUIRED_ETFS = ["RSP", "SPY", "IWM", "TLT", "SHY", "HYG", "LQD", "XLY", "XLP"]
56
+ HISTORY_DAYS = 600 # ~2.4 years of daily data
57
+
58
+
59
+ def parse_arguments():
60
+ parser = argparse.ArgumentParser(
61
+ description="Macro Regime Detector - Cross-Asset Ratio Analysis"
62
+ )
63
+ parser.add_argument(
64
+ "--api-key",
65
+ help="FMP API key (defaults to FMP_API_KEY environment variable)"
66
+ )
67
+ parser.add_argument(
68
+ "--output-dir", default=".",
69
+ help="Output directory for reports (default: current directory)"
70
+ )
71
+ parser.add_argument(
72
+ "--days", type=int, default=HISTORY_DAYS,
73
+ help=f"Days of historical data to fetch (default: {HISTORY_DAYS})"
74
+ )
75
+ return parser.parse_args()
76
+
77
+
78
+ def main():
79
+ args = parse_arguments()
80
+
81
+ print("=" * 70)
82
+ print("Macro Regime Detector")
83
+ print("Cross-Asset Ratio Analysis for Structural Regime Transitions")
84
+ print("=" * 70)
85
+ print()
86
+
87
+ # Initialize FMP client
88
+ try:
89
+ client = FMPClient(api_key=args.api_key)
90
+ print("FMP API client initialized")
91
+ except ValueError as e:
92
+ print(f"ERROR: {e}", file=sys.stderr)
93
+ sys.exit(1)
94
+
95
+ # ================================================================
96
+ # Step 1: Fetch Market Data (9 ETFs + Treasury rates = 10 API calls)
97
+ # ================================================================
98
+ print()
99
+ print("Step 1/4: Fetching Market Data")
100
+ print("-" * 70)
101
+
102
+ historical = {}
103
+ for etf in REQUIRED_ETFS:
104
+ print(f" Fetching {etf} ({args.days} days)...", end=" ", flush=True)
105
+ data = client.get_historical_prices(etf, days=args.days)
106
+ if data and 'historical' in data:
107
+ historical[etf] = data['historical']
108
+ print(f"OK ({len(historical[etf])} bars)")
109
+ else:
110
+ print("FAILED")
111
+ historical[etf] = []
112
+
113
+ # Critical check: need at least SPY
114
+ if not historical.get("SPY"):
115
+ print("ERROR: Cannot proceed without SPY data", file=sys.stderr)
116
+ sys.exit(1)
117
+
118
+ # Fetch treasury rates
119
+ print(f" Fetching Treasury rates...", end=" ", flush=True)
120
+ treasury_rates = client.get_treasury_rates(days=args.days)
121
+ if treasury_rates:
122
+ print(f"OK ({len(treasury_rates)} entries)")
123
+ else:
124
+ print("WARN - Treasury API unavailable, using SHY/TLT fallback")
125
+
126
+ print()
127
+
128
+ # ================================================================
129
+ # Step 2: Calculate 6 Components
130
+ # ================================================================
131
+ print("Step 2/4: Calculating Components")
132
+ print("-" * 70)
133
+
134
+ # Component 1: Market Concentration (25%)
135
+ print(" [1/6] Market Concentration (RSP/SPY)...", end=" ", flush=True)
136
+ comp1 = calculate_concentration(
137
+ rsp_history=historical.get("RSP", []),
138
+ spy_history=historical.get("SPY", []),
139
+ )
140
+ print(f"Score: {comp1['score']} ({comp1['signal'][:60]})")
141
+
142
+ # Component 2: Yield Curve (20%)
143
+ print(" [2/6] Yield Curve (10Y-2Y)...", end=" ", flush=True)
144
+ comp2 = calculate_yield_curve(
145
+ treasury_rates=treasury_rates,
146
+ shy_history=historical.get("SHY", []),
147
+ tlt_history=historical.get("TLT", []),
148
+ )
149
+ print(f"Score: {comp2['score']} ({comp2['signal'][:60]})")
150
+
151
+ # Component 3: Credit Conditions (15%)
152
+ print(" [3/6] Credit Conditions (HYG/LQD)...", end=" ", flush=True)
153
+ comp3 = calculate_credit_conditions(
154
+ hyg_history=historical.get("HYG", []),
155
+ lqd_history=historical.get("LQD", []),
156
+ )
157
+ print(f"Score: {comp3['score']} ({comp3['signal'][:60]})")
158
+
159
+ # Component 4: Size Factor (15%)
160
+ print(" [4/6] Size Factor (IWM/SPY)...", end=" ", flush=True)
161
+ comp4 = calculate_size_factor(
162
+ iwm_history=historical.get("IWM", []),
163
+ spy_history=historical.get("SPY", []),
164
+ )
165
+ print(f"Score: {comp4['score']} ({comp4['signal'][:60]})")
166
+
167
+ # Component 5: Equity-Bond Relationship (15%)
168
+ print(" [5/6] Equity-Bond (SPY/TLT)...", end=" ", flush=True)
169
+ comp5 = calculate_equity_bond(
170
+ spy_history=historical.get("SPY", []),
171
+ tlt_history=historical.get("TLT", []),
172
+ )
173
+ print(f"Score: {comp5['score']} ({comp5['signal'][:60]})")
174
+
175
+ # Component 6: Sector Rotation (10%)
176
+ print(" [6/6] Sector Rotation (XLY/XLP)...", end=" ", flush=True)
177
+ comp6 = calculate_sector_rotation(
178
+ xly_history=historical.get("XLY", []),
179
+ xlp_history=historical.get("XLP", []),
180
+ )
181
+ print(f"Score: {comp6['score']} ({comp6['signal'][:60]})")
182
+
183
+ print()
184
+
185
+ # ================================================================
186
+ # Step 3: Composite Score & Regime Classification
187
+ # ================================================================
188
+ print("Step 3/4: Scoring & Classification")
189
+ print("-" * 70)
190
+
191
+ component_scores = {
192
+ "concentration": comp1["score"],
193
+ "yield_curve": comp2["score"],
194
+ "credit_conditions": comp3["score"],
195
+ "size_factor": comp4["score"],
196
+ "equity_bond": comp5["score"],
197
+ "sector_rotation": comp6["score"],
198
+ }
199
+
200
+ data_availability = {
201
+ "concentration": comp1.get("data_available", False),
202
+ "yield_curve": comp2.get("data_available", False),
203
+ "credit_conditions": comp3.get("data_available", False),
204
+ "size_factor": comp4.get("data_available", False),
205
+ "equity_bond": comp5.get("data_available", False),
206
+ "sector_rotation": comp6.get("data_available", False),
207
+ }
208
+
209
+ composite = calculate_composite_score(component_scores, data_availability)
210
+
211
+ component_results = {
212
+ "concentration": comp1,
213
+ "yield_curve": comp2,
214
+ "credit_conditions": comp3,
215
+ "size_factor": comp4,
216
+ "equity_bond": comp5,
217
+ "sector_rotation": comp6,
218
+ }
219
+
220
+ regime = classify_regime(component_results)
221
+ regime["consistency"] = check_regime_consistency(
222
+ regime["current_regime"], component_results
223
+ )
224
+
225
+ print(f" Composite Score: {composite['composite_score']}/100")
226
+ print(f" Signal Zone: {composite['zone']}")
227
+ print(f" Current Regime: {regime['regime_label']} (confidence: {regime['confidence']})")
228
+ print(f" Transition Probability: {regime['transition_probability']['probability_range']}")
229
+ print(f" Components Signaling: {composite['signaling_components']}/6")
230
+ print()
231
+
232
+ # ================================================================
233
+ # Step 4: Generate Reports
234
+ # ================================================================
235
+ print("Step 4/4: Generating Reports")
236
+ print("-" * 70)
237
+
238
+ analysis = {
239
+ "metadata": {
240
+ "generated_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
241
+ "data_source": "FMP API",
242
+ "history_days": args.days,
243
+ "api_calls": client.get_api_stats(),
244
+ "etfs_analyzed": REQUIRED_ETFS,
245
+ "treasury_data_available": treasury_rates is not None,
246
+ },
247
+ "composite": composite,
248
+ "regime": regime,
249
+ "components": component_results,
250
+ }
251
+
252
+ timestamp = datetime.now().strftime("%Y-%m-%d_%H%M%S")
253
+ json_file = os.path.join(args.output_dir, f"macro_regime_{timestamp}.json")
254
+ md_file = os.path.join(args.output_dir, f"macro_regime_{timestamp}.md")
255
+
256
+ generate_json_report(analysis, json_file)
257
+ generate_markdown_report(analysis, md_file)
258
+
259
+ print()
260
+ print("=" * 70)
261
+ print("Macro Regime Detection Complete")
262
+ print("=" * 70)
263
+ print(f" Composite Score: {composite['composite_score']}/100")
264
+ print(f" Current Regime: {regime['regime_label']}")
265
+ print(f" Transition Probability: {regime['transition_probability']['probability_range']}")
266
+ print(f" JSON Report: {json_file}")
267
+ print(f" Markdown Report: {md_file}")
268
+ print()
269
+
270
+ stats = client.get_api_stats()
271
+ print(f"API Usage:")
272
+ print(f" API calls made: {stats['api_calls_made']}")
273
+ print(f" Cache entries: {stats['cache_entries']}")
274
+ print()
275
+
276
+
277
+ if __name__ == "__main__":
278
+ main()