@helloxiaohu/plugin-stock-backtest-sim 0.0.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 (42) hide show
  1. package/README.md +3 -0
  2. package/dist/index.d.ts +18 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +44 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/lib/backtest-engine.d.ts +84 -0
  7. package/dist/lib/backtest-engine.d.ts.map +1 -0
  8. package/dist/lib/backtest-engine.js +339 -0
  9. package/dist/lib/backtest-engine.js.map +1 -0
  10. package/dist/lib/market-data-adapter.d.ts +12 -0
  11. package/dist/lib/market-data-adapter.d.ts.map +1 -0
  12. package/dist/lib/market-data-adapter.js +98 -0
  13. package/dist/lib/market-data-adapter.js.map +1 -0
  14. package/dist/lib/stock-backtest-sim.plugin.d.ts +3 -0
  15. package/dist/lib/stock-backtest-sim.plugin.d.ts.map +1 -0
  16. package/dist/lib/stock-backtest-sim.plugin.js +15 -0
  17. package/dist/lib/stock-backtest-sim.plugin.js.map +1 -0
  18. package/dist/lib/stock-backtest-sim.strategy.d.ts +333 -0
  19. package/dist/lib/stock-backtest-sim.strategy.d.ts.map +1 -0
  20. package/dist/lib/stock-backtest-sim.strategy.js +69 -0
  21. package/dist/lib/stock-backtest-sim.strategy.js.map +1 -0
  22. package/dist/lib/tools/backtest-momentum-auto.tool.d.ts +73 -0
  23. package/dist/lib/tools/backtest-momentum-auto.tool.d.ts.map +1 -0
  24. package/dist/lib/tools/backtest-momentum-auto.tool.js +72 -0
  25. package/dist/lib/tools/backtest-momentum-auto.tool.js.map +1 -0
  26. package/dist/lib/tools/backtest-momentum.tool.d.ts +127 -0
  27. package/dist/lib/tools/backtest-momentum.tool.d.ts.map +1 -0
  28. package/dist/lib/tools/backtest-momentum.tool.js +60 -0
  29. package/dist/lib/tools/backtest-momentum.tool.js.map +1 -0
  30. package/dist/lib/tools/stress-test.tool.d.ts +88 -0
  31. package/dist/lib/tools/stress-test.tool.d.ts.map +1 -0
  32. package/dist/lib/tools/stress-test.tool.js +51 -0
  33. package/dist/lib/tools/stress-test.tool.js.map +1 -0
  34. package/dist/lib/toolset.d.ts +7 -0
  35. package/dist/lib/toolset.d.ts.map +1 -0
  36. package/dist/lib/toolset.js +21 -0
  37. package/dist/lib/toolset.js.map +1 -0
  38. package/dist/lib/types.d.ts +21 -0
  39. package/dist/lib/types.d.ts.map +1 -0
  40. package/dist/lib/types.js +3 -0
  41. package/dist/lib/types.js.map +1 -0
  42. package/package.json +36 -0
@@ -0,0 +1,3 @@
1
+ export declare class StockBacktestSimPlugin {
2
+ }
3
+ //# sourceMappingURL=stock-backtest-sim.plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stock-backtest-sim.plugin.d.ts","sourceRoot":"","sources":["../../src/lib/stock-backtest-sim.plugin.ts"],"names":[],"mappings":"AAGA,qBAMa,sBAAsB;CAAG"}
@@ -0,0 +1,15 @@
1
+ import { __decorate } from "tslib";
2
+ import { XpertServerPlugin } from '@xpert-ai/plugin-sdk';
3
+ import { StockBacktestSimStrategy } from './stock-backtest-sim.strategy.js';
4
+ let StockBacktestSimPlugin = class StockBacktestSimPlugin {
5
+ };
6
+ StockBacktestSimPlugin = __decorate([
7
+ XpertServerPlugin({
8
+ imports: [],
9
+ providers: [StockBacktestSimStrategy],
10
+ controllers: [],
11
+ entities: []
12
+ })
13
+ ], StockBacktestSimPlugin);
14
+ export { StockBacktestSimPlugin };
15
+ //# sourceMappingURL=stock-backtest-sim.plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stock-backtest-sim.plugin.js","sourceRoot":"","sources":["../../src/lib/stock-backtest-sim.plugin.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAA;AAQpE,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;CAAG,CAAA;AAAzB,sBAAsB;IANlC,iBAAiB,CAAC;QACjB,OAAO,EAAE,EAAE;QACX,SAAS,EAAE,CAAC,wBAAwB,CAAC;QACrC,WAAW,EAAE,EAAE;QACf,QAAQ,EAAE,EAAE;KACb,CAAC;GACW,sBAAsB,CAAG"}
@@ -0,0 +1,333 @@
1
+ import { BuiltinToolset, IToolsetStrategy } from '@xpert-ai/plugin-sdk';
2
+ export declare class StockBacktestSimStrategy implements IToolsetStrategy<any> {
3
+ meta: {
4
+ author: string;
5
+ tags: string[];
6
+ name: string;
7
+ label: {
8
+ en_US: string;
9
+ zh_Hans: string;
10
+ };
11
+ description: {
12
+ en_US: string;
13
+ zh_Hans: string;
14
+ };
15
+ icon: {
16
+ type: "svg";
17
+ value: string;
18
+ };
19
+ configSchema: {
20
+ type: string;
21
+ properties: {
22
+ defaultFeeRate: {
23
+ type: string;
24
+ default: number;
25
+ 'x-ui': {
26
+ component: string;
27
+ label: string;
28
+ };
29
+ };
30
+ defaultSlippageRate: {
31
+ type: string;
32
+ default: number;
33
+ 'x-ui': {
34
+ component: string;
35
+ label: string;
36
+ };
37
+ };
38
+ defaultRebalanceDays: {
39
+ type: string;
40
+ default: number;
41
+ 'x-ui': {
42
+ component: string;
43
+ label: string;
44
+ };
45
+ };
46
+ };
47
+ required: any[];
48
+ };
49
+ };
50
+ validateConfig(config: any): Promise<void>;
51
+ create(config: any): Promise<BuiltinToolset>;
52
+ createTools(): (import("@langchain/core/tools").DynamicStructuredTool<import("zod").ZodObject<{
53
+ initialCapital: import("zod").ZodDefault<import("zod").ZodNumber>;
54
+ series: import("zod").ZodArray<import("zod").ZodObject<{
55
+ code: import("zod").ZodString;
56
+ prices: import("zod").ZodArray<import("zod").ZodObject<{
57
+ date: import("zod").ZodString;
58
+ close: import("zod").ZodNumber;
59
+ }, "strip", import("zod").ZodTypeAny, {
60
+ date?: string;
61
+ close?: number;
62
+ }, {
63
+ date?: string;
64
+ close?: number;
65
+ }>, "many">;
66
+ }, "strip", import("zod").ZodTypeAny, {
67
+ code?: string;
68
+ prices?: {
69
+ date?: string;
70
+ close?: number;
71
+ }[];
72
+ }, {
73
+ code?: string;
74
+ prices?: {
75
+ date?: string;
76
+ close?: number;
77
+ }[];
78
+ }>, "many">;
79
+ lookbackDays: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
80
+ rebalanceEveryDays: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
81
+ topN: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
82
+ feeRate: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
83
+ slippageRate: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
84
+ maxSingleWeight: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
85
+ cashReserveRatio: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
86
+ benchmarkSeries: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
87
+ date: import("zod").ZodString;
88
+ close: import("zod").ZodNumber;
89
+ }, "strip", import("zod").ZodTypeAny, {
90
+ date?: string;
91
+ close?: number;
92
+ }, {
93
+ date?: string;
94
+ close?: number;
95
+ }>, "many">>>;
96
+ }, "strip", import("zod").ZodTypeAny, {
97
+ initialCapital?: number;
98
+ series?: {
99
+ code?: string;
100
+ prices?: {
101
+ date?: string;
102
+ close?: number;
103
+ }[];
104
+ }[];
105
+ lookbackDays?: number;
106
+ rebalanceEveryDays?: number;
107
+ topN?: number;
108
+ feeRate?: number;
109
+ slippageRate?: number;
110
+ maxSingleWeight?: number;
111
+ cashReserveRatio?: number;
112
+ benchmarkSeries?: {
113
+ date?: string;
114
+ close?: number;
115
+ }[];
116
+ }, {
117
+ initialCapital?: number;
118
+ series?: {
119
+ code?: string;
120
+ prices?: {
121
+ date?: string;
122
+ close?: number;
123
+ }[];
124
+ }[];
125
+ lookbackDays?: number;
126
+ rebalanceEveryDays?: number;
127
+ topN?: number;
128
+ feeRate?: number;
129
+ slippageRate?: number;
130
+ maxSingleWeight?: number;
131
+ cashReserveRatio?: number;
132
+ benchmarkSeries?: {
133
+ date?: string;
134
+ close?: number;
135
+ }[];
136
+ }>, {
137
+ initialCapital?: number;
138
+ series?: {
139
+ code?: string;
140
+ prices?: {
141
+ date?: string;
142
+ close?: number;
143
+ }[];
144
+ }[];
145
+ lookbackDays?: number;
146
+ rebalanceEveryDays?: number;
147
+ topN?: number;
148
+ feeRate?: number;
149
+ slippageRate?: number;
150
+ maxSingleWeight?: number;
151
+ cashReserveRatio?: number;
152
+ benchmarkSeries?: {
153
+ date?: string;
154
+ close?: number;
155
+ }[];
156
+ }, {
157
+ initialCapital?: number;
158
+ series?: {
159
+ code?: string;
160
+ prices?: {
161
+ date?: string;
162
+ close?: number;
163
+ }[];
164
+ }[];
165
+ lookbackDays?: number;
166
+ rebalanceEveryDays?: number;
167
+ topN?: number;
168
+ feeRate?: number;
169
+ slippageRate?: number;
170
+ maxSingleWeight?: number;
171
+ cashReserveRatio?: number;
172
+ benchmarkSeries?: {
173
+ date?: string;
174
+ close?: number;
175
+ }[];
176
+ }, string> | import("@langchain/core/tools").DynamicStructuredTool<import("zod").ZodObject<{
177
+ codes: import("zod").ZodArray<import("zod").ZodString, "many">;
178
+ count: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
179
+ initialCapital: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
180
+ lookbackDays: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
181
+ rebalanceEveryDays: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
182
+ topN: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
183
+ feeRate: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
184
+ slippageRate: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
185
+ maxSingleWeight: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
186
+ cashReserveRatio: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
187
+ includeBenchmark: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodBoolean>>;
188
+ benchmarkCode: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodString>>;
189
+ timeoutMs: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
190
+ }, "strip", import("zod").ZodTypeAny, {
191
+ initialCapital?: number;
192
+ lookbackDays?: number;
193
+ rebalanceEveryDays?: number;
194
+ topN?: number;
195
+ feeRate?: number;
196
+ slippageRate?: number;
197
+ maxSingleWeight?: number;
198
+ cashReserveRatio?: number;
199
+ codes?: string[];
200
+ count?: number;
201
+ includeBenchmark?: boolean;
202
+ benchmarkCode?: string;
203
+ timeoutMs?: number;
204
+ }, {
205
+ initialCapital?: number;
206
+ lookbackDays?: number;
207
+ rebalanceEveryDays?: number;
208
+ topN?: number;
209
+ feeRate?: number;
210
+ slippageRate?: number;
211
+ maxSingleWeight?: number;
212
+ cashReserveRatio?: number;
213
+ codes?: string[];
214
+ count?: number;
215
+ includeBenchmark?: boolean;
216
+ benchmarkCode?: string;
217
+ timeoutMs?: number;
218
+ }>, {
219
+ initialCapital?: number;
220
+ lookbackDays?: number;
221
+ rebalanceEveryDays?: number;
222
+ topN?: number;
223
+ feeRate?: number;
224
+ slippageRate?: number;
225
+ maxSingleWeight?: number;
226
+ cashReserveRatio?: number;
227
+ codes?: string[];
228
+ count?: number;
229
+ includeBenchmark?: boolean;
230
+ benchmarkCode?: string;
231
+ timeoutMs?: number;
232
+ }, {
233
+ initialCapital?: number;
234
+ lookbackDays?: number;
235
+ rebalanceEveryDays?: number;
236
+ topN?: number;
237
+ feeRate?: number;
238
+ slippageRate?: number;
239
+ maxSingleWeight?: number;
240
+ cashReserveRatio?: number;
241
+ codes?: string[];
242
+ count?: number;
243
+ includeBenchmark?: boolean;
244
+ benchmarkCode?: string;
245
+ timeoutMs?: number;
246
+ }, string> | import("@langchain/core/tools").DynamicStructuredTool<import("zod").ZodObject<{
247
+ positions: import("zod").ZodArray<import("zod").ZodObject<{
248
+ code: import("zod").ZodString;
249
+ quantity: import("zod").ZodNumber;
250
+ price: import("zod").ZodNumber;
251
+ beta: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
252
+ }, "strip", import("zod").ZodTypeAny, {
253
+ code?: string;
254
+ quantity?: number;
255
+ price?: number;
256
+ beta?: number;
257
+ }, {
258
+ code?: string;
259
+ quantity?: number;
260
+ price?: number;
261
+ beta?: number;
262
+ }>, "many">;
263
+ scenarios: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
264
+ name: import("zod").ZodString;
265
+ marketShock: import("zod").ZodNumber;
266
+ betaScale: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
267
+ perSymbolShock: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodNumber>>>;
268
+ }, "strip", import("zod").ZodTypeAny, {
269
+ name?: string;
270
+ marketShock?: number;
271
+ betaScale?: number;
272
+ perSymbolShock?: Record<string, number>;
273
+ }, {
274
+ name?: string;
275
+ marketShock?: number;
276
+ betaScale?: number;
277
+ perSymbolShock?: Record<string, number>;
278
+ }>, "many">>>;
279
+ }, "strip", import("zod").ZodTypeAny, {
280
+ positions?: {
281
+ code?: string;
282
+ quantity?: number;
283
+ price?: number;
284
+ beta?: number;
285
+ }[];
286
+ scenarios?: {
287
+ name?: string;
288
+ marketShock?: number;
289
+ betaScale?: number;
290
+ perSymbolShock?: Record<string, number>;
291
+ }[];
292
+ }, {
293
+ positions?: {
294
+ code?: string;
295
+ quantity?: number;
296
+ price?: number;
297
+ beta?: number;
298
+ }[];
299
+ scenarios?: {
300
+ name?: string;
301
+ marketShock?: number;
302
+ betaScale?: number;
303
+ perSymbolShock?: Record<string, number>;
304
+ }[];
305
+ }>, {
306
+ positions?: {
307
+ code?: string;
308
+ quantity?: number;
309
+ price?: number;
310
+ beta?: number;
311
+ }[];
312
+ scenarios?: {
313
+ name?: string;
314
+ marketShock?: number;
315
+ betaScale?: number;
316
+ perSymbolShock?: Record<string, number>;
317
+ }[];
318
+ }, {
319
+ positions?: {
320
+ code?: string;
321
+ quantity?: number;
322
+ price?: number;
323
+ beta?: number;
324
+ }[];
325
+ scenarios?: {
326
+ name?: string;
327
+ marketShock?: number;
328
+ betaScale?: number;
329
+ perSymbolShock?: Record<string, number>;
330
+ }[];
331
+ }, string>)[];
332
+ }
333
+ //# sourceMappingURL=stock-backtest-sim.strategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stock-backtest-sim.strategy.d.ts","sourceRoot":"","sources":["../../src/lib/stock-backtest-sim.strategy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAmB,MAAM,sBAAsB,CAAA;AAOxF,qBAEa,wBAAyB,YAAW,gBAAgB,CAAC,GAAG,CAAC;IACpE,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAqCH;IAED,cAAc,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpC,MAAM,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,cAAc,CAAC;IAIlD,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAOZ"}
@@ -0,0 +1,69 @@
1
+ import { __decorate } from "tslib";
2
+ import { Injectable } from '@nestjs/common';
3
+ import { ToolsetStrategy } from '@xpert-ai/plugin-sdk';
4
+ import { StockBacktestSimProvider, icon } from './types.js';
5
+ import { StockBacktestSimToolset } from './toolset.js';
6
+ import { buildBacktestMomentumTool } from './tools/backtest-momentum.tool.js';
7
+ import { buildBacktestMomentumAutoTool } from './tools/backtest-momentum-auto.tool.js';
8
+ import { buildStressTestTool } from './tools/stress-test.tool.js';
9
+ let StockBacktestSimStrategy = class StockBacktestSimStrategy {
10
+ constructor() {
11
+ this.meta = {
12
+ author: 'Xpert AI',
13
+ tags: ['backtest', 'simulation', 'stress', '回测', '仿真'],
14
+ name: StockBacktestSimProvider,
15
+ label: {
16
+ en_US: 'Stock Backtest & Simulation',
17
+ zh_Hans: '股票回测与仿真'
18
+ },
19
+ description: {
20
+ en_US: 'Run historical momentum backtests and portfolio stress simulations.',
21
+ zh_Hans: '执行历史动量回测与组合压力测试仿真。'
22
+ },
23
+ icon: {
24
+ type: 'svg',
25
+ value: icon
26
+ },
27
+ configSchema: {
28
+ type: 'object',
29
+ properties: {
30
+ defaultFeeRate: {
31
+ type: 'number',
32
+ default: 0.0005,
33
+ 'x-ui': { component: 'input', label: 'Default Fee Rate' }
34
+ },
35
+ defaultSlippageRate: {
36
+ type: 'number',
37
+ default: 0.0005,
38
+ 'x-ui': { component: 'input', label: 'Default Slippage Rate' }
39
+ },
40
+ defaultRebalanceDays: {
41
+ type: 'number',
42
+ default: 5,
43
+ 'x-ui': { component: 'input', label: 'Default Rebalance Days' }
44
+ }
45
+ },
46
+ required: []
47
+ }
48
+ };
49
+ }
50
+ validateConfig(config) {
51
+ return Promise.resolve();
52
+ }
53
+ async create(config) {
54
+ return new StockBacktestSimToolset(config);
55
+ }
56
+ createTools() {
57
+ return [
58
+ buildBacktestMomentumTool(),
59
+ buildBacktestMomentumAutoTool(),
60
+ buildStressTestTool()
61
+ ];
62
+ }
63
+ };
64
+ StockBacktestSimStrategy = __decorate([
65
+ Injectable(),
66
+ ToolsetStrategy(StockBacktestSimProvider)
67
+ ], StockBacktestSimStrategy);
68
+ export { StockBacktestSimStrategy };
69
+ //# sourceMappingURL=stock-backtest-sim.strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stock-backtest-sim.strategy.js","sourceRoot":"","sources":["../../src/lib/stock-backtest-sim.strategy.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAoC,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACxF,OAAO,EAAE,wBAAwB,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAC7E,OAAO,EAAE,6BAA6B,EAAE,MAAM,wCAAwC,CAAA;AACtF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAI1D,IAAM,wBAAwB,GAA9B,MAAM,wBAAwB;IAA9B;QACL,SAAI,GAAG;YACL,MAAM,EAAE,UAAU;YAClB,IAAI,EAAE,CAAC,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC;YACtD,IAAI,EAAE,wBAAwB;YAC9B,KAAK,EAAE;gBACL,KAAK,EAAE,6BAA6B;gBACpC,OAAO,EAAE,SAAS;aACnB;YACD,WAAW,EAAE;gBACX,KAAK,EAAE,qEAAqE;gBAC5E,OAAO,EAAE,oBAAoB;aAC9B;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,KAAc;gBACpB,KAAK,EAAE,IAAI;aACZ;YACD,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,cAAc,EAAE;wBACd,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,MAAM;wBACf,MAAM,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE;qBAC1D;oBACD,mBAAmB,EAAE;wBACnB,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,MAAM;wBACf,MAAM,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE;qBAC/D;oBACD,oBAAoB,EAAE;wBACpB,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,CAAC;wBACV,MAAM,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,wBAAwB,EAAE;qBAChE;iBACF;gBACD,QAAQ,EAAE,EAAE;aACb;SACF,CAAA;IAiBH,CAAC;IAfC,cAAc,CAAC,MAAW;QACxB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;IAC1B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAW;QACtB,OAAO,IAAI,uBAAuB,CAAC,MAAM,CAAC,CAAA;IAC5C,CAAC;IAED,WAAW;QACT,OAAO;YACL,yBAAyB,EAAE;YAC3B,6BAA6B,EAAE;YAC/B,mBAAmB,EAAE;SACtB,CAAA;IACH,CAAC;CACF,CAAA;AAvDY,wBAAwB;IAFpC,UAAU,EAAE;IACZ,eAAe,CAAC,wBAAwB,CAAC;GAC7B,wBAAwB,CAuDpC"}
@@ -0,0 +1,73 @@
1
+ import { z } from 'zod';
2
+ export declare function buildBacktestMomentumAutoTool(): import("@langchain/core/tools").DynamicStructuredTool<z.ZodObject<{
3
+ codes: z.ZodArray<z.ZodString, "many">;
4
+ count: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
5
+ initialCapital: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
6
+ lookbackDays: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
7
+ rebalanceEveryDays: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
8
+ topN: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
9
+ feeRate: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
10
+ slippageRate: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
11
+ maxSingleWeight: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
12
+ cashReserveRatio: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
13
+ includeBenchmark: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
14
+ benchmarkCode: z.ZodDefault<z.ZodOptional<z.ZodString>>;
15
+ timeoutMs: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
16
+ }, "strip", z.ZodTypeAny, {
17
+ initialCapital?: number;
18
+ lookbackDays?: number;
19
+ rebalanceEveryDays?: number;
20
+ topN?: number;
21
+ feeRate?: number;
22
+ slippageRate?: number;
23
+ maxSingleWeight?: number;
24
+ cashReserveRatio?: number;
25
+ codes?: string[];
26
+ count?: number;
27
+ includeBenchmark?: boolean;
28
+ benchmarkCode?: string;
29
+ timeoutMs?: number;
30
+ }, {
31
+ initialCapital?: number;
32
+ lookbackDays?: number;
33
+ rebalanceEveryDays?: number;
34
+ topN?: number;
35
+ feeRate?: number;
36
+ slippageRate?: number;
37
+ maxSingleWeight?: number;
38
+ cashReserveRatio?: number;
39
+ codes?: string[];
40
+ count?: number;
41
+ includeBenchmark?: boolean;
42
+ benchmarkCode?: string;
43
+ timeoutMs?: number;
44
+ }>, {
45
+ initialCapital?: number;
46
+ lookbackDays?: number;
47
+ rebalanceEveryDays?: number;
48
+ topN?: number;
49
+ feeRate?: number;
50
+ slippageRate?: number;
51
+ maxSingleWeight?: number;
52
+ cashReserveRatio?: number;
53
+ codes?: string[];
54
+ count?: number;
55
+ includeBenchmark?: boolean;
56
+ benchmarkCode?: string;
57
+ timeoutMs?: number;
58
+ }, {
59
+ initialCapital?: number;
60
+ lookbackDays?: number;
61
+ rebalanceEveryDays?: number;
62
+ topN?: number;
63
+ feeRate?: number;
64
+ slippageRate?: number;
65
+ maxSingleWeight?: number;
66
+ cashReserveRatio?: number;
67
+ codes?: string[];
68
+ count?: number;
69
+ includeBenchmark?: boolean;
70
+ benchmarkCode?: string;
71
+ timeoutMs?: number;
72
+ }, string>;
73
+ //# sourceMappingURL=backtest-momentum-auto.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backtest-momentum-auto.tool.d.ts","sourceRoot":"","sources":["../../../src/lib/tools/backtest-momentum-auto.tool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,wBAAgB,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAsE5C"}
@@ -0,0 +1,72 @@
1
+ import { tool } from '@langchain/core/tools';
2
+ import { getErrorMessage } from '@xpert-ai/plugin-sdk';
3
+ import { z } from 'zod';
4
+ import { runMomentumBacktest } from '../backtest-engine.js';
5
+ import { MarketDataAdapter } from '../market-data-adapter.js';
6
+ export function buildBacktestMomentumAutoTool() {
7
+ return tool(async (input) => {
8
+ try {
9
+ const codes = (input.codes || []).map((item) => String(item || '').trim()).filter(Boolean);
10
+ if (codes.length < 2) {
11
+ throw new Error('至少需要提供2个股票代码');
12
+ }
13
+ const adapter = new MarketDataAdapter({ timeoutMs: Number(input.timeoutMs || 10000) });
14
+ const series = await adapter.fetchSeriesBatch(codes, Number(input.count || 200));
15
+ if (series.length < 2) {
16
+ throw new Error('可用行情序列不足,至少需要2只股票成功取数');
17
+ }
18
+ let benchmarkSeries = undefined;
19
+ if (input.includeBenchmark !== false) {
20
+ try {
21
+ const benchmark = await adapter.fetchDailySeries(String(input.benchmarkCode || 'sh000300'), Number(input.count || 200));
22
+ benchmarkSeries = benchmark.prices;
23
+ }
24
+ catch (error) {
25
+ const message = String(error?.message || 'unknown');
26
+ console.warn(`[stock-backtest-sim] benchmark fetch failed: ${message}`);
27
+ }
28
+ }
29
+ const result = runMomentumBacktest(series, {
30
+ initialCapital: Number(input.initialCapital),
31
+ lookbackDays: input.lookbackDays,
32
+ rebalanceEveryDays: input.rebalanceEveryDays,
33
+ topN: input.topN,
34
+ feeRate: input.feeRate,
35
+ slippageRate: input.slippageRate,
36
+ maxSingleWeight: input.maxSingleWeight,
37
+ cashReserveRatio: input.cashReserveRatio,
38
+ benchmarkSeries
39
+ });
40
+ return JSON.stringify({
41
+ inputSummary: {
42
+ requestedCodes: codes,
43
+ loadedSeries: series.map((item) => ({ code: item.code, points: item.prices.length })),
44
+ benchmarkCode: input.includeBenchmark === false ? null : String(input.benchmarkCode || 'sh000300')
45
+ },
46
+ ...result
47
+ }, null, 2);
48
+ }
49
+ catch (error) {
50
+ throw new Error(`自动取数回测失败: ${getErrorMessage(error)}`);
51
+ }
52
+ }, {
53
+ name: 'backtest_momentum_strategy_auto',
54
+ description: '自动拉取行情并执行动量回测,输出收益、基准对比、成本拆解和归因报告',
55
+ schema: z.object({
56
+ codes: z.array(z.string()).min(2).describe('股票代码列表,例如 ["600519", "000001", "300750"]'),
57
+ count: z.number().int().min(30).max(1000).optional().default(200).describe('拉取历史K线数量'),
58
+ initialCapital: z.number().positive().optional().default(1_000_000),
59
+ lookbackDays: z.number().int().min(5).max(250).optional().default(20),
60
+ rebalanceEveryDays: z.number().int().min(1).max(60).optional().default(5),
61
+ topN: z.number().int().min(1).max(20).optional().default(3),
62
+ feeRate: z.number().min(0).max(0.01).optional().default(0.0005),
63
+ slippageRate: z.number().min(0).max(0.01).optional().default(0.0005),
64
+ maxSingleWeight: z.number().min(0.01).max(1).optional().default(0.4),
65
+ cashReserveRatio: z.number().min(0).max(0.5).optional().default(0.05),
66
+ includeBenchmark: z.boolean().optional().default(true),
67
+ benchmarkCode: z.string().optional().default('sh000300').describe('基准代码,默认沪深300'),
68
+ timeoutMs: z.number().int().min(1000).max(30000).optional().default(10000)
69
+ })
70
+ });
71
+ }
72
+ //# sourceMappingURL=backtest-momentum-auto.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backtest-momentum-auto.tool.js","sourceRoot":"","sources":["../../../src/lib/tools/backtest-momentum-auto.tool.ts"],"names":[],"mappings":"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"}