lit-forge-mcp 0.3.0 → 0.4.1

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 (84) hide show
  1. package/README.md +17 -7
  2. package/dist/lib/__tests__/correlation.test.d.ts +1 -0
  3. package/dist/lib/__tests__/correlation.test.js +53 -0
  4. package/dist/lib/__tests__/correlation.test.js.map +1 -0
  5. package/dist/lib/__tests__/quartile.test.d.ts +1 -0
  6. package/dist/lib/__tests__/quartile.test.js +148 -0
  7. package/dist/lib/__tests__/quartile.test.js.map +1 -0
  8. package/dist/lib/__tests__/rankings.test.d.ts +1 -0
  9. package/dist/lib/__tests__/rankings.test.js +67 -0
  10. package/dist/lib/__tests__/rankings.test.js.map +1 -0
  11. package/dist/lib/__tests__/sessions.test.d.ts +1 -0
  12. package/dist/lib/__tests__/sessions.test.js +47 -0
  13. package/dist/lib/__tests__/sessions.test.js.map +1 -0
  14. package/dist/lib/__tests__/sma.test.d.ts +1 -0
  15. package/dist/lib/__tests__/sma.test.js +26 -0
  16. package/dist/lib/__tests__/sma.test.js.map +1 -0
  17. package/dist/lib/__tests__/thermometer.test.d.ts +1 -0
  18. package/dist/lib/__tests__/thermometer.test.js +120 -0
  19. package/dist/lib/__tests__/thermometer.test.js.map +1 -0
  20. package/dist/lib/__tests__/yield-spread.test.d.ts +1 -0
  21. package/dist/lib/__tests__/yield-spread.test.js +46 -0
  22. package/dist/lib/__tests__/yield-spread.test.js.map +1 -0
  23. package/dist/lib/correlation.d.ts +3 -0
  24. package/dist/lib/correlation.js +77 -0
  25. package/dist/lib/correlation.js.map +1 -0
  26. package/dist/lib/fangplus.d.ts +7 -0
  27. package/dist/lib/fangplus.js +19 -0
  28. package/dist/lib/fangplus.js.map +1 -0
  29. package/dist/lib/indicators.d.ts +1 -0
  30. package/dist/lib/indicators.js +36 -1
  31. package/dist/lib/indicators.js.map +1 -1
  32. package/dist/lib/mag7.d.ts +7 -0
  33. package/dist/lib/mag7.js +13 -0
  34. package/dist/lib/mag7.js.map +1 -0
  35. package/dist/lib/market-types.d.ts +22 -6
  36. package/dist/lib/market-types.js +1 -0
  37. package/dist/lib/market-types.js.map +1 -1
  38. package/dist/lib/performance.d.ts +3 -0
  39. package/dist/lib/performance.js +43 -0
  40. package/dist/lib/performance.js.map +1 -0
  41. package/dist/lib/quartile.d.ts +24 -0
  42. package/dist/lib/quartile.js +128 -0
  43. package/dist/lib/quartile.js.map +1 -0
  44. package/dist/lib/rankings.d.ts +7 -0
  45. package/dist/lib/rankings.js +29 -0
  46. package/dist/lib/rankings.js.map +1 -0
  47. package/dist/lib/sectors.d.ts +7 -0
  48. package/dist/lib/sectors.js +62 -0
  49. package/dist/lib/sectors.js.map +1 -0
  50. package/dist/lib/sessions.d.ts +14 -0
  51. package/dist/lib/sessions.js +50 -0
  52. package/dist/lib/sessions.js.map +1 -0
  53. package/dist/lib/sma.d.ts +2 -0
  54. package/dist/lib/sma.js +33 -0
  55. package/dist/lib/sma.js.map +1 -0
  56. package/dist/lib/thermometer.d.ts +13 -0
  57. package/dist/lib/thermometer.js +118 -0
  58. package/dist/lib/thermometer.js.map +1 -0
  59. package/dist/lib/yahoo.d.ts +2 -0
  60. package/dist/lib/yahoo.js +76 -16
  61. package/dist/lib/yahoo.js.map +1 -1
  62. package/dist/lib/yield-spread.d.ts +6 -0
  63. package/dist/lib/yield-spread.js +20 -0
  64. package/dist/lib/yield-spread.js.map +1 -0
  65. package/dist/tools/get-market-sessions.d.ts +2 -0
  66. package/dist/tools/get-market-sessions.js +27 -0
  67. package/dist/tools/get-market-sessions.js.map +1 -0
  68. package/dist/tools/get-market-snapshot.js +7 -5
  69. package/dist/tools/get-market-snapshot.js.map +1 -1
  70. package/dist/tools/get-market-thermometer.d.ts +2 -0
  71. package/dist/tools/get-market-thermometer.js +47 -0
  72. package/dist/tools/get-market-thermometer.js.map +1 -0
  73. package/dist/tools/get-performance-ranking.d.ts +2 -0
  74. package/dist/tools/get-performance-ranking.js +75 -0
  75. package/dist/tools/get-performance-ranking.js.map +1 -0
  76. package/dist/tools/get-sector-heatmap.d.ts +2 -0
  77. package/dist/tools/get-sector-heatmap.js +34 -0
  78. package/dist/tools/get-sector-heatmap.js.map +1 -0
  79. package/dist/tools/get-yield-spread.d.ts +2 -0
  80. package/dist/tools/get-yield-spread.js +41 -0
  81. package/dist/tools/get-yield-spread.js.map +1 -0
  82. package/dist/tools/index.js +13 -0
  83. package/dist/tools/index.js.map +1 -1
  84. package/package.json +6 -3
@@ -0,0 +1,46 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { computeYieldSpread } from "../yield-spread.js";
3
+ function q(symbol, price, change = 0) {
4
+ return {
5
+ symbol,
6
+ price,
7
+ previousClose: price - change,
8
+ change,
9
+ changePercent: 0,
10
+ changeBp: change * 100,
11
+ fetchedAt: "",
12
+ sparkline: [],
13
+ };
14
+ }
15
+ describe("computeYieldSpread", () => {
16
+ it("^TNX - ^FVX を返す", () => {
17
+ const snap = {
18
+ fetchedAt: "",
19
+ quotes: {
20
+ "^TNX": q("^TNX", 4.5, 0.01),
21
+ "^FVX": q("^FVX", 4.2, 0.005),
22
+ },
23
+ };
24
+ const r = computeYieldSpread(snap);
25
+ expect(r.spread).toBeCloseTo(0.3, 5);
26
+ expect(r.spreadChangeBp).toBeCloseTo(0.5, 2);
27
+ });
28
+ it("片方欠損は null", () => {
29
+ const snap = {
30
+ fetchedAt: "",
31
+ quotes: { "^TNX": q("^TNX", 4.5) },
32
+ };
33
+ expect(computeYieldSpread(snap)).toBeNull();
34
+ });
35
+ it("error は null", () => {
36
+ const snap = {
37
+ fetchedAt: "",
38
+ quotes: {
39
+ "^TNX": q("^TNX", 4.5),
40
+ "^FVX": { error: "fail" },
41
+ },
42
+ };
43
+ expect(computeYieldSpread(snap)).toBeNull();
44
+ });
45
+ });
46
+ //# sourceMappingURL=yield-spread.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yield-spread.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/yield-spread.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAGxD,SAAS,CAAC,CAAC,MAAc,EAAE,KAAa,EAAE,SAAiB,CAAC;IAC1D,OAAO;QACL,MAAM;QACN,KAAK;QACL,aAAa,EAAE,KAAK,GAAG,MAAM;QAC7B,MAAM;QACN,aAAa,EAAE,CAAC;QAChB,QAAQ,EAAE,MAAM,GAAG,GAAG;QACtB,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,EAAE;KACd,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;QACzB,MAAM,IAAI,GAAa;YACrB,SAAS,EAAE,EAAE;YACb,MAAM,EAAE;gBACN,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;gBAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC;aAC9B;SACF,CAAC;QACF,MAAM,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAE,CAAC;QACpC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE;QACpB,MAAM,IAAI,GAAa;YACrB,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;SACnC,CAAC;QACF,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;QACtB,MAAM,IAAI,GAAa;YACrB,SAAS,EAAE,EAAE;YACb,MAAM,EAAE;gBACN,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC;gBACtB,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;aAC1B;SACF,CAAC;QACF,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function tailReturns(closes: readonly number[], windowDays?: number): number[];
2
+ export declare function pearson(a: readonly number[], b: readonly number[]): number | null;
3
+ export declare function correlationMatrix(symbols: readonly string[], getCloses: (symbol: string) => readonly number[] | undefined): (number | null)[][];
@@ -0,0 +1,77 @@
1
+ // 日次リターン系列のピアソン相関係数を計算する純関数。
2
+ // PERFORMANCE_SYMBOLS(7 銘柄)の closes1y から「直近 30 営業日」のリターンを抽出し、
3
+ // 7×7 の相関行列を作って /today の相関ヒートマップで描画する。
4
+ //
5
+ // データ点不足は null を返し、UI 側で「—」表示にする。
6
+ const WINDOW_DAYS = 30;
7
+ const MIN_RETURNS = 20; // 30 日中 20 営業日以上ないと信頼性が低いので無効
8
+ // closes 配列から「直近 N 営業日のリターン系列」を返す。長さは N - 1。
9
+ // データ不足は空配列。
10
+ export function tailReturns(closes, windowDays = WINDOW_DAYS) {
11
+ const tail = closes.slice(-windowDays - 1);
12
+ if (tail.length < 2)
13
+ return [];
14
+ const out = [];
15
+ for (let i = 1; i < tail.length; i++) {
16
+ const prev = tail[i - 1];
17
+ const curr = tail[i];
18
+ if (prev === 0 || typeof prev !== "number" || typeof curr !== "number")
19
+ continue;
20
+ out.push((curr - prev) / prev);
21
+ }
22
+ return out;
23
+ }
24
+ // ピアソン相関係数。データ点不足や標準偏差ゼロの場合は null。
25
+ export function pearson(a, b) {
26
+ const n = Math.min(a.length, b.length);
27
+ if (n < MIN_RETURNS)
28
+ return null;
29
+ let sumA = 0;
30
+ let sumB = 0;
31
+ for (let i = 0; i < n; i++) {
32
+ sumA += a[i];
33
+ sumB += b[i];
34
+ }
35
+ const meanA = sumA / n;
36
+ const meanB = sumB / n;
37
+ let num = 0;
38
+ let denomA = 0;
39
+ let denomB = 0;
40
+ for (let i = 0; i < n; i++) {
41
+ const da = a[i] - meanA;
42
+ const db = b[i] - meanB;
43
+ num += da * db;
44
+ denomA += da * da;
45
+ denomB += db * db;
46
+ }
47
+ // 浮動小数の蓄積誤差を考慮して、十分小さい場合も std=0 とみなして null。
48
+ if (denomA < 1e-12 || denomB < 1e-12)
49
+ return null;
50
+ const denom = Math.sqrt(denomA * denomB);
51
+ if (denom === 0)
52
+ return null;
53
+ return num / denom;
54
+ }
55
+ // 銘柄リストと closes1y からの取得関数を受け取り、N×N の相関行列を返す。
56
+ // 自身との相関は 1。データ無い銘柄や算出できないペアは null。
57
+ export function correlationMatrix(symbols, getCloses) {
58
+ const returns = symbols.map((s) => {
59
+ const closes = getCloses(s);
60
+ return closes ? tailReturns(closes) : [];
61
+ });
62
+ const n = symbols.length;
63
+ const matrix = [];
64
+ for (let i = 0; i < n; i++) {
65
+ const row = [];
66
+ for (let j = 0; j < n; j++) {
67
+ if (i === j) {
68
+ row.push(returns[i].length >= MIN_RETURNS ? 1 : null);
69
+ continue;
70
+ }
71
+ row.push(pearson(returns[i], returns[j]));
72
+ }
73
+ matrix.push(row);
74
+ }
75
+ return matrix;
76
+ }
77
+ //# sourceMappingURL=correlation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"correlation.js","sourceRoot":"","sources":["../../src/lib/correlation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type FangPlusStock = {
2
+ symbol: string;
3
+ name: string;
4
+ description: string;
5
+ };
6
+ export declare const FANGPLUS_STOCKS: readonly FangPlusStock[];
7
+ export declare const FANGPLUS_SYMBOLS: readonly string[];
@@ -0,0 +1,19 @@
1
+ // NYSE FANG+ 指数の構成銘柄(10 社・等加重)。
2
+ // 指数は四半期ごとに rebalance され rotational members が入れ替わるため、
3
+ // 表示は「2026 年時点の代表的 10 銘柄」を運用上の固定リストとして扱う。
4
+ // Mag7 と 7 銘柄が重複するが、FANG+ 独自の 3 銘柄(NFLX / AVGO / CRWD)も含めて
5
+ // FANG+ 指数(^NYFANG)を実際に動かしている個別株を一覧で見られるようにする。
6
+ export const FANGPLUS_STOCKS = [
7
+ { symbol: "META", name: "Meta", description: "FANG+ オリジナル構成銘柄、SNS・広告" },
8
+ { symbol: "AAPL", name: "Apple", description: "FANG+ オリジナル構成銘柄、ハードウェア・サービス" },
9
+ { symbol: "AMZN", name: "Amazon", description: "FANG+ オリジナル構成銘柄、EC・AWS" },
10
+ { symbol: "NFLX", name: "Netflix", description: "FANG+ オリジナル構成銘柄、ストリーミング" },
11
+ { symbol: "GOOGL", name: "Alphabet", description: "FANG+ オリジナル構成銘柄、検索・広告・Cloud" },
12
+ { symbol: "MSFT", name: "Microsoft", description: "Azure・Office・OpenAI 出資" },
13
+ { symbol: "NVDA", name: "Nvidia", description: "AI 向け GPU の中心企業" },
14
+ { symbol: "TSLA", name: "Tesla", description: "EV・エネルギー貯蔵" },
15
+ { symbol: "AVGO", name: "Broadcom", description: "半導体・AI ASIC・VMware" },
16
+ { symbol: "CRWD", name: "CrowdStrike", description: "クラウドネイティブ・セキュリティ" },
17
+ ];
18
+ export const FANGPLUS_SYMBOLS = FANGPLUS_STOCKS.map((s) => s.symbol);
19
+ //# sourceMappingURL=fangplus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fangplus.js","sourceRoot":"","sources":["../../src/lib/fangplus.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,sDAAsD;AACtD,0CAA0C;AAC1C,2DAA2D;AAC3D,+CAA+C;AAQ/C,MAAM,CAAC,MAAM,eAAe,GAA6B;IACvD,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,wBAAwB,EAAE;IACvE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,6BAA6B,EAAE;IAC7E,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wBAAwB,EAAE;IACzE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,yBAAyB,EAAE;IAC3E,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,6BAA6B,EAAE;IACjF,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,wBAAwB,EAAE;IAC5E,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAE;IAClE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE;IAC5D,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,oBAAoB,EAAE;IACvE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,kBAAkB,EAAE;CACzE,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAsB,eAAe,CAAC,GAAG,CACpE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAChB,CAAC"}
@@ -1,2 +1,3 @@
1
1
  import type { Indicator } from "./market-types.js";
2
2
  export declare const INDICATORS: readonly Indicator[];
3
+ export declare const CATEGORY_LABEL: Record<Indicator["category"], string>;
@@ -1,14 +1,49 @@
1
- // MCP server で扱うマクロ指標 9 銘柄。
1
+ // MCP server で扱うマクロ指標 28 銘柄。
2
2
  // Web 側 (lit-forge/app/lib/market/indicators.ts) と同期管理。
3
+ // v0.4 で 9 → 28 銘柄に拡張(Web の v1.50 → v1.59 の拡張に追従)。
3
4
  export const INDICATORS = [
5
+ // ====== 為替 ======
4
6
  { symbol: "JPY=X", displayName: "USD/JPY", category: "fx", unit: "円", decimals: 2, changeStyle: "ratio" },
5
7
  { symbol: "EURJPY=X", displayName: "EUR/JPY", category: "fx", unit: "円", decimals: 2, changeStyle: "ratio" },
8
+ { symbol: "GBPJPY=X", displayName: "GBP/JPY", category: "fx", unit: "円", decimals: 2, changeStyle: "ratio" },
9
+ { symbol: "AUDJPY=X", displayName: "AUD/JPY", category: "fx", unit: "円", decimals: 2, changeStyle: "ratio" },
10
+ { symbol: "EURUSD=X", displayName: "EUR/USD", category: "fx", unit: "", decimals: 4, changeStyle: "ratio" },
11
+ { symbol: "CHFJPY=X", displayName: "CHF/JPY", category: "fx", unit: "円", decimals: 2, changeStyle: "ratio" },
12
+ { symbol: "DX-Y.NYB", fallback: "DX=F", displayName: "ドル指数 (DXY)", category: "fx", unit: "", decimals: 2, changeStyle: "ratio" },
13
+ // ====== 株式(日本) ======
6
14
  { symbol: "^N225", displayName: "日経平均", category: "equity", unit: "", decimals: 2, changeStyle: "ratio" },
7
15
  { symbol: "^TPX", fallback: "1305.T", displayName: "TOPIX", category: "equity", unit: "", decimals: 2, changeStyle: "ratio" },
16
+ // ====== 株式(米) ======
17
+ { symbol: "^DJI", displayName: "NY ダウ", category: "equity", unit: "", decimals: 2, changeStyle: "ratio" },
8
18
  { symbol: "^GSPC", displayName: "S&P 500", category: "equity", unit: "", decimals: 2, changeStyle: "ratio" },
9
19
  { symbol: "^NDX", displayName: "NASDAQ 100", category: "equity", unit: "", decimals: 2, changeStyle: "ratio" },
20
+ { symbol: "^VIX", displayName: "VIX (恐怖指数)", category: "equity", unit: "", decimals: 2, changeStyle: "ratio" },
21
+ { symbol: "^NYFANG", displayName: "NYSE FANG+", category: "equity", unit: "", decimals: 2, changeStyle: "ratio" },
22
+ { symbol: "^SOX", displayName: "フィラデルフィア半導体 (SOX)", category: "equity", unit: "", decimals: 2, changeStyle: "ratio" },
23
+ // ====== 株式(欧州) ======
24
+ { symbol: "^GDAXI", displayName: "DAX", category: "equity", unit: "", decimals: 2, changeStyle: "ratio" },
25
+ { symbol: "^FTSE", displayName: "FTSE 100", category: "equity", unit: "", decimals: 2, changeStyle: "ratio" },
26
+ // ====== 株式(アジア) ======
27
+ { symbol: "000001.SS", displayName: "上海総合", category: "equity", unit: "", decimals: 2, changeStyle: "ratio" },
28
+ { symbol: "^HSI", displayName: "ハンセン", category: "equity", unit: "", decimals: 2, changeStyle: "ratio" },
29
+ { symbol: "^KS11", displayName: "KOSPI", category: "equity", unit: "", decimals: 2, changeStyle: "ratio" },
30
+ { symbol: "^BSESN", displayName: "SENSEX", category: "equity", unit: "", decimals: 2, changeStyle: "ratio" },
31
+ // ====== 金利 ======
10
32
  { symbol: "^TNX", displayName: "米10年債利回り", category: "bond", unit: "%", decimals: 3, changeStyle: "bp" },
33
+ { symbol: "^FVX", displayName: "米5年債利回り", category: "bond", unit: "%", decimals: 3, changeStyle: "bp" },
34
+ // ====== コモディティ ======
11
35
  { symbol: "GC=F", displayName: "金(先物)", category: "commodity", unit: "USD/oz", decimals: 2, changeStyle: "ratio" },
12
36
  { symbol: "CL=F", displayName: "原油 WTI", category: "commodity", unit: "USD/bbl", decimals: 2, changeStyle: "ratio" },
37
+ { symbol: "HG=F", displayName: "銅(先物)", category: "commodity", unit: "USD/lb", decimals: 3, changeStyle: "ratio" },
38
+ // ====== 暗号資産 ======
39
+ { symbol: "BTC-USD", displayName: "ビットコイン", category: "crypto", unit: "USD", decimals: 0, changeStyle: "ratio" },
40
+ { symbol: "ETH-USD", displayName: "イーサリアム", category: "crypto", unit: "USD", decimals: 0, changeStyle: "ratio" },
13
41
  ];
42
+ export const CATEGORY_LABEL = {
43
+ fx: "為替",
44
+ equity: "株式",
45
+ bond: "金利",
46
+ commodity: "コモディティ",
47
+ crypto: "暗号資産",
48
+ };
14
49
  //# sourceMappingURL=indicators.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"indicators.js","sourceRoot":"","sources":["../../src/lib/indicators.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,wDAAwD;AAIxD,MAAM,CAAC,MAAM,UAAU,GAAyB;IAC9C,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE;IACzG,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE;IAC5G,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE;IACzG,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE;IAC7H,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE;IAC5G,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE;IAC9G,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE;IACxG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE;IAClH,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE;CACrH,CAAC"}
1
+ {"version":3,"file":"indicators.js","sourceRoot":"","sources":["../../src/lib/indicators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type Mag7Stock = {
2
+ symbol: string;
3
+ name: string;
4
+ description: string;
5
+ };
6
+ export declare const MAG7_STOCKS: readonly Mag7Stock[];
7
+ export declare const MAG7_SYMBOLS: readonly string[];
@@ -0,0 +1,13 @@
1
+ // マグニフィセント 7:米株を牽引する大型テック 7 銘柄。
2
+ // 米株セクター ETF と並列に「個別株の強弱」セクションとして /today に表示する。
3
+ export const MAG7_STOCKS = [
4
+ { symbol: "AAPL", name: "Apple", description: "iPhone・サービス事業" },
5
+ { symbol: "MSFT", name: "Microsoft", description: "Azure・Office・OpenAI 出資" },
6
+ { symbol: "GOOGL", name: "Alphabet", description: "検索・広告・YouTube・Cloud" },
7
+ { symbol: "AMZN", name: "Amazon", description: "EC・AWS(クラウド最大手)" },
8
+ { symbol: "META", name: "Meta", description: "Instagram・Facebook・WhatsApp" },
9
+ { symbol: "NVDA", name: "Nvidia", description: "AI 向け GPU の中心企業" },
10
+ { symbol: "TSLA", name: "Tesla", description: "EV・エネルギー貯蔵" },
11
+ ];
12
+ export const MAG7_SYMBOLS = MAG7_STOCKS.map((s) => s.symbol);
13
+ //# sourceMappingURL=mag7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mag7.js","sourceRoot":"","sources":["../../src/lib/mag7.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,gDAAgD;AAShD,MAAM,CAAC,MAAM,WAAW,GAAyB;IAC/C,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE;IAC/D,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,wBAAwB,EAAE;IAC5E,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,qBAAqB,EAAE;IACzE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAE;IAClE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,6BAA6B,EAAE;IAC5E,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAE;IAClE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE;CAC7D,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAsB,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC"}
@@ -1,4 +1,4 @@
1
- export type IndicatorCategory = "fx" | "equity" | "bond" | "commodity";
1
+ export type IndicatorCategory = "fx" | "equity" | "bond" | "commodity" | "crypto";
2
2
  export type ChangeStyle = "ratio" | "bp";
3
3
  export type Indicator = {
4
4
  symbol: string;
@@ -9,25 +9,38 @@ export type Indicator = {
9
9
  decimals: number;
10
10
  changeStyle: ChangeStyle;
11
11
  };
12
+ export type PerformanceWindow = {
13
+ d7: number | null;
14
+ d30: number | null;
15
+ d365: number | null;
16
+ };
12
17
  export type Quote = {
13
18
  symbol: string;
14
- displayName: string;
15
- category: IndicatorCategory;
19
+ displayName?: string;
20
+ category?: IndicatorCategory;
21
+ unit?: string;
16
22
  price: number;
17
23
  previousClose: number;
18
24
  change: number;
19
25
  changePercent: number;
20
26
  changeBp: number;
21
- unit: string;
22
27
  fetchedAt: string;
28
+ sparkline: number[];
29
+ fiftyTwoWeekHigh?: number;
30
+ fiftyTwoWeekLow?: number;
31
+ dayHigh?: number;
32
+ dayLow?: number;
33
+ volume?: number;
34
+ performance?: PerformanceWindow;
35
+ closes1y?: number[];
36
+ isStale?: boolean;
23
37
  };
24
38
  export type QuoteResult = Quote | {
25
- symbol: string;
26
39
  error: string;
27
40
  };
28
41
  export type Snapshot = {
29
42
  fetchedAt: string;
30
- quotes: QuoteResult[];
43
+ quotes: Record<string, QuoteResult>;
31
44
  };
32
45
  export type EventImportance = 1 | 2 | 3;
33
46
  export type Country = "JP" | "US" | "CN" | "EU" | "GB" | "OTHER";
@@ -38,4 +51,7 @@ export type EconomicEvent = {
38
51
  name: string;
39
52
  importance: EventImportance;
40
53
  note?: string;
54
+ forecast?: string;
55
+ actual?: string;
56
+ previous?: string;
41
57
  };
@@ -1,4 +1,5 @@
1
1
  // MCP server 用の市況データ型定義。
2
2
  // Web 側 (lit-forge/app/lib/market/types.ts) と整合する形で同梱。
3
+ // v0.4 で構造を Web 側と同型にし、Snapshot.quotes を Record<symbol, QuoteResult> に変更。
3
4
  export {};
4
5
  //# sourceMappingURL=market-types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"market-types.js","sourceRoot":"","sources":["../../src/lib/market-types.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,uDAAuD"}
1
+ {"version":3,"file":"market-types.js","sourceRoot":"","sources":["../../src/lib/market-types.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,uDAAuD;AACvD,0EAA0E"}
@@ -0,0 +1,3 @@
1
+ import type { PerformanceWindow } from "./market-types.js";
2
+ export declare function computePerformance(closes: readonly number[]): PerformanceWindow;
3
+ export declare const PERFORMANCE_SYMBOLS: readonly string[];
@@ -0,0 +1,43 @@
1
+ // 期間別パフォーマンス計算(純関数)。
2
+ // 日足 close 配列のインデックス基準で「直近 5 営業日 / 約 1 ヶ月(21 営業日)/ 約 1 年(252 営業日)」
3
+ // に対する % 変化率を返す。データ点が足りない場合は null。
4
+ //
5
+ // 暦日ベースだと休場日を巡って境界がぶれる(金曜の close が「1 週間前」なのか「5 営業日前」なのか)ため、
6
+ // 「Yahoo の日足配列から N 件遡る」という素朴な定義で運用する。文言は「1w / 1m / 1y」と短縮表示し、
7
+ // 厳密には「直近 5 / 21 / 252 営業日」だがユーザー視点での体感で十分という割り切り。
8
+ const D7_INDEX = 5; // 直近 5 営業日前
9
+ const D30_INDEX = 21; // 約 1 ヶ月前
10
+ const D365_INDEX = 252; // 約 1 年前
11
+ // 単一の遡及インデックスに対する変化率(%)。データ不足は null。
12
+ function changePercent(closes, backIndex) {
13
+ if (closes.length <= backIndex)
14
+ return null;
15
+ const today = closes[closes.length - 1];
16
+ const past = closes[closes.length - 1 - backIndex];
17
+ if (typeof today !== "number" || typeof past !== "number")
18
+ return null;
19
+ if (past === 0)
20
+ return null;
21
+ return ((today - past) / past) * 100;
22
+ }
23
+ // 日足 close 配列から d7 / d30 / d365 を一括計算。
24
+ export function computePerformance(closes) {
25
+ return {
26
+ d7: changePercent(closes, D7_INDEX),
27
+ d30: changePercent(closes, D30_INDEX),
28
+ d365: changePercent(closes, D365_INDEX),
29
+ };
30
+ }
31
+ // /today で期間別パフォーマンス + 1y 期間タブ + 分位値表示を有効化する銘柄。
32
+ // Yahoo の追加 fetch(1y 日足)はこの銘柄のみで実施。ISR 24h + Redis 7d でキャッシュ。
33
+ // v1.54 で 3 → 7 に拡張:マクロ俯瞰の主要グループを網羅。
34
+ export const PERFORMANCE_SYMBOLS = [
35
+ "JPY=X", // USD/JPY
36
+ "^GSPC", // S&P 500
37
+ "^NDX", // NASDAQ 100
38
+ "^DJI", // NY ダウ
39
+ "^TNX", // 米10年債利回り
40
+ "^VIX", // VIX
41
+ "DX-Y.NYB", // ドル指数
42
+ ];
43
+ //# sourceMappingURL=performance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performance.js","sourceRoot":"","sources":["../../src/lib/performance.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,mEAAmE;AACnE,mCAAmC;AACnC,EAAE;AACF,4DAA4D;AAC5D,8DAA8D;AAC9D,mDAAmD;AAInD,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,YAAY;AAChC,MAAM,SAAS,GAAG,EAAE,CAAC,CAAC,UAAU;AAChC,MAAM,UAAU,GAAG,GAAG,CAAC,CAAC,SAAS;AAEjC,qCAAqC;AACrC,SAAS,aAAa,CACpB,MAAyB,EACzB,SAAiB;IAEjB,IAAI,MAAM,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACvE,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5B,OAAO,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;AACvC,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,kBAAkB,CAChC,MAAyB;IAEzB,OAAO;QACL,EAAE,EAAE,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC;QACnC,GAAG,EAAE,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC;QACrC,IAAI,EAAE,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC;KACxC,CAAC;AACJ,CAAC;AAED,gDAAgD;AAChD,8DAA8D;AAC9D,qCAAqC;AACrC,MAAM,CAAC,MAAM,mBAAmB,GAAsB;IACpD,OAAO,EAAE,UAAU;IACnB,OAAO,EAAE,UAAU;IACnB,MAAM,EAAE,aAAa;IACrB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,MAAM;IACd,UAAU,EAAE,OAAO;CACpB,CAAC"}
@@ -0,0 +1,24 @@
1
+ export declare function pricePercentile(closes: readonly number[]): number | null;
2
+ export type OutlierResult = {
3
+ sigma: number;
4
+ exceeds1Sigma: boolean;
5
+ };
6
+ export declare function detectOutlier(closes: readonly number[], todayChangePercent: number): OutlierResult | null;
7
+ export type LevelEvent = {
8
+ type: "52w-new-high" | "52w-new-low" | "ma200-cross-up" | "ma200-cross-down";
9
+ label: string;
10
+ };
11
+ export declare function detectLevelEvents(input: {
12
+ closes1y?: readonly number[];
13
+ dayHigh?: number;
14
+ dayLow?: number;
15
+ fiftyTwoWeekHigh?: number;
16
+ fiftyTwoWeekLow?: number;
17
+ }): LevelEvent[];
18
+ export type MilestoneEvent = {
19
+ type: "n-day-high" | "n-day-low";
20
+ days: number;
21
+ label: string;
22
+ };
23
+ export declare function detectMilestone(closes: readonly number[]): MilestoneEvent | null;
24
+ export declare function percentileLabel(percentile: number | null): string;
@@ -0,0 +1,128 @@
1
+ // 過去 1 年(≒ 252 営業日)の close 配列に対する現在値の分位値(パーセンタイル)を計算。
2
+ // 「現在値が過去 1 年で X% の位置(0=最安、100=最高)」を返す。
3
+ // /today の MarketCard 上で「過去1年で上位X%」のようなヒストリカル文脈表示に使う。
4
+ const MIN_POINTS = 30; // この点数未満は分位値を算出しない(信頼性低)
5
+ // closes に対する現在値(= 末尾要素)のパーセンタイル順位(0..100)。
6
+ // データ点不足は null。
7
+ export function pricePercentile(closes) {
8
+ if (closes.length < MIN_POINTS)
9
+ return null;
10
+ const current = closes[closes.length - 1];
11
+ if (typeof current !== "number" || Number.isNaN(current))
12
+ return null;
13
+ // 末尾要素を除いた過去履歴に対してランクを取る(自己一致を除外)
14
+ const past = closes.slice(0, -1);
15
+ const lessOrEq = past.filter((v) => v <= current).length;
16
+ return (lessOrEq / past.length) * 100;
17
+ }
18
+ export function detectOutlier(closes, todayChangePercent) {
19
+ if (closes.length < MIN_POINTS)
20
+ return null;
21
+ // 各営業日変化率の系列を作る
22
+ const returns = [];
23
+ for (let i = 1; i < closes.length; i++) {
24
+ const prev = closes[i - 1];
25
+ const curr = closes[i];
26
+ if (prev === 0 || typeof prev !== "number" || typeof curr !== "number")
27
+ continue;
28
+ returns.push(((curr - prev) / prev) * 100);
29
+ }
30
+ if (returns.length < MIN_POINTS)
31
+ return null;
32
+ const mean = returns.reduce((a, b) => a + b, 0) / returns.length;
33
+ const variance = returns.reduce((sum, r) => sum + (r - mean) ** 2, 0) / returns.length;
34
+ const std = Math.sqrt(variance);
35
+ if (std === 0)
36
+ return null;
37
+ const sigma = (todayChangePercent - mean) / std;
38
+ return { sigma, exceeds1Sigma: Math.abs(sigma) >= 1 };
39
+ }
40
+ const MA200_LEN = 200;
41
+ function sma(values) {
42
+ if (values.length === 0)
43
+ return null;
44
+ return values.reduce((a, b) => a + b, 0) / values.length;
45
+ }
46
+ // closes1y / dayHigh / dayLow / fiftyTwoWeekHigh / fiftyTwoWeekLow から重要レベルイベントを抽出。
47
+ // データ不足時は空配列。複数同時起きる場合は配列で全部返す(呼び出し側で先頭 N 件を表示)。
48
+ export function detectLevelEvents(input) {
49
+ const out = [];
50
+ // 52 週新高値・新安値:当日高値が 52w 高値以上 / 当日安値が 52w 安値以下
51
+ if (typeof input.dayHigh === "number" &&
52
+ typeof input.fiftyTwoWeekHigh === "number" &&
53
+ input.dayHigh >= input.fiftyTwoWeekHigh) {
54
+ out.push({ type: "52w-new-high", label: "🏔️ 52週新高値" });
55
+ }
56
+ if (typeof input.dayLow === "number" &&
57
+ typeof input.fiftyTwoWeekLow === "number" &&
58
+ input.dayLow <= input.fiftyTwoWeekLow &&
59
+ input.fiftyTwoWeekLow > 0) {
60
+ out.push({ type: "52w-new-low", label: "📉 52週新安値" });
61
+ }
62
+ // 200 日線クロス:直近の close と前日 close を 200 日 SMA と比較。
63
+ const closes = input.closes1y;
64
+ if (closes && closes.length >= MA200_LEN + 1) {
65
+ const last = closes[closes.length - 1];
66
+ const prev = closes[closes.length - 2];
67
+ const lastSma = sma(closes.slice(-MA200_LEN));
68
+ const prevSma = sma(closes.slice(-MA200_LEN - 1, -1));
69
+ if (typeof last === "number" &&
70
+ typeof prev === "number" &&
71
+ lastSma !== null &&
72
+ prevSma !== null) {
73
+ if (last > lastSma && prev <= prevSma) {
74
+ out.push({ type: "ma200-cross-up", label: "📈 200日線上抜け" });
75
+ }
76
+ else if (last < lastSma && prev >= prevSma) {
77
+ out.push({ type: "ma200-cross-down", label: "📉 200日線下抜け" });
78
+ }
79
+ }
80
+ }
81
+ return out;
82
+ }
83
+ const MILESTONE_BUCKETS = [252, 90, 60, 30];
84
+ export function detectMilestone(closes) {
85
+ if (closes.length < 31)
86
+ return null;
87
+ const last = closes[closes.length - 1];
88
+ if (typeof last !== "number")
89
+ return null;
90
+ for (const days of MILESTONE_BUCKETS) {
91
+ if (closes.length <= days)
92
+ continue;
93
+ const window = closes.slice(-days - 1, -1); // 直前 N 日(自身を除く)
94
+ const max = Math.max(...window);
95
+ const min = Math.min(...window);
96
+ if (last > max) {
97
+ return {
98
+ type: "n-day-high",
99
+ days,
100
+ label: days >= 252 ? "📅 1年ぶり高値" : `📅 ${days}日ぶり高値`,
101
+ };
102
+ }
103
+ if (last < min) {
104
+ return {
105
+ type: "n-day-low",
106
+ days,
107
+ label: days >= 252 ? "📅 1年ぶり安値" : `📅 ${days}日ぶり安値`,
108
+ };
109
+ }
110
+ }
111
+ return null;
112
+ }
113
+ // パーセンタイル値を「上位/下位/中央寄り」の短文ラベルに変換。
114
+ // percentile null → 空文字(呼び出し側で非表示)。
115
+ export function percentileLabel(percentile) {
116
+ if (percentile === null)
117
+ return "";
118
+ if (percentile >= 90)
119
+ return `過去1年で上位${(100 - percentile).toFixed(0)}%水準`;
120
+ if (percentile >= 70)
121
+ return `過去1年で上位${(100 - percentile).toFixed(0)}%`;
122
+ if (percentile >= 30)
123
+ return `過去1年で中央値付近`;
124
+ if (percentile >= 10)
125
+ return `過去1年で下位${percentile.toFixed(0)}%`;
126
+ return `過去1年で下位${percentile.toFixed(0)}%水準`;
127
+ }
128
+ //# sourceMappingURL=quartile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quartile.js","sourceRoot":"","sources":["../../src/lib/quartile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Indicator, QuoteResult } from "./market-types.js";
2
+ export type RankingPeriod = "1d" | "1w" | "1m";
3
+ export type RankedItem = {
4
+ indicator: Indicator;
5
+ pct: number;
6
+ };
7
+ export declare function rankByPerformance(indicators: readonly Indicator[], quotes: Record<string, QuoteResult>, period: RankingPeriod): RankedItem[];
@@ -0,0 +1,29 @@
1
+ // 27 銘柄を期間別パフォーマンスでソートするランキング純関数。
2
+ // /today の PerformanceRanking で「上位 N / 下位 N」を表示するために使う。
3
+ //
4
+ // 期間:1d は changePercent、1w/1m は performance.d7 / d30 を使用。
5
+ // performance フィールドが無い銘柄は除外。
6
+ function getPctForPeriod(quote, period) {
7
+ if (period === "1d")
8
+ return quote.changePercent;
9
+ if (period === "1w")
10
+ return quote.performance?.d7 ?? null;
11
+ return quote.performance?.d30 ?? null;
12
+ }
13
+ // 全 INDICATORS から、指定期間のパフォーマンス降順で並べ替えた配列を返す。
14
+ // データ無し銘柄は除外。
15
+ export function rankByPerformance(indicators, quotes, period) {
16
+ const items = [];
17
+ for (const ind of indicators) {
18
+ const q = quotes[ind.symbol];
19
+ if (!q || "error" in q)
20
+ continue;
21
+ const pct = getPctForPeriod(q, period);
22
+ if (pct === null || Number.isNaN(pct))
23
+ continue;
24
+ items.push({ indicator: ind, pct });
25
+ }
26
+ items.sort((a, b) => b.pct - a.pct);
27
+ return items;
28
+ }
29
+ //# sourceMappingURL=rankings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rankings.js","sourceRoot":"","sources":["../../src/lib/rankings.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,wDAAwD;AACxD,EAAE;AACF,0DAA0D;AAC1D,6BAA6B;AAW7B,SAAS,eAAe,CAAC,KAAY,EAAE,MAAqB;IAC1D,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,aAAa,CAAC;IAChD,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,WAAW,EAAE,EAAE,IAAI,IAAI,CAAC;IAC1D,OAAO,KAAK,CAAC,WAAW,EAAE,GAAG,IAAI,IAAI,CAAC;AACxC,CAAC;AAED,6CAA6C;AAC7C,cAAc;AACd,MAAM,UAAU,iBAAiB,CAC/B,UAAgC,EAChC,MAAmC,EACnC,MAAqB;IAErB,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,CAAC,CAAC,IAAI,OAAO,IAAI,CAAC;YAAE,SAAS;QACjC,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACvC,IAAI,GAAG,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;YAAE,SAAS;QAChD,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACpC,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,7 @@
1
+ export type SectorEtf = {
2
+ symbol: string;
3
+ name: string;
4
+ description: string;
5
+ };
6
+ export declare const SECTOR_ETFS: readonly SectorEtf[];
7
+ export declare const SECTOR_SYMBOLS: readonly string[];