market-data-analyzer 2.0.0

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.

Potentially problematic release.


This version of market-data-analyzer might be problematic. Click here for more details.

Files changed (58) hide show
  1. package/README.md +159 -0
  2. package/dist/index.d.ts +12 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +267 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/tools/analyze_portfolio.d.ts +14 -0
  7. package/dist/tools/analyze_portfolio.d.ts.map +1 -0
  8. package/dist/tools/analyze_portfolio.js +155 -0
  9. package/dist/tools/analyze_portfolio.js.map +1 -0
  10. package/dist/tools/analyze_stock.d.ts +8 -0
  11. package/dist/tools/analyze_stock.d.ts.map +1 -0
  12. package/dist/tools/analyze_stock.js +211 -0
  13. package/dist/tools/analyze_stock.js.map +1 -0
  14. package/dist/tools/compare_assets.d.ts +8 -0
  15. package/dist/tools/compare_assets.d.ts.map +1 -0
  16. package/dist/tools/compare_assets.js +138 -0
  17. package/dist/tools/compare_assets.js.map +1 -0
  18. package/dist/tools/crypto_analysis.d.ts +8 -0
  19. package/dist/tools/crypto_analysis.d.ts.map +1 -0
  20. package/dist/tools/crypto_analysis.js +192 -0
  21. package/dist/tools/crypto_analysis.js.map +1 -0
  22. package/dist/tools/market_overview.d.ts +8 -0
  23. package/dist/tools/market_overview.d.ts.map +1 -0
  24. package/dist/tools/market_overview.js +223 -0
  25. package/dist/tools/market_overview.js.map +1 -0
  26. package/dist/tools/screen_stocks.d.ts +19 -0
  27. package/dist/tools/screen_stocks.d.ts.map +1 -0
  28. package/dist/tools/screen_stocks.js +122 -0
  29. package/dist/tools/screen_stocks.js.map +1 -0
  30. package/dist/types.d.ts +158 -0
  31. package/dist/types.d.ts.map +1 -0
  32. package/dist/types.js +5 -0
  33. package/dist/types.js.map +1 -0
  34. package/dist/utils/api.d.ts +37 -0
  35. package/dist/utils/api.d.ts.map +1 -0
  36. package/dist/utils/api.js +228 -0
  37. package/dist/utils/api.js.map +1 -0
  38. package/dist/utils/cache.d.ts +20 -0
  39. package/dist/utils/cache.d.ts.map +1 -0
  40. package/dist/utils/cache.js +52 -0
  41. package/dist/utils/cache.js.map +1 -0
  42. package/dist/utils/math.d.ts +30 -0
  43. package/dist/utils/math.d.ts.map +1 -0
  44. package/dist/utils/math.js +300 -0
  45. package/dist/utils/math.js.map +1 -0
  46. package/package.json +30 -0
  47. package/src/index.ts +329 -0
  48. package/src/tools/analyze_portfolio.ts +204 -0
  49. package/src/tools/analyze_stock.ts +204 -0
  50. package/src/tools/compare_assets.ts +181 -0
  51. package/src/tools/crypto_analysis.ts +221 -0
  52. package/src/tools/market_overview.ts +236 -0
  53. package/src/tools/screen_stocks.ts +154 -0
  54. package/src/types.ts +175 -0
  55. package/src/utils/api.ts +262 -0
  56. package/src/utils/cache.ts +65 -0
  57. package/src/utils/math.ts +332 -0
  58. package/tsconfig.json +19 -0
@@ -0,0 +1,211 @@
1
+ /**
2
+ * analyze_stock -- Deep analysis of a stock symbol.
3
+ *
4
+ * Fetches live data from Yahoo Finance, computes SMA 20/50/200, RSI,
5
+ * MACD, and support/resistance levels.
6
+ */
7
+ import { yahooQuote, yahooChart } from "../utils/api.js";
8
+ import { sma, rsi, macd, lastValue, findSupportResistance, formatCurrency, formatVolume, } from "../utils/math.js";
9
+ export async function handleAnalyzeStock(symbol) {
10
+ // Fetch quote and 6-month daily chart in parallel
11
+ const [quotes, chart] = await Promise.all([
12
+ yahooQuote([symbol]),
13
+ yahooChart(symbol, "6mo", "1d"),
14
+ ]);
15
+ const quote = quotes[0];
16
+ if (!quote || !quote.regularMarketPrice) {
17
+ throw new Error(`No quote data found for symbol "${symbol}". Verify the ticker is correct.`);
18
+ }
19
+ if (chart.length < 5) {
20
+ throw new Error(`Insufficient price history for "${symbol}" (got ${chart.length} data points).`);
21
+ }
22
+ const closes = chart.map((p) => p.close);
23
+ const highs = chart.map((p) => p.high);
24
+ const lows = chart.map((p) => p.low);
25
+ const currentPrice = quote.regularMarketPrice;
26
+ // Compute indicators
27
+ const sma20 = lastValue(sma(closes, Math.min(20, closes.length)));
28
+ const sma50 = closes.length >= 50 ? lastValue(sma(closes, 50)) : null;
29
+ const sma200 = closes.length >= 200 ? lastValue(sma(closes, 200)) : null;
30
+ const rsi14 = closes.length >= 15 ? lastValue(rsi(closes, 14)) : null;
31
+ let macdResult = null;
32
+ if (closes.length >= 35) {
33
+ const m = macd(closes);
34
+ const mLine = lastValue(m.line);
35
+ const mSignal = lastValue(m.signal);
36
+ const mHist = lastValue(m.histogram);
37
+ if (mLine !== null && mSignal !== null && mHist !== null) {
38
+ macdResult = { line: mLine, signal: mSignal, histogram: mHist };
39
+ }
40
+ }
41
+ // Support & resistance
42
+ const sr = findSupportResistance(highs, lows, closes);
43
+ // Build output
44
+ const lines = [];
45
+ const name = quote.longName ?? quote.shortName ?? symbol;
46
+ const change = quote.regularMarketChange ?? 0;
47
+ const changePct = quote.regularMarketChangePercent ?? 0;
48
+ lines.push(`# Stock Analysis: ${name} (${symbol})`);
49
+ lines.push("");
50
+ // Price overview
51
+ lines.push("## Price Overview");
52
+ lines.push("");
53
+ lines.push("| Metric | Value |");
54
+ lines.push("|--------|-------|");
55
+ lines.push(`| Current Price | $${currentPrice.toFixed(2)} |`);
56
+ lines.push(`| Change | ${change >= 0 ? "+" : ""}$${change.toFixed(2)} (${changePct >= 0 ? "+" : ""}${changePct.toFixed(2)}%) |`);
57
+ lines.push(`| Day Range | $${(quote.regularMarketDayLow ?? 0).toFixed(2)} - $${(quote.regularMarketDayHigh ?? 0).toFixed(2)} |`);
58
+ lines.push(`| 52-Week Range | $${(quote.fiftyTwoWeekLow ?? 0).toFixed(2)} - $${(quote.fiftyTwoWeekHigh ?? 0).toFixed(2)} |`);
59
+ lines.push(`| Volume | ${formatVolume(quote.regularMarketVolume ?? 0)} |`);
60
+ lines.push(`| Market Cap | ${formatCurrency(quote.marketCap ?? 0)} |`);
61
+ if (quote.trailingPE)
62
+ lines.push(`| P/E (Trailing) | ${quote.trailingPE.toFixed(2)} |`);
63
+ if (quote.forwardPE)
64
+ lines.push(`| P/E (Forward) | ${quote.forwardPE.toFixed(2)} |`);
65
+ if (quote.trailingAnnualDividendYield) {
66
+ lines.push(`| Dividend Yield | ${(quote.trailingAnnualDividendYield * 100).toFixed(2)}% |`);
67
+ }
68
+ lines.push("");
69
+ // Moving averages
70
+ lines.push("## Moving Averages");
71
+ lines.push("");
72
+ lines.push("| Indicator | Value | Signal |");
73
+ lines.push("|-----------|-------|--------|");
74
+ if (sma20 !== null) {
75
+ const sig = currentPrice > sma20 ? "BULLISH (price above)" : currentPrice < sma20 ? "BEARISH (price below)" : "NEUTRAL";
76
+ lines.push(`| SMA(20) | $${sma20.toFixed(2)} | ${sig} |`);
77
+ }
78
+ if (sma50 !== null) {
79
+ const sig = currentPrice > sma50 ? "BULLISH (price above)" : currentPrice < sma50 ? "BEARISH (price below)" : "NEUTRAL";
80
+ lines.push(`| SMA(50) | $${sma50.toFixed(2)} | ${sig} |`);
81
+ }
82
+ if (sma200 !== null) {
83
+ const sig = currentPrice > sma200 ? "BULLISH (price above)" : currentPrice < sma200 ? "BEARISH (price below)" : "NEUTRAL";
84
+ lines.push(`| SMA(200) | $${sma200.toFixed(2)} | ${sig} |`);
85
+ }
86
+ if (quote.fiftyDayAverage) {
87
+ lines.push(`| Yahoo 50-Day Avg | $${quote.fiftyDayAverage.toFixed(2)} | -- |`);
88
+ }
89
+ if (quote.twoHundredDayAverage) {
90
+ lines.push(`| Yahoo 200-Day Avg | $${quote.twoHundredDayAverage.toFixed(2)} | -- |`);
91
+ }
92
+ // Golden/Death cross
93
+ if (sma50 !== null && sma200 !== null) {
94
+ if (sma50 > sma200) {
95
+ lines.push("");
96
+ lines.push("**Golden Cross**: 50-day SMA is above 200-day SMA -- historically bullish signal.");
97
+ }
98
+ else if (sma50 < sma200) {
99
+ lines.push("");
100
+ lines.push("**Death Cross**: 50-day SMA is below 200-day SMA -- historically bearish signal.");
101
+ }
102
+ }
103
+ lines.push("");
104
+ // RSI
105
+ if (rsi14 !== null) {
106
+ lines.push("## RSI (14-period)");
107
+ lines.push("");
108
+ lines.push(`**RSI: ${rsi14.toFixed(1)}**`);
109
+ lines.push("");
110
+ if (rsi14 >= 70) {
111
+ lines.push("Interpretation: **OVERBOUGHT** (RSI >= 70). The stock may be overvalued and due for a pullback.");
112
+ }
113
+ else if (rsi14 <= 30) {
114
+ lines.push("Interpretation: **OVERSOLD** (RSI <= 30). The stock may be undervalued and due for a bounce.");
115
+ }
116
+ else if (rsi14 >= 60) {
117
+ lines.push("Interpretation: Bullish momentum (RSI in 60-70 range).");
118
+ }
119
+ else if (rsi14 <= 40) {
120
+ lines.push("Interpretation: Bearish momentum (RSI in 30-40 range).");
121
+ }
122
+ else {
123
+ lines.push("Interpretation: Neutral momentum (RSI in 40-60 range).");
124
+ }
125
+ lines.push("");
126
+ }
127
+ // MACD
128
+ if (macdResult) {
129
+ lines.push("## MACD (12, 26, 9)");
130
+ lines.push("");
131
+ lines.push("| Component | Value |");
132
+ lines.push("|-----------|-------|");
133
+ lines.push(`| MACD Line | ${macdResult.line.toFixed(4)} |`);
134
+ lines.push(`| Signal Line | ${macdResult.signal.toFixed(4)} |`);
135
+ lines.push(`| Histogram | ${macdResult.histogram.toFixed(4)} |`);
136
+ lines.push("");
137
+ if (macdResult.histogram > 0) {
138
+ lines.push("Interpretation: **BULLISH** -- MACD is above signal line, positive momentum.");
139
+ }
140
+ else {
141
+ lines.push("Interpretation: **BEARISH** -- MACD is below signal line, negative momentum.");
142
+ }
143
+ lines.push("");
144
+ }
145
+ // Support & Resistance
146
+ lines.push("## Support & Resistance Levels");
147
+ lines.push("");
148
+ if (sr.resistance.length > 0) {
149
+ lines.push("**Resistance:**");
150
+ for (const r of sr.resistance) {
151
+ const distPct = ((r - currentPrice) / currentPrice * 100).toFixed(1);
152
+ lines.push(`- $${r.toFixed(2)} (+${distPct}% from current)`);
153
+ }
154
+ }
155
+ else {
156
+ lines.push("**Resistance:** No clear resistance levels identified in recent data.");
157
+ }
158
+ lines.push("");
159
+ if (sr.support.length > 0) {
160
+ lines.push("**Support:**");
161
+ for (const s of sr.support) {
162
+ const distPct = ((currentPrice - s) / currentPrice * 100).toFixed(1);
163
+ lines.push(`- $${s.toFixed(2)} (-${distPct}% from current)`);
164
+ }
165
+ }
166
+ else {
167
+ lines.push("**Support:** No clear support levels identified in recent data.");
168
+ }
169
+ lines.push("");
170
+ // Signal summary
171
+ lines.push("## Signal Summary");
172
+ lines.push("");
173
+ let bullishCount = 0;
174
+ let bearishCount = 0;
175
+ if (sma20 !== null) {
176
+ if (currentPrice > sma20)
177
+ bullishCount++;
178
+ else
179
+ bearishCount++;
180
+ }
181
+ if (sma50 !== null) {
182
+ if (currentPrice > sma50)
183
+ bullishCount++;
184
+ else
185
+ bearishCount++;
186
+ }
187
+ if (sma200 !== null) {
188
+ if (currentPrice > sma200)
189
+ bullishCount++;
190
+ else
191
+ bearishCount++;
192
+ }
193
+ if (rsi14 !== null) {
194
+ if (rsi14 < 30)
195
+ bullishCount++;
196
+ else if (rsi14 > 70)
197
+ bearishCount++;
198
+ }
199
+ if (macdResult) {
200
+ if (macdResult.histogram > 0)
201
+ bullishCount++;
202
+ else
203
+ bearishCount++;
204
+ }
205
+ const total = bullishCount + bearishCount;
206
+ const consensus = bullishCount > bearishCount ? "BULLISH" : bearishCount > bullishCount ? "BEARISH" : "NEUTRAL";
207
+ lines.push(`Bullish signals: ${bullishCount}/${total} | Bearish signals: ${bearishCount}/${total}`);
208
+ lines.push(`**Overall technical consensus: ${consensus}**`);
209
+ return lines.join("\n");
210
+ }
211
+ //# sourceMappingURL=analyze_stock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze_stock.js","sourceRoot":"","sources":["../../src/tools/analyze_stock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * compare_assets -- Compare 2-5 assets side by side.
3
+ *
4
+ * Fetches price history from Yahoo Finance, computes returns, volatility,
5
+ * correlation, and Sharpe ratio approximation.
6
+ */
7
+ export declare function handleCompareAssets(symbols: string[], period?: string): Promise<string>;
8
+ //# sourceMappingURL=compare_assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare_assets.d.ts","sourceRoot":"","sources":["../../src/tools/compare_assets.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,GAAE,MAAc,GACrB,OAAO,CAAC,MAAM,CAAC,CA+JjB"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * compare_assets -- Compare 2-5 assets side by side.
3
+ *
4
+ * Fetches price history from Yahoo Finance, computes returns, volatility,
5
+ * correlation, and Sharpe ratio approximation.
6
+ */
7
+ import { yahooChart, yahooQuote } from "../utils/api.js";
8
+ import { pricesToReturns, mean, stdDev, correlation, maxDrawdown, sharpeRatio, formatPct, } from "../utils/math.js";
9
+ export async function handleCompareAssets(symbols, period = "6mo") {
10
+ if (symbols.length < 2 || symbols.length > 5) {
11
+ throw new Error("Compare requires 2-5 symbols.");
12
+ }
13
+ // Fetch chart data and quotes in parallel
14
+ const [charts, quotes] = await Promise.all([
15
+ Promise.all(symbols.map((s) => yahooChart(s, period, "1d"))),
16
+ yahooQuote(symbols),
17
+ ]);
18
+ const quoteMap = new Map(quotes.map((q) => [q.symbol, q]));
19
+ // Build per-asset metrics
20
+ const TRADING_DAYS = 252;
21
+ const assetMetrics = [];
22
+ for (let i = 0; i < symbols.length; i++) {
23
+ const sym = symbols[i];
24
+ const chart = charts[i];
25
+ const quote = quoteMap.get(sym);
26
+ if (chart.length < 5) {
27
+ throw new Error(`Insufficient data for ${sym} (got ${chart.length} points). Try a longer period.`);
28
+ }
29
+ const closes = chart.map((p) => p.close);
30
+ const returns = pricesToReturns(closes);
31
+ const avgDailyReturn = mean(returns);
32
+ const dailyVol = stdDev(returns);
33
+ const totalReturn = (closes[closes.length - 1] - closes[0]) / closes[0];
34
+ assetMetrics.push({
35
+ symbol: sym,
36
+ name: quote?.shortName ?? quote?.longName ?? sym,
37
+ currentPrice: quote?.regularMarketPrice ?? closes[closes.length - 1],
38
+ totalReturn,
39
+ annualizedReturn: avgDailyReturn * TRADING_DAYS,
40
+ volatility: dailyVol * Math.sqrt(TRADING_DAYS),
41
+ sharpe: sharpeRatio(returns),
42
+ mdd: maxDrawdown(closes),
43
+ returns,
44
+ });
45
+ }
46
+ // Correlation matrix
47
+ const correlations = [];
48
+ for (let i = 0; i < assetMetrics.length; i++) {
49
+ for (let j = i + 1; j < assetMetrics.length; j++) {
50
+ correlations.push({
51
+ a: assetMetrics[i].symbol,
52
+ b: assetMetrics[j].symbol,
53
+ corr: correlation(assetMetrics[i].returns, assetMetrics[j].returns),
54
+ });
55
+ }
56
+ }
57
+ // Format output
58
+ const lines = [];
59
+ lines.push("# Asset Comparison");
60
+ lines.push("");
61
+ lines.push(`**Assets:** ${symbols.join(", ")}`);
62
+ lines.push(`**Period:** ${period}`);
63
+ lines.push("");
64
+ // Performance table (transposed)
65
+ lines.push("## Performance Comparison");
66
+ lines.push("");
67
+ lines.push("| Metric | " + assetMetrics.map((a) => a.symbol).join(" | ") + " |");
68
+ lines.push("| --- | " + assetMetrics.map(() => "---").join(" | ") + " |");
69
+ lines.push("| Name | " + assetMetrics.map((a) => a.name.slice(0, 20)).join(" | ") + " |");
70
+ lines.push("| Current Price | " + assetMetrics.map((a) => `$${a.currentPrice.toFixed(2)}`).join(" | ") + " |");
71
+ lines.push("| Total Return | " + assetMetrics.map((a) => formatPct(a.totalReturn)).join(" | ") + " |");
72
+ lines.push("| Annualized Return | " + assetMetrics.map((a) => formatPct(a.annualizedReturn)).join(" | ") + " |");
73
+ lines.push("| Volatility (Ann.) | " + assetMetrics.map((a) => formatPct(a.volatility)).join(" | ") + " |");
74
+ lines.push("| Sharpe Ratio | " + assetMetrics.map((a) => a.sharpe.toFixed(3)).join(" | ") + " |");
75
+ lines.push("| Max Drawdown | " + assetMetrics.map((a) => formatPct(-a.mdd)).join(" | ") + " |");
76
+ lines.push("");
77
+ // Rankings
78
+ lines.push("## Rankings");
79
+ lines.push("");
80
+ const byReturn = [...assetMetrics].sort((a, b) => b.totalReturn - a.totalReturn);
81
+ const bySharpe = [...assetMetrics].sort((a, b) => b.sharpe - a.sharpe);
82
+ const byVol = [...assetMetrics].sort((a, b) => a.volatility - b.volatility);
83
+ const byDD = [...assetMetrics].sort((a, b) => a.mdd - b.mdd);
84
+ lines.push("| Rank | Best Return | Best Sharpe | Lowest Vol | Smallest DD |");
85
+ lines.push("|------|-------------|-------------|------------|-------------|");
86
+ for (let i = 0; i < assetMetrics.length; i++) {
87
+ lines.push(`| ${i + 1} | ${byReturn[i].symbol} (${formatPct(byReturn[i].totalReturn)}) | ${bySharpe[i].symbol} (${bySharpe[i].sharpe.toFixed(3)}) | ${byVol[i].symbol} (${formatPct(byVol[i].volatility)}) | ${byDD[i].symbol} (${formatPct(-byDD[i].mdd)}) |`);
88
+ }
89
+ lines.push("");
90
+ // Correlation matrix
91
+ lines.push("## Correlation Matrix");
92
+ lines.push("");
93
+ const syms = assetMetrics.map((a) => a.symbol);
94
+ lines.push("| | " + syms.join(" | ") + " |");
95
+ lines.push("| --- | " + syms.map(() => "---").join(" | ") + " |");
96
+ for (let i = 0; i < syms.length; i++) {
97
+ const row = [syms[i]];
98
+ for (let j = 0; j < syms.length; j++) {
99
+ if (i === j) {
100
+ row.push("1.000");
101
+ }
102
+ else {
103
+ const pair = correlations.find((c) => (c.a === syms[i] && c.b === syms[j]) ||
104
+ (c.a === syms[j] && c.b === syms[i]));
105
+ row.push(pair ? pair.corr.toFixed(3) : "N/A");
106
+ }
107
+ }
108
+ lines.push("| " + row.join(" | ") + " |");
109
+ }
110
+ lines.push("");
111
+ // Correlation insight
112
+ const avgCorr = correlations.length > 0
113
+ ? mean(correlations.map((c) => c.corr))
114
+ : 0;
115
+ lines.push(`**Average correlation:** ${avgCorr.toFixed(3)}`);
116
+ if (avgCorr > 0.7) {
117
+ lines.push("These assets are highly correlated -- limited diversification benefit.");
118
+ }
119
+ else if (avgCorr > 0.3) {
120
+ lines.push("Moderate correlation -- some diversification benefit.");
121
+ }
122
+ else if (avgCorr > -0.1) {
123
+ lines.push("Low correlation -- good diversification potential.");
124
+ }
125
+ else {
126
+ lines.push("Negative correlation -- excellent diversification. These assets tend to move in opposite directions.");
127
+ }
128
+ lines.push("");
129
+ // Summary
130
+ lines.push("## Summary");
131
+ lines.push("");
132
+ lines.push(`- **Highest return:** ${byReturn[0].symbol} (${formatPct(byReturn[0].totalReturn)})`);
133
+ lines.push(`- **Best risk-adjusted:** ${bySharpe[0].symbol} (Sharpe: ${bySharpe[0].sharpe.toFixed(3)})`);
134
+ lines.push(`- **Lowest volatility:** ${byVol[0].symbol} (${formatPct(byVol[0].volatility)})`);
135
+ lines.push(`- **Smallest drawdown:** ${byDD[0].symbol} (${formatPct(-byDD[0].mdd)})`);
136
+ return lines.join("\n");
137
+ }
138
+ //# sourceMappingURL=compare_assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare_assets.js","sourceRoot":"","sources":["../../src/tools/compare_assets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * crypto_analysis -- Crypto-specific analysis using CoinGecko free API.
3
+ *
4
+ * Provides price, 24h volume, market dominance, fear/greed index
5
+ * approximation, and on-chain metrics where available.
6
+ */
7
+ export declare function handleCryptoAnalysis(symbol: string): Promise<string>;
8
+ //# sourceMappingURL=crypto_analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto_analysis.d.ts","sourceRoot":"","sources":["../../src/tools/crypto_analysis.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyH1E"}
@@ -0,0 +1,192 @@
1
+ /**
2
+ * crypto_analysis -- Crypto-specific analysis using CoinGecko free API.
3
+ *
4
+ * Provides price, 24h volume, market dominance, fear/greed index
5
+ * approximation, and on-chain metrics where available.
6
+ */
7
+ import { coingeckoMarkets, coingeckoGlobal, symbolToCoinGeckoId, } from "../utils/api.js";
8
+ import { formatCurrency, formatPct } from "../utils/math.js";
9
+ export async function handleCryptoAnalysis(symbol) {
10
+ const coinId = symbolToCoinGeckoId(symbol);
11
+ // Fetch coin data and global data in parallel
12
+ const [markets, globalData] = await Promise.all([
13
+ coingeckoMarkets([coinId]),
14
+ coingeckoGlobal(),
15
+ ]);
16
+ const coin = markets[0];
17
+ if (!coin) {
18
+ throw new Error(`No data found for "${symbol}" (CoinGecko ID: "${coinId}"). ` +
19
+ `Try using the full coin name (e.g., "bitcoin", "ethereum") or a common ticker (BTC, ETH, SOL).`);
20
+ }
21
+ // Fear & Greed approximation based on available market data
22
+ const fearGreed = approximateFearGreed(coin, globalData);
23
+ // Dominance
24
+ const dominance = globalData.market_cap_percentage?.[coin.symbol.toLowerCase()] ?? null;
25
+ // Format output
26
+ const lines = [];
27
+ lines.push(`# Crypto Analysis: ${coin.name} (${coin.symbol.toUpperCase()})`);
28
+ lines.push("");
29
+ // Price overview
30
+ lines.push("## Price Overview");
31
+ lines.push("");
32
+ lines.push("| Metric | Value |");
33
+ lines.push("|--------|-------|");
34
+ lines.push(`| Current Price | $${coin.current_price.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 8 })} |`);
35
+ lines.push(`| 24h Change | ${coin.price_change_24h >= 0 ? "+" : ""}$${coin.price_change_24h.toFixed(2)} (${coin.price_change_percentage_24h >= 0 ? "+" : ""}${coin.price_change_percentage_24h.toFixed(2)}%) |`);
36
+ if (coin.price_change_percentage_7d_in_currency != null) {
37
+ lines.push(`| 7d Change | ${formatPct(coin.price_change_percentage_7d_in_currency / 100)} |`);
38
+ }
39
+ if (coin.price_change_percentage_30d_in_currency != null) {
40
+ lines.push(`| 30d Change | ${formatPct(coin.price_change_percentage_30d_in_currency / 100)} |`);
41
+ }
42
+ lines.push(`| 24h High | $${coin.high_24h.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 8 })} |`);
43
+ lines.push(`| 24h Low | $${coin.low_24h.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 8 })} |`);
44
+ lines.push("");
45
+ // Market metrics
46
+ lines.push("## Market Metrics");
47
+ lines.push("");
48
+ lines.push("| Metric | Value |");
49
+ lines.push("|--------|-------|");
50
+ lines.push(`| Market Cap | ${formatCurrency(coin.market_cap)} |`);
51
+ lines.push(`| Market Cap Rank | #${coin.market_cap_rank} |`);
52
+ lines.push(`| 24h Volume | ${formatCurrency(coin.total_volume)} |`);
53
+ lines.push(`| Volume/Market Cap | ${((coin.total_volume / coin.market_cap) * 100).toFixed(2)}% |`);
54
+ if (dominance !== null) {
55
+ lines.push(`| Market Dominance | ${dominance.toFixed(2)}% |`);
56
+ }
57
+ lines.push(`| Market Cap Change (24h) | ${coin.market_cap_change_percentage_24h >= 0 ? "+" : ""}${coin.market_cap_change_percentage_24h.toFixed(2)}% |`);
58
+ lines.push("");
59
+ // Supply info
60
+ lines.push("## Supply");
61
+ lines.push("");
62
+ lines.push("| Metric | Value |");
63
+ lines.push("|--------|-------|");
64
+ lines.push(`| Circulating Supply | ${coin.circulating_supply.toLocaleString("en-US")} |`);
65
+ if (coin.total_supply != null) {
66
+ lines.push(`| Total Supply | ${coin.total_supply.toLocaleString("en-US")} |`);
67
+ }
68
+ if (coin.max_supply != null) {
69
+ lines.push(`| Max Supply | ${coin.max_supply.toLocaleString("en-US")} |`);
70
+ const pctMined = (coin.circulating_supply / coin.max_supply * 100).toFixed(1);
71
+ lines.push(`| % Mined/Released | ${pctMined}% |`);
72
+ }
73
+ lines.push("");
74
+ // All-time records
75
+ lines.push("## All-Time Records");
76
+ lines.push("");
77
+ lines.push("| Metric | Value |");
78
+ lines.push("|--------|-------|");
79
+ lines.push(`| All-Time High | $${coin.ath.toLocaleString("en-US", { minimumFractionDigits: 2 })} |`);
80
+ lines.push(`| ATH Change | ${coin.ath_change_percentage.toFixed(2)}% |`);
81
+ lines.push(`| ATH Date | ${new Date(coin.ath_date).toLocaleDateString("en-US")} |`);
82
+ lines.push(`| All-Time Low | $${coin.atl.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 8 })} |`);
83
+ lines.push(`| ATL Change | +${coin.atl_change_percentage.toFixed(2)}% |`);
84
+ lines.push(`| ATL Date | ${new Date(coin.atl_date).toLocaleDateString("en-US")} |`);
85
+ lines.push("");
86
+ // Fear & Greed approximation
87
+ lines.push("## Market Sentiment (Approximation)");
88
+ lines.push("");
89
+ lines.push(`**Fear & Greed: ${fearGreed.score}/100 -- ${fearGreed.label}**`);
90
+ lines.push("");
91
+ lines.push("Factors considered:");
92
+ for (const factor of fearGreed.factors) {
93
+ lines.push(`- ${factor}`);
94
+ }
95
+ lines.push("");
96
+ lines.push("*Note: This is an approximation based on available market data, not the official Crypto Fear & Greed Index.*");
97
+ lines.push("");
98
+ // Global crypto market context
99
+ lines.push("## Global Crypto Market");
100
+ lines.push("");
101
+ const totalMcap = globalData.total_market_cap?.usd ?? 0;
102
+ const totalVol = globalData.total_volume?.usd ?? 0;
103
+ const btcDom = globalData.market_cap_percentage?.btc ?? 0;
104
+ const ethDom = globalData.market_cap_percentage?.eth ?? 0;
105
+ lines.push("| Metric | Value |");
106
+ lines.push("|--------|-------|");
107
+ lines.push(`| Total Crypto Market Cap | ${formatCurrency(totalMcap)} |`);
108
+ lines.push(`| Total 24h Volume | ${formatCurrency(totalVol)} |`);
109
+ lines.push(`| BTC Dominance | ${btcDom.toFixed(1)}% |`);
110
+ lines.push(`| ETH Dominance | ${ethDom.toFixed(1)}% |`);
111
+ lines.push(`| Active Cryptocurrencies | ${globalData.active_cryptocurrencies?.toLocaleString() ?? "N/A"} |`);
112
+ lines.push(`| Market Cap Change (24h) | ${globalData.market_cap_change_percentage_24h_usd >= 0 ? "+" : ""}${globalData.market_cap_change_percentage_24h_usd.toFixed(2)}% |`);
113
+ return lines.join("\n");
114
+ }
115
+ function approximateFearGreed(coin, global) {
116
+ let score = 50; // Start neutral
117
+ const factors = [];
118
+ // Price momentum (24h change)
119
+ const change24h = coin.price_change_percentage_24h;
120
+ if (change24h > 5) {
121
+ score += 15;
122
+ factors.push(`Strong 24h gain (${change24h.toFixed(1)}%) -- greed signal`);
123
+ }
124
+ else if (change24h > 2) {
125
+ score += 8;
126
+ factors.push(`Positive 24h movement (${change24h.toFixed(1)}%) -- mild greed`);
127
+ }
128
+ else if (change24h < -5) {
129
+ score -= 15;
130
+ factors.push(`Sharp 24h decline (${change24h.toFixed(1)}%) -- fear signal`);
131
+ }
132
+ else if (change24h < -2) {
133
+ score -= 8;
134
+ factors.push(`Negative 24h movement (${change24h.toFixed(1)}%) -- mild fear`);
135
+ }
136
+ else {
137
+ factors.push(`Flat 24h movement (${change24h.toFixed(1)}%) -- neutral`);
138
+ }
139
+ // Volume/market cap ratio (higher = more activity = more extreme sentiment)
140
+ const volMcapRatio = coin.total_volume / coin.market_cap;
141
+ if (volMcapRatio > 0.15) {
142
+ score += Math.min(10, Math.round(volMcapRatio * 30));
143
+ factors.push(`High trading volume (${(volMcapRatio * 100).toFixed(1)}% of mcap) -- elevated activity`);
144
+ }
145
+ else if (volMcapRatio < 0.03) {
146
+ score -= 5;
147
+ factors.push(`Low trading volume (${(volMcapRatio * 100).toFixed(1)}% of mcap) -- low interest`);
148
+ }
149
+ // Distance from ATH
150
+ const athDist = Math.abs(coin.ath_change_percentage);
151
+ if (athDist < 10) {
152
+ score += 10;
153
+ factors.push(`Near all-time high (${athDist.toFixed(0)}% below) -- extreme greed territory`);
154
+ }
155
+ else if (athDist < 25) {
156
+ score += 5;
157
+ factors.push(`Within 25% of ATH -- greed territory`);
158
+ }
159
+ else if (athDist > 70) {
160
+ score -= 10;
161
+ factors.push(`Far from ATH (${athDist.toFixed(0)}% below) -- fear territory`);
162
+ }
163
+ else if (athDist > 50) {
164
+ score -= 5;
165
+ factors.push(`Significantly below ATH (${athDist.toFixed(0)}% below) -- mild fear`);
166
+ }
167
+ // Overall market direction
168
+ const marketChange = global.market_cap_change_percentage_24h_usd;
169
+ if (marketChange > 3) {
170
+ score += 8;
171
+ factors.push(`Crypto market rallying (+${marketChange.toFixed(1)}%) -- broad greed`);
172
+ }
173
+ else if (marketChange < -3) {
174
+ score -= 8;
175
+ factors.push(`Crypto market declining (${marketChange.toFixed(1)}%) -- broad fear`);
176
+ }
177
+ // Clamp to 0-100
178
+ score = Math.max(0, Math.min(100, score));
179
+ let label;
180
+ if (score >= 75)
181
+ label = "Extreme Greed";
182
+ else if (score >= 55)
183
+ label = "Greed";
184
+ else if (score >= 45)
185
+ label = "Neutral";
186
+ else if (score >= 25)
187
+ label = "Fear";
188
+ else
189
+ label = "Extreme Fear";
190
+ return { score, label, factors };
191
+ }
192
+ //# sourceMappingURL=crypto_analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto_analysis.js","sourceRoot":"","sources":["../../src/tools/crypto_analysis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * market_overview -- Current market snapshot.
3
+ *
4
+ * Fetches live data for major indices, sector ETFs, and VIX
5
+ * from Yahoo Finance to build a comprehensive market summary.
6
+ */
7
+ export declare function handleMarketOverview(): Promise<string>;
8
+ //# sourceMappingURL=market_overview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"market_overview.d.ts","sourceRoot":"","sources":["../../src/tools/market_overview.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsCH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,CAgM5D"}