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