fi-pool-server 0.1.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.
Files changed (93) hide show
  1. package/README.md +26 -0
  2. package/dist/db/index.d.ts +18 -0
  3. package/dist/db/index.d.ts.map +1 -0
  4. package/dist/db/index.js +58 -0
  5. package/dist/db/index.js.map +1 -0
  6. package/dist/db/migrate.d.ts +11 -0
  7. package/dist/db/migrate.d.ts.map +1 -0
  8. package/dist/db/migrate.js +42 -0
  9. package/dist/db/migrate.js.map +1 -0
  10. package/dist/db/schema.d.ts +1101 -0
  11. package/dist/db/schema.d.ts.map +1 -0
  12. package/dist/db/schema.js +149 -0
  13. package/dist/db/schema.js.map +1 -0
  14. package/dist/index.d.ts +50 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +69 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/services/analysis.d.ts +62 -0
  19. package/dist/services/analysis.d.ts.map +1 -0
  20. package/dist/services/analysis.js +74 -0
  21. package/dist/services/analysis.js.map +1 -0
  22. package/dist/services/daily-info.d.ts +150 -0
  23. package/dist/services/daily-info.d.ts.map +1 -0
  24. package/dist/services/daily-info.js +293 -0
  25. package/dist/services/daily-info.js.map +1 -0
  26. package/dist/services/embedding.d.ts +89 -0
  27. package/dist/services/embedding.d.ts.map +1 -0
  28. package/dist/services/embedding.js +227 -0
  29. package/dist/services/embedding.js.map +1 -0
  30. package/dist/services/llm.d.ts +64 -0
  31. package/dist/services/llm.d.ts.map +1 -0
  32. package/dist/services/llm.js +109 -0
  33. package/dist/services/llm.js.map +1 -0
  34. package/dist/services/pipeline.d.ts +161 -0
  35. package/dist/services/pipeline.d.ts.map +1 -0
  36. package/dist/services/pipeline.js +844 -0
  37. package/dist/services/pipeline.js.map +1 -0
  38. package/dist/services/pool.d.ts +142 -0
  39. package/dist/services/pool.d.ts.map +1 -0
  40. package/dist/services/pool.js +208 -0
  41. package/dist/services/pool.js.map +1 -0
  42. package/dist/services/sentiment.d.ts +31 -0
  43. package/dist/services/sentiment.d.ts.map +1 -0
  44. package/dist/services/sentiment.js +76 -0
  45. package/dist/services/sentiment.js.map +1 -0
  46. package/dist/services/session.d.ts +117 -0
  47. package/dist/services/session.d.ts.map +1 -0
  48. package/dist/services/session.js +176 -0
  49. package/dist/services/session.js.map +1 -0
  50. package/dist/services/stock.d.ts +82 -0
  51. package/dist/services/stock.d.ts.map +1 -0
  52. package/dist/services/stock.js +99 -0
  53. package/dist/services/stock.js.map +1 -0
  54. package/dist/services/word-count.d.ts +61 -0
  55. package/dist/services/word-count.d.ts.map +1 -0
  56. package/dist/services/word-count.js +120 -0
  57. package/dist/services/word-count.js.map +1 -0
  58. package/dist/tools/auxiliary.d.ts +93 -0
  59. package/dist/tools/auxiliary.d.ts.map +1 -0
  60. package/dist/tools/auxiliary.js +204 -0
  61. package/dist/tools/auxiliary.js.map +1 -0
  62. package/dist/tools/command.d.ts +193 -0
  63. package/dist/tools/command.d.ts.map +1 -0
  64. package/dist/tools/command.js +263 -0
  65. package/dist/tools/command.js.map +1 -0
  66. package/dist/tools/execute.d.ts +109 -0
  67. package/dist/tools/execute.d.ts.map +1 -0
  68. package/dist/tools/execute.js +112 -0
  69. package/dist/tools/execute.js.map +1 -0
  70. package/dist/tools/manager.d.ts +150 -0
  71. package/dist/tools/manager.d.ts.map +1 -0
  72. package/dist/tools/manager.js +200 -0
  73. package/dist/tools/manager.js.map +1 -0
  74. package/dist/tools/query.d.ts +163 -0
  75. package/dist/tools/query.d.ts.map +1 -0
  76. package/dist/tools/query.js +190 -0
  77. package/dist/tools/query.js.map +1 -0
  78. package/dist/utils/http-client.d.ts +87 -0
  79. package/dist/utils/http-client.d.ts.map +1 -0
  80. package/dist/utils/http-client.js +211 -0
  81. package/dist/utils/http-client.js.map +1 -0
  82. package/dist/utils/indicators.d.ts +194 -0
  83. package/dist/utils/indicators.d.ts.map +1 -0
  84. package/dist/utils/indicators.js +395 -0
  85. package/dist/utils/indicators.js.map +1 -0
  86. package/dist/utils/signals.d.ts +65 -0
  87. package/dist/utils/signals.d.ts.map +1 -0
  88. package/dist/utils/signals.js +171 -0
  89. package/dist/utils/signals.js.map +1 -0
  90. package/drizzle/0000_equal_marvel_apes.sql +124 -0
  91. package/drizzle/meta/0000_snapshot.json +858 -0
  92. package/drizzle/meta/_journal.json +13 -0
  93. package/package.json +58 -0
@@ -0,0 +1,171 @@
1
+ /**
2
+ * 信号检测工具模块
3
+ *
4
+ * 基于技术指标识别买入/卖出信号。
5
+ * 用于在流水线中生成每日分析报告的 signals 字段。
6
+ *
7
+ * @module signals
8
+ */
9
+ import { calcMA } from './indicators.js';
10
+ // ─── 默认值 ───────────────────────────────────────────────────
11
+ /** 空信号结果(所有信号为 false,量比为 0) */
12
+ const EMPTY_SIGNALS = {
13
+ goldenCross: false,
14
+ deadCross: false,
15
+ overbought: false,
16
+ oversold: false,
17
+ volumeSpike: false,
18
+ volumeRatio: 0,
19
+ };
20
+ // ─── 信号检测 ─────────────────────────────────────────────────
21
+ /**
22
+ * 检测技术信号
23
+ *
24
+ * 综合判断金叉/死叉、超买/超卖、放量等信号。
25
+ *
26
+ * 金叉/死叉判断逻辑:
27
+ * 计算 MA5 和 MA10 完整序列,取最后一个有效值及其前一个值进行比较。
28
+ * 金叉条件:前值 MA5 ≤ MA10 且 现值 MA5 > MA10
29
+ * 死叉条件:前值 MA5 ≥ MA10 且 现值 MA5 < MA10
30
+ *
31
+ * 量比逻辑:
32
+ * 取最后 5 个交易日(不含当日)成交量的平均值作为基准,
33
+ * 量比 = 当日成交量 / 基准均量。
34
+ *
35
+ * @param data - 完整 OHLCV 数组(按日期升序排列)
36
+ * @param latestMA - 当前最新的 MA5 与 MA10 值(由调用方预计算传入)
37
+ * @param latestRSI14 - 当前最新的 RSI14 值(由调用方预计算传入)
38
+ * @returns 信号检测结果
39
+ *
40
+ * @example
41
+ * ```typescript
42
+ * const ma5 = calcMA(data, 5);
43
+ * const ma10 = calcMA(data, 10);
44
+ * const rsi14 = calcRSI(data, 14);
45
+ * const signals = detectSignals(
46
+ * data,
47
+ * { ma5: ma5[ma5.length - 1], ma10: ma10[ma10.length - 1] },
48
+ * rsi14[rsi14.length - 1]
49
+ * );
50
+ * ```
51
+ */
52
+ export function detectSignals(data, latestMA, latestRSI14) {
53
+ if (data.length === 0) {
54
+ return { ...EMPTY_SIGNALS };
55
+ }
56
+ return {
57
+ goldenCross: detectGoldenCross(data),
58
+ deadCross: detectDeadCross(data),
59
+ overbought: latestRSI14 !== null && latestRSI14 > 80,
60
+ oversold: latestRSI14 !== null && latestRSI14 < 20,
61
+ volumeSpike: detectVolumeSpike(data),
62
+ volumeRatio: calcVolumeRatio(data),
63
+ };
64
+ }
65
+ // ─── 内部检测函数 ─────────────────────────────────────────────
66
+ /**
67
+ * 从完整的 MA 序列中定位最后一个有效索引
68
+ *
69
+ * @param ma - 可能含 null 的 MA 数组
70
+ * @returns 最后一个非 null 值的索引,如无有效值返回 -1
71
+ */
72
+ function lastValidIndex(ma) {
73
+ for (let i = ma.length - 1; i >= 0; i--) {
74
+ if (ma[i] !== null)
75
+ return i;
76
+ }
77
+ return -1;
78
+ }
79
+ /**
80
+ * 检测金叉:MA5 上穿 MA10
81
+ *
82
+ * 从 data 中重新计算 MA5 和 MA10 序列,
83
+ * 判断最近一个有效位置是否发生上穿。
84
+ *
85
+ * @param data - OHLCV 数组
86
+ * @returns 是否发生金叉
87
+ */
88
+ function detectGoldenCross(data) {
89
+ const ma5 = calcMA(data, 5);
90
+ const ma10 = calcMA(data, 10);
91
+ const idx = lastValidIndex(ma5);
92
+ if (idx < 1)
93
+ return false;
94
+ if (ma5[idx - 1] === null || ma10[idx - 1] === null || ma10[idx] === null) {
95
+ return false;
96
+ }
97
+ // 金叉:前值 MA5 ≤ MA10,现值 MA5 > MA10
98
+ return ma5[idx - 1] <= ma10[idx - 1] && ma5[idx] > ma10[idx];
99
+ }
100
+ /**
101
+ * 检测死叉:MA5 下穿 MA10
102
+ *
103
+ * @param data - OHLCV 数组
104
+ * @returns 是否发生死叉
105
+ */
106
+ function detectDeadCross(data) {
107
+ const ma5 = calcMA(data, 5);
108
+ const ma10 = calcMA(data, 10);
109
+ const idx = lastValidIndex(ma5);
110
+ if (idx < 1)
111
+ return false;
112
+ if (ma5[idx - 1] === null || ma10[idx - 1] === null || ma10[idx] === null) {
113
+ return false;
114
+ }
115
+ // 死叉:前值 MA5 ≥ MA10,现值 MA5 < MA10
116
+ return ma5[idx - 1] >= ma10[idx - 1] && ma5[idx] < ma10[idx];
117
+ }
118
+ /**
119
+ * 检测放量信号
120
+ *
121
+ * 当日成交量 > 前 5 日均量 × 2。
122
+ * 若数据不足 6 个交易日,返回 false。
123
+ *
124
+ * @param data - OHLCV 数组
125
+ * @returns 是否放量
126
+ */
127
+ function detectVolumeSpike(data) {
128
+ if (data.length < 6)
129
+ return false;
130
+ const currentVolume = data[data.length - 1].volume;
131
+ const avgVolume = averageOfLastN(data, 5, data.length - 1);
132
+ if (avgVolume <= 0)
133
+ return false;
134
+ return currentVolume > avgVolume * 2;
135
+ }
136
+ /**
137
+ * 计算量比
138
+ *
139
+ * 量比 = 当日成交量 / 前 5 日均量。
140
+ * 若数据不足 6 个交易日或均量为 0,返回 0。
141
+ *
142
+ * @param data - OHLCV 数组
143
+ * @returns 量比值
144
+ */
145
+ function calcVolumeRatio(data) {
146
+ if (data.length < 6)
147
+ return 0;
148
+ const currentVolume = data[data.length - 1].volume;
149
+ const avgVolume = averageOfLastN(data, 5, data.length - 1);
150
+ if (avgVolume <= 0)
151
+ return 0;
152
+ return currentVolume / avgVolume;
153
+ }
154
+ /**
155
+ * 计算最近 N 个交易日的成交量平均值(排除指定索引)
156
+ *
157
+ * @param data - OHLCV 数组
158
+ * @param count - 取多少天
159
+ * @param excludeIndex - 要排除的索引(通常是当天)
160
+ * @returns 平均成交量
161
+ */
162
+ function averageOfLastN(data, count, excludeIndex) {
163
+ let sum = 0;
164
+ let actualCount = 0;
165
+ for (let i = excludeIndex - 1; i >= 0 && actualCount < count; i--) {
166
+ sum += data[i].volume;
167
+ actualCount++;
168
+ }
169
+ return actualCount > 0 ? sum / actualCount : 0;
170
+ }
171
+ //# sourceMappingURL=signals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signals.js","sourceRoot":"","sources":["../../src/utils/signals.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ CREATE TABLE `analysis_roler` (
2
+ `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
3
+ `code` text NOT NULL,
4
+ `date` text NOT NULL,
5
+ `role` text NOT NULL,
6
+ `responsibility` text DEFAULT '' NOT NULL,
7
+ `report` text DEFAULT '' NOT NULL,
8
+ `round` integer DEFAULT 1 NOT NULL,
9
+ `word_count` integer DEFAULT 0 NOT NULL,
10
+ `created_at` text DEFAULT (datetime('now')) NOT NULL,
11
+ FOREIGN KEY (`code`) REFERENCES `stock`(`code`) ON UPDATE no action ON DELETE no action
12
+ );
13
+ --> statement-breakpoint
14
+ CREATE TABLE `config` (
15
+ `key` text PRIMARY KEY NOT NULL,
16
+ `value` text DEFAULT '' NOT NULL,
17
+ `updated_at` text DEFAULT (datetime('now')) NOT NULL
18
+ );
19
+ --> statement-breakpoint
20
+ CREATE TABLE `daily_analysis_report` (
21
+ `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
22
+ `code` text NOT NULL,
23
+ `date` text NOT NULL,
24
+ `summary` text DEFAULT '' NOT NULL,
25
+ `indicators` text DEFAULT '{}' NOT NULL,
26
+ `signals` text DEFAULT '{}' NOT NULL,
27
+ `created_at` text DEFAULT (datetime('now')) NOT NULL,
28
+ FOREIGN KEY (`code`) REFERENCES `stock`(`code`) ON UPDATE no action ON DELETE no action
29
+ );
30
+ --> statement-breakpoint
31
+ CREATE TABLE `daily_info` (
32
+ `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
33
+ `code` text NOT NULL,
34
+ `date` text NOT NULL,
35
+ `open` real NOT NULL,
36
+ `high` real NOT NULL,
37
+ `low` real NOT NULL,
38
+ `close` real NOT NULL,
39
+ `volume` integer NOT NULL,
40
+ FOREIGN KEY (`code`) REFERENCES `stock`(`code`) ON UPDATE no action ON DELETE no action
41
+ );
42
+ --> statement-breakpoint
43
+ CREATE TABLE `final_report` (
44
+ `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
45
+ `code` text NOT NULL,
46
+ `date` text NOT NULL,
47
+ `summary` text DEFAULT '' NOT NULL,
48
+ `full_report` text DEFAULT '' NOT NULL,
49
+ `role_summary` text DEFAULT '[]' NOT NULL,
50
+ `pipeline_id` text DEFAULT '' NOT NULL,
51
+ `created_at` text DEFAULT (datetime('now')) NOT NULL,
52
+ FOREIGN KEY (`code`) REFERENCES `stock`(`code`) ON UPDATE no action ON DELETE no action
53
+ );
54
+ --> statement-breakpoint
55
+ CREATE TABLE `pool` (
56
+ `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
57
+ `name` text NOT NULL,
58
+ `desc` text DEFAULT '' NOT NULL,
59
+ `pool_analysis` text DEFAULT '' NOT NULL,
60
+ `pool_signal` integer DEFAULT 0 NOT NULL,
61
+ `created_at` text DEFAULT (datetime('now')) NOT NULL,
62
+ `updated_at` text DEFAULT (datetime('now')) NOT NULL
63
+ );
64
+ --> statement-breakpoint
65
+ CREATE TABLE `pool_stock` (
66
+ `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
67
+ `pool_id` integer NOT NULL,
68
+ `stock_code` text NOT NULL,
69
+ `added_at` text DEFAULT (datetime('now')) NOT NULL,
70
+ FOREIGN KEY (`pool_id`) REFERENCES `pool`(`id`) ON UPDATE no action ON DELETE no action,
71
+ FOREIGN KEY (`stock_code`) REFERENCES `stock`(`code`) ON UPDATE no action ON DELETE no action
72
+ );
73
+ --> statement-breakpoint
74
+ CREATE TABLE `sentiment_report` (
75
+ `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
76
+ `code` text NOT NULL,
77
+ `date` text NOT NULL,
78
+ `report` text DEFAULT '' NOT NULL,
79
+ `sources` text DEFAULT '[]' NOT NULL,
80
+ `created_at` text DEFAULT (datetime('now')) NOT NULL,
81
+ FOREIGN KEY (`code`) REFERENCES `stock`(`code`) ON UPDATE no action ON DELETE no action
82
+ );
83
+ --> statement-breakpoint
84
+ CREATE TABLE `stock` (
85
+ `code` text PRIMARY KEY NOT NULL,
86
+ `name` text NOT NULL,
87
+ `current_price` real DEFAULT 0 NOT NULL,
88
+ `updated_at` text DEFAULT (datetime('now')) NOT NULL
89
+ );
90
+ --> statement-breakpoint
91
+ CREATE TABLE `vec_embedding` (
92
+ `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
93
+ `content_type` text NOT NULL,
94
+ `content_code` text NOT NULL,
95
+ `content_date` text NOT NULL,
96
+ `content_text` text NOT NULL,
97
+ `embedding` blob,
98
+ `created_at` text DEFAULT (datetime('now')) NOT NULL
99
+ );
100
+ --> statement-breakpoint
101
+ CREATE INDEX `idx_ar_code_date` ON `analysis_roler` (`code`,`date`);--> statement-breakpoint
102
+ CREATE INDEX `idx_ar_role` ON `analysis_roler` (`role`);--> statement-breakpoint
103
+ CREATE UNIQUE INDEX `idx_dar_unique` ON `daily_analysis_report` (`code`,`date`);--> statement-breakpoint
104
+ CREATE INDEX `idx_dar_code` ON `daily_analysis_report` (`code`);--> statement-breakpoint
105
+ CREATE INDEX `idx_dar_date` ON `daily_analysis_report` (`date`);--> statement-breakpoint
106
+ CREATE UNIQUE INDEX `idx_daily_info_unique` ON `daily_info` (`code`,`date`);--> statement-breakpoint
107
+ CREATE INDEX `idx_daily_info_code` ON `daily_info` (`code`);--> statement-breakpoint
108
+ CREATE INDEX `idx_daily_info_date` ON `daily_info` (`date`);--> statement-breakpoint
109
+ CREATE UNIQUE INDEX `idx_fr_unique` ON `final_report` (`code`,`date`);--> statement-breakpoint
110
+ CREATE INDEX `idx_fr_code` ON `final_report` (`code`);--> statement-breakpoint
111
+ CREATE INDEX `idx_fr_date` ON `final_report` (`date`);--> statement-breakpoint
112
+ CREATE UNIQUE INDEX `pool_name_unique` ON `pool` (`name`);--> statement-breakpoint
113
+ CREATE INDEX `idx_pool_name` ON `pool` (`name`);--> statement-breakpoint
114
+ CREATE INDEX `idx_pool_signal` ON `pool` (`pool_signal`);--> statement-breakpoint
115
+ CREATE UNIQUE INDEX `idx_pool_stock_unique` ON `pool_stock` (`pool_id`,`stock_code`);--> statement-breakpoint
116
+ CREATE INDEX `idx_pool_stock_pool` ON `pool_stock` (`pool_id`);--> statement-breakpoint
117
+ CREATE INDEX `idx_pool_stock_stock` ON `pool_stock` (`stock_code`);--> statement-breakpoint
118
+ CREATE UNIQUE INDEX `idx_sr_unique` ON `sentiment_report` (`code`,`date`);--> statement-breakpoint
119
+ CREATE INDEX `idx_sr_code` ON `sentiment_report` (`code`);--> statement-breakpoint
120
+ CREATE INDEX `idx_sr_date` ON `sentiment_report` (`date`);--> statement-breakpoint
121
+ CREATE INDEX `idx_stock_name` ON `stock` (`name`);--> statement-breakpoint
122
+ CREATE INDEX `idx_ve_type` ON `vec_embedding` (`content_type`);--> statement-breakpoint
123
+ CREATE INDEX `idx_ve_code` ON `vec_embedding` (`content_code`);--> statement-breakpoint
124
+ CREATE INDEX `idx_ve_type_code_date` ON `vec_embedding` (`content_type`,`content_code`,`content_date`);