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,168 @@
1
+ # Theme Detector configuration
2
+ # Cross-sector theme definitions with proxy ETFs and representative stocks.
3
+ # Migrated from DEFAULT_THEMES_CONFIG + ETF_CATALOG inline constants.
4
+
5
+ cross_sector_min_matches: 2
6
+ vertical_min_industries: 3
7
+
8
+ cross_sector:
9
+ - theme_name: "AI & Semiconductors"
10
+ matching_keywords:
11
+ - Semiconductors
12
+ - Semiconductor Equipment & Materials
13
+ - Software - Application
14
+ - Software - Infrastructure
15
+ - Information Technology Services
16
+ - Computer Hardware
17
+ - Electronic Components
18
+ proxy_etfs: [SMH, SOXX, AIQ, BOTZ]
19
+ static_stocks: [NVDA, AVGO, AMD, INTC, QCOM, MRVL, AMAT, LRCX, KLAC, TSM]
20
+ etf_count: 8
21
+
22
+ - theme_name: "Clean Energy & EV"
23
+ matching_keywords:
24
+ - Solar
25
+ - Utilities - Renewable
26
+ - Auto Manufacturers
27
+ - Electrical Equipment & Parts
28
+ - Specialty Chemicals
29
+ proxy_etfs: [ICLN, QCLN, TAN, LIT]
30
+ static_stocks: [ENPH, SEDG, FSLR, RUN, TSLA, RIVN, ALB, PLUG, BE, NEE]
31
+ etf_count: 7
32
+
33
+ - theme_name: "Cybersecurity"
34
+ matching_keywords:
35
+ - Software - Infrastructure
36
+ - Software - Application
37
+ - Information Technology Services
38
+ proxy_etfs: [CIBR, HACK, BUG]
39
+ static_stocks: [CRWD, PANW, FTNT, ZS, S, OKTA, NET, CYBR, QLYS, RPD]
40
+ etf_count: 4
41
+
42
+ - theme_name: "Cloud Computing & SaaS"
43
+ matching_keywords:
44
+ - Software - Application
45
+ - Software - Infrastructure
46
+ - Information Technology Services
47
+ proxy_etfs: [SKYY, WCLD, CLOU]
48
+ static_stocks: [CRM, NOW, SNOW, DDOG, MDB, NET, ZS, HUBS, WDAY, TEAM]
49
+ etf_count: 4
50
+
51
+ - theme_name: "Biotech & Genomics"
52
+ matching_keywords:
53
+ - Biotechnology
54
+ - Drug Manufacturers - General
55
+ - Drug Manufacturers - Specialty & Generic
56
+ - Diagnostics & Research
57
+ proxy_etfs: [XBI, IBB, ARKG]
58
+ static_stocks: [AMGN, GILD, VRTX, REGN, MRNA, BIIB, ILMN, SGEN, ALNY, BMRN]
59
+ etf_count: 5
60
+
61
+ - theme_name: "Infrastructure & Construction"
62
+ matching_keywords:
63
+ - Engineering & Construction
64
+ - Building Products & Equipment
65
+ - Building Materials
66
+ - Specialty Industrial Machinery
67
+ - Farm & Heavy Construction Machinery
68
+ - Infrastructure Operations
69
+ proxy_etfs: [PAVE, IFRA]
70
+ static_stocks: [CAT, DE, VMC, MLM, URI, PWR, EME, J, ACM, FAST]
71
+ etf_count: 3
72
+
73
+ - theme_name: "Gold & Precious Metals"
74
+ matching_keywords:
75
+ - Gold
76
+ - Silver
77
+ - Other Precious Metals & Mining
78
+ proxy_etfs: [GDX, GDXJ, SLV, GLD]
79
+ static_stocks: [NEM, GOLD, AEM, FNV, WPM, RGLD, KGC, AGI, HL, PAAS]
80
+ etf_count: 4
81
+
82
+ - theme_name: "Oil & Gas (Energy)"
83
+ matching_keywords:
84
+ - Oil & Gas E&P
85
+ - Oil & Gas Equipment & Services
86
+ - Oil & Gas Integrated
87
+ - Oil & Gas Midstream
88
+ - Oil & Gas Refining & Marketing
89
+ - Oil & Gas Drilling
90
+ proxy_etfs: [XLE, XOP, OIH]
91
+ static_stocks: [XOM, CVX, COP, EOG, SLB, PXD, MPC, PSX, OXY, DVN]
92
+ etf_count: 5
93
+
94
+ - theme_name: "Financial Services & Banks"
95
+ matching_keywords:
96
+ - Banks - Diversified
97
+ - Banks - Regional
98
+ - Capital Markets
99
+ - Insurance - Diversified
100
+ - Financial Data & Stock Exchanges
101
+ - Asset Management
102
+ proxy_etfs: [XLF, KBE, KRE]
103
+ static_stocks: [JPM, BAC, GS, MS, WFC, C, BLK, SCHW, ICE, CME]
104
+ etf_count: 5
105
+
106
+ - theme_name: "Healthcare & Pharma"
107
+ matching_keywords:
108
+ - Drug Manufacturers - General
109
+ - Medical Devices
110
+ - Medical Instruments & Supplies
111
+ - Healthcare Plans
112
+ - Medical Care Facilities
113
+ proxy_etfs: [XLV, IHI, XBI]
114
+ static_stocks: [UNH, JNJ, LLY, PFE, ABT, TMO, DHR, SYK, ISRG, MDT]
115
+ etf_count: 5
116
+
117
+ - theme_name: "Defense & Aerospace"
118
+ matching_keywords:
119
+ - Aerospace & Defense
120
+ - Communication Equipment
121
+ - Scientific & Technical Instruments
122
+ proxy_etfs: [ITA, PPA, XAR]
123
+ static_stocks: [LMT, RTX, NOC, GD, BA, LHX, HII, TDG, HWM, AXON]
124
+ etf_count: 5
125
+
126
+ - theme_name: "Real Estate & REITs"
127
+ matching_keywords:
128
+ - REIT - Diversified
129
+ - REIT - Industrial
130
+ - REIT - Residential
131
+ - REIT - Retail
132
+ - REIT - Specialty
133
+ - REIT - Office
134
+ - Real Estate - Development
135
+ - Real Estate Services
136
+ proxy_etfs: [VNQ, IYR, XLRE]
137
+ static_stocks: [PLD, AMT, EQIX, CCI, SPG, O, WELL, DLR, PSA, AVB]
138
+ etf_count: 4
139
+
140
+ - theme_name: "Retail & Consumer"
141
+ matching_keywords:
142
+ - Internet Retail
143
+ - Specialty Retail
144
+ - Apparel Retail
145
+ - Discount Stores
146
+ - Home Improvement Retail
147
+ - Department Stores
148
+ proxy_etfs: [XRT, XLY]
149
+ static_stocks: [AMZN, HD, LOW, TJX, COST, WMT, TGT, ROST, BURL, LULU]
150
+ etf_count: 3
151
+
152
+ - theme_name: "Crypto & Blockchain"
153
+ matching_keywords:
154
+ - Capital Markets
155
+ - Software - Infrastructure
156
+ - Financial Data & Stock Exchanges
157
+ proxy_etfs: [BITO, BLOK, BITQ]
158
+ static_stocks: [COIN, MSTR, MARA, RIOT, CLSK, HUT, BITF, HIVE, SQ, PYPL]
159
+ etf_count: 4
160
+
161
+ - theme_name: "Nuclear & Uranium"
162
+ matching_keywords:
163
+ - Uranium
164
+ - Utilities - Independent Power Producers
165
+ - Utilities - Regulated Electric
166
+ proxy_etfs: [URA, URNM, NLR]
167
+ static_stocks: [CCJ, UEC, NXE, DNN, LEU, SMR, UUUU, URG, OKLO, VST]
168
+ etf_count: 3
@@ -0,0 +1,241 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Theme Detector - Uptrend Ratio Client
4
+
5
+ Fetches sector uptrend ratio data from Monty's Uptrend Ratio Dashboard
6
+ (GitHub CSV). No API key required.
7
+
8
+ Data Source: https://github.com/tradermonty/uptrend-dashboard
9
+ """
10
+
11
+ import csv
12
+ import io
13
+ import sys
14
+ from datetime import datetime, timedelta
15
+ from typing import Dict, List, Optional
16
+
17
+ try:
18
+ import requests
19
+ HAS_REQUESTS = True
20
+ except ImportError:
21
+ HAS_REQUESTS = False
22
+
23
+
24
+ TIMESERIES_URL = (
25
+ "https://raw.githubusercontent.com/tradermonty/uptrend-dashboard/"
26
+ "main/data/uptrend_ratio_timeseries.csv"
27
+ )
28
+ SECTOR_SUMMARY_URL = (
29
+ "https://raw.githubusercontent.com/tradermonty/uptrend-dashboard/"
30
+ "main/data/sector_summary.csv"
31
+ )
32
+
33
+ # Map FINVIZ sector names to uptrend worksheet names
34
+ FINVIZ_TO_WORKSHEET = {
35
+ "Technology": "sec_technology",
36
+ "Healthcare": "sec_healthcare",
37
+ "Financial": "sec_financial",
38
+ "Consumer Cyclical": "sec_consumercyclical",
39
+ "Consumer Defensive": "sec_consumerdefensive",
40
+ "Industrials": "sec_industrials",
41
+ "Energy": "sec_energy",
42
+ "Basic Materials": "sec_basicmaterials",
43
+ "Communication Services": "sec_communicationservices",
44
+ "Real Estate": "sec_realestate",
45
+ "Utilities": "sec_utilities",
46
+ }
47
+
48
+ # Reverse mapping for display
49
+ WORKSHEET_TO_DISPLAY = {v: k for k, v in FINVIZ_TO_WORKSHEET.items()}
50
+
51
+
52
+ def _safe_float(value) -> Optional[float]:
53
+ """Convert to float, return None if empty or invalid."""
54
+ if value is None or str(value).strip() == "":
55
+ return None
56
+ try:
57
+ return float(value)
58
+ except (ValueError, TypeError):
59
+ return None
60
+
61
+
62
+ def _calculate_slope(values: List[float]) -> Optional[float]:
63
+ """Calculate slope from a list of values using simple linear regression.
64
+
65
+ Uses least-squares fit: slope = sum((x-xbar)(y-ybar)) / sum((x-xbar)^2)
66
+
67
+ Args:
68
+ values: List of float values (at least 2 required)
69
+
70
+ Returns:
71
+ Slope value or None if insufficient data
72
+ """
73
+ if not values or len(values) < 2:
74
+ return None
75
+
76
+ n = len(values)
77
+ x_mean = (n - 1) / 2.0
78
+ y_mean = sum(values) / n
79
+
80
+ numerator = sum((i - x_mean) * (v - y_mean) for i, v in enumerate(values))
81
+ denominator = sum((i - x_mean) ** 2 for i in range(n))
82
+
83
+ if denominator == 0:
84
+ return 0.0
85
+
86
+ return round(numerator / denominator, 6)
87
+
88
+
89
+ def is_data_stale(latest_date_str: str, threshold_bdays: int = 2) -> bool:
90
+ """Check if the latest data is older than threshold business days.
91
+
92
+ Counts only Mon-Fri as business days, so Friday data is not considered
93
+ stale when checked on Saturday or Sunday.
94
+
95
+ Args:
96
+ latest_date_str: Date string in YYYY-MM-DD format
97
+ threshold_bdays: Maximum acceptable age in business days (default 2)
98
+
99
+ Returns:
100
+ True if data is stale (older than threshold)
101
+ """
102
+ try:
103
+ latest = datetime.strptime(latest_date_str, "%Y-%m-%d")
104
+ now = datetime.now()
105
+ # Compare at date level to avoid intraday time issues
106
+ now_midnight = now.replace(hour=0, minute=0, second=0, microsecond=0)
107
+ bdays = 0
108
+ current = latest
109
+ while current < now_midnight:
110
+ current += timedelta(days=1)
111
+ if current.weekday() < 5: # Mon-Fri
112
+ bdays += 1
113
+ return bdays > threshold_bdays
114
+ except (ValueError, TypeError):
115
+ return True
116
+
117
+
118
+ def fetch_sector_uptrend_data() -> Dict[str, Dict]:
119
+ """Fetch sector uptrend ratio data from timeseries CSV.
120
+
121
+ Downloads the full timeseries, extracts the latest row per sector,
122
+ and calculates slope from the last 5 data points.
123
+
124
+ Returns:
125
+ Dict mapping display sector name to:
126
+ {
127
+ "ratio": float, # Current uptrend ratio (0.0-1.0)
128
+ "ma_10": float, # 10-period moving average
129
+ "slope": float, # Slope from last 5 data points
130
+ "trend": str, # "up" or "down"
131
+ "latest_date": str, # YYYY-MM-DD
132
+ }
133
+ Empty dict on failure.
134
+ """
135
+ if not HAS_REQUESTS:
136
+ print("WARNING: requests library not installed.", file=sys.stderr)
137
+ return {}
138
+
139
+ try:
140
+ response = requests.get(TIMESERIES_URL, timeout=30)
141
+ response.raise_for_status()
142
+ except Exception as e:
143
+ print(f"WARNING: Failed to fetch uptrend timeseries: {e}",
144
+ file=sys.stderr)
145
+ return {}
146
+
147
+ # Parse all rows, grouped by worksheet
148
+ sector_rows: Dict[str, List[Dict]] = {}
149
+ reader = csv.DictReader(io.StringIO(response.text))
150
+ for row in reader:
151
+ ws = row.get("worksheet", "").strip()
152
+ if ws == "all" or not ws.startswith("sec_"):
153
+ continue
154
+ date_str = row.get("date", "").strip()
155
+ ratio = _safe_float(row.get("ratio"))
156
+ ma_10 = _safe_float(row.get("ma_10"))
157
+ slope_csv = _safe_float(row.get("slope"))
158
+ trend = row.get("trend", "").strip()
159
+
160
+ if not date_str or ratio is None:
161
+ continue
162
+
163
+ if ws not in sector_rows:
164
+ sector_rows[ws] = []
165
+ sector_rows[ws].append({
166
+ "date": date_str,
167
+ "ratio": ratio,
168
+ "ma_10": ma_10,
169
+ "slope_csv": slope_csv,
170
+ "trend": trend,
171
+ })
172
+
173
+ # For each sector: sort by date, get latest, calculate slope from last 5
174
+ result = {}
175
+ for ws_name, rows in sector_rows.items():
176
+ rows.sort(key=lambda r: r["date"])
177
+ latest = rows[-1]
178
+ display_name = WORKSHEET_TO_DISPLAY.get(ws_name, ws_name)
179
+
180
+ # Calculate slope from last 5 ratio values
181
+ last_n = rows[-5:] if len(rows) >= 5 else rows
182
+ ratio_values = [r["ratio"] for r in last_n if r["ratio"] is not None]
183
+ calculated_slope = _calculate_slope(ratio_values)
184
+
185
+ # Prefer CSV slope if available, otherwise use calculated
186
+ slope = latest["slope_csv"] if latest["slope_csv"] is not None else calculated_slope
187
+
188
+ result[display_name] = {
189
+ "ratio": latest["ratio"],
190
+ "ma_10": latest["ma_10"],
191
+ "slope": slope,
192
+ "trend": latest["trend"] or ("up" if slope and slope > 0 else "down"),
193
+ "latest_date": latest["date"],
194
+ }
195
+
196
+ return result
197
+
198
+
199
+ def build_summary_from_timeseries(sector_timeseries: Dict[str, Dict]) -> List[Dict]:
200
+ """Build a sector summary list from timeseries data.
201
+
202
+ Fallback when sector_summary.csv is unavailable.
203
+
204
+ Args:
205
+ sector_timeseries: Dict from fetch_sector_uptrend_data()
206
+
207
+ Returns:
208
+ List of dicts with: Sector, Ratio, 10MA, Trend, Slope, Status
209
+ """
210
+ OVERBOUGHT = 0.37
211
+ OVERSOLD = 0.097
212
+
213
+ rows = []
214
+ for sector_name, data in sector_timeseries.items():
215
+ ratio = data.get("ratio")
216
+ status = ("Overbought" if ratio is not None and ratio > OVERBOUGHT else
217
+ "Oversold" if ratio is not None and ratio < OVERSOLD else
218
+ "Normal")
219
+ rows.append({
220
+ "Sector": sector_name,
221
+ "Ratio": ratio,
222
+ "10MA": data.get("ma_10"),
223
+ "Trend": (data.get("trend") or "").capitalize(),
224
+ "Slope": data.get("slope"),
225
+ "Status": status,
226
+ })
227
+ return rows
228
+
229
+
230
+ def get_sector_uptrend_3point(sector_name: str,
231
+ all_data: Dict[str, Dict]) -> Optional[Dict]:
232
+ """Get ratio + ma_10 + slope for a specific sector.
233
+
234
+ Args:
235
+ sector_name: Display name (e.g., "Technology")
236
+ all_data: Output from fetch_sector_uptrend_data()
237
+
238
+ Returns:
239
+ Dict with ratio, ma_10, slope, trend, latest_date. None if not found.
240
+ """
241
+ return all_data.get(sector_name)
@@ -0,0 +1,108 @@
1
+ ---
2
+ name: uptrend-analyzer
3
+ description: 使用Monty的上升趋势比率仪表盘数据分析市场广度,诊断当前市场环境。从5个维度(广度、板块参与度、轮动、动量、历史背景)生成0-100的综合评分。当询问市场广度、上升趋势比率,或市场环境是否支持股票仓位时使用。无需API密钥。
4
+ ---
5
+
6
+ # 上升趋势分析器技能
7
+
8
+ ## 目的
9
+
10
+ 使用Monty的上升趋势比率仪表盘诊断市场广度健康状况,该仪表盘跟踪约2,800只美股和11个板块。生成0-100的综合评分(越高越健康),并提供仓位建议。
11
+
12
+ 与Market Top Detector(基于API的风险评分器)不同,本技能使用免费的CSV数据评估"参与广度"——即市场的上涨是广泛的还是狭窄的。
13
+
14
+ ## 何时使用本技能
15
+
16
+ **英文:**
17
+ - User asks "Is the market breadth healthy?" or "How broad is the rally?"
18
+ - User wants to assess uptrend ratios across sectors
19
+ - User asks about market participation or breadth conditions
20
+ - User needs exposure guidance based on breadth analysis
21
+ - User references Monty's Uptrend Dashboard or uptrend ratios
22
+
23
+ **中文:**
24
+ - "市场广度健康吗?""上涨范围广泛吗?"
25
+ - 想要查看各板块的上升趋势比率
26
+ - 想要诊断市场参与率和广度状况
27
+ - 需要基于广度分析的仓位指导建议
28
+ - 关于Monty的上升趋势仪表盘的问题
29
+
30
+ ## 与Market Top Detector的区别
31
+
32
+ | 方面 | Uptrend Analyzer | Market Top Detector |
33
+ |------|-----------------|-------------------|
34
+ | 评分方向 | 越高越健康 | 越高越危险 |
35
+ | 数据来源 | 免费GitHub CSV | FMP API(付费) |
36
+ | 关注点 | 广度参与度 | 顶部形成风险 |
37
+ | API密钥 | 不需要 | 需要(FMP) |
38
+ | 方法论 | Monty上升趋势比率 | O'Neil/Minervini/Monty |
39
+
40
+ ---
41
+
42
+ ## 执行工作流
43
+
44
+ ### 第一阶段:执行Python脚本
45
+
46
+ 运行分析脚本(无需API密钥):
47
+
48
+ ```bash
49
+ python3 skills/uptrend-analyzer/scripts/uptrend_analyzer.py
50
+ ```
51
+
52
+ 脚本将执行以下操作:
53
+ 1. 从Monty的GitHub仓库下载CSV数据
54
+ 2. 计算5个维度的评分
55
+ 3. 生成综合评分和报告
56
+
57
+ ### 第二阶段:展示结果
58
+
59
+ 向用户展示生成的Markdown报告,重点说明:
60
+ - 综合评分和区域分类
61
+ - 仓位建议(满仓/正常/减仓/防御/保存资本)
62
+ - 板块热力图,显示最强和最弱的板块
63
+ - 关键动量和轮动信号
64
+
65
+ ---
66
+
67
+ ## 5维度评分系统
68
+
69
+ | # | 维度 | 权重 | 关键信号 |
70
+ |---|------|------|----------|
71
+ | 1 | 市场广度(整体) | **30%** | 比率水平 + 趋势方向 |
72
+ | 2 | 板块参与度 | **25%** | 处于上升趋势的板块数量 + 比率离散度 |
73
+ | 3 | 板块轮动 | **15%** | 周期性 vs 防御性板块平衡 |
74
+ | 4 | 动量 | **20%** | 斜率方向 + 加速度 |
75
+ | 5 | 历史背景 | **10%** | 在历史中的百分位排名 |
76
+
77
+ ## 评分区域
78
+
79
+ | 评分 | 区域 | 仓位建议 |
80
+ |------|------|----------|
81
+ | 80-100 | 强牛市 | 满仓(100%) |
82
+ | 60-79 | 牛市 | 正常仓位(80-100%) |
83
+ | 40-59 | 中性 | 减仓(60-80%) |
84
+ | 20-39 | 谨慎 | 防御性(30-60%) |
85
+ | 0-19 | 熊市 | 保存资本(0-30%) |
86
+
87
+ ---
88
+
89
+ ## API要求
90
+
91
+ **必需:** 无(使用免费的GitHub CSV数据)
92
+
93
+ ## 输出文件
94
+
95
+ - JSON: `uptrend_analysis_YYYY-MM-DD_HHMMSS.json`
96
+ - Markdown: `uptrend_analysis_YYYY-MM-DD_HHMMSS.md`
97
+
98
+ ## 参考文档
99
+
100
+ ### `references/uptrend_methodology.md`
101
+ - 上升趋势比率的定义和阈值
102
+ - 5维度评分方法论
103
+ - 板块分类(周期性/防御性/大宗商品)
104
+ - 历史校准说明
105
+
106
+ ### 何时加载参考文档
107
+ - **首次使用:** 加载 `uptrend_methodology.md` 以全面理解框架
108
+ - **常规执行:** 无需参考文档——脚本会处理评分