@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,127 @@
1
+ import { z } from 'zod';
2
+ export declare function buildBacktestMomentumTool(): import("@langchain/core/tools").DynamicStructuredTool<z.ZodObject<{
3
+ initialCapital: z.ZodDefault<z.ZodNumber>;
4
+ series: z.ZodArray<z.ZodObject<{
5
+ code: z.ZodString;
6
+ prices: z.ZodArray<z.ZodObject<{
7
+ date: z.ZodString;
8
+ close: z.ZodNumber;
9
+ }, "strip", z.ZodTypeAny, {
10
+ date?: string;
11
+ close?: number;
12
+ }, {
13
+ date?: string;
14
+ close?: number;
15
+ }>, "many">;
16
+ }, "strip", z.ZodTypeAny, {
17
+ code?: string;
18
+ prices?: {
19
+ date?: string;
20
+ close?: number;
21
+ }[];
22
+ }, {
23
+ code?: string;
24
+ prices?: {
25
+ date?: string;
26
+ close?: number;
27
+ }[];
28
+ }>, "many">;
29
+ lookbackDays: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
30
+ rebalanceEveryDays: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
31
+ topN: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
32
+ feeRate: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
33
+ slippageRate: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
34
+ maxSingleWeight: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
35
+ cashReserveRatio: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
36
+ benchmarkSeries: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodObject<{
37
+ date: z.ZodString;
38
+ close: z.ZodNumber;
39
+ }, "strip", z.ZodTypeAny, {
40
+ date?: string;
41
+ close?: number;
42
+ }, {
43
+ date?: string;
44
+ close?: number;
45
+ }>, "many">>>;
46
+ }, "strip", z.ZodTypeAny, {
47
+ initialCapital?: number;
48
+ series?: {
49
+ code?: string;
50
+ prices?: {
51
+ date?: string;
52
+ close?: number;
53
+ }[];
54
+ }[];
55
+ lookbackDays?: number;
56
+ rebalanceEveryDays?: number;
57
+ topN?: number;
58
+ feeRate?: number;
59
+ slippageRate?: number;
60
+ maxSingleWeight?: number;
61
+ cashReserveRatio?: number;
62
+ benchmarkSeries?: {
63
+ date?: string;
64
+ close?: number;
65
+ }[];
66
+ }, {
67
+ initialCapital?: number;
68
+ series?: {
69
+ code?: string;
70
+ prices?: {
71
+ date?: string;
72
+ close?: number;
73
+ }[];
74
+ }[];
75
+ lookbackDays?: number;
76
+ rebalanceEveryDays?: number;
77
+ topN?: number;
78
+ feeRate?: number;
79
+ slippageRate?: number;
80
+ maxSingleWeight?: number;
81
+ cashReserveRatio?: number;
82
+ benchmarkSeries?: {
83
+ date?: string;
84
+ close?: number;
85
+ }[];
86
+ }>, {
87
+ initialCapital?: number;
88
+ series?: {
89
+ code?: string;
90
+ prices?: {
91
+ date?: string;
92
+ close?: number;
93
+ }[];
94
+ }[];
95
+ lookbackDays?: number;
96
+ rebalanceEveryDays?: number;
97
+ topN?: number;
98
+ feeRate?: number;
99
+ slippageRate?: number;
100
+ maxSingleWeight?: number;
101
+ cashReserveRatio?: number;
102
+ benchmarkSeries?: {
103
+ date?: string;
104
+ close?: number;
105
+ }[];
106
+ }, {
107
+ initialCapital?: number;
108
+ series?: {
109
+ code?: string;
110
+ prices?: {
111
+ date?: string;
112
+ close?: number;
113
+ }[];
114
+ }[];
115
+ lookbackDays?: number;
116
+ rebalanceEveryDays?: number;
117
+ topN?: number;
118
+ feeRate?: number;
119
+ slippageRate?: number;
120
+ maxSingleWeight?: number;
121
+ cashReserveRatio?: number;
122
+ benchmarkSeries?: {
123
+ date?: string;
124
+ close?: number;
125
+ }[];
126
+ }, string>;
127
+ //# sourceMappingURL=backtest-momentum.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backtest-momentum.tool.d.ts","sourceRoot":"","sources":["../../../src/lib/tools/backtest-momentum.tool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,wBAAgB,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WA0DxC"}
@@ -0,0 +1,60 @@
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
+ export function buildBacktestMomentumTool() {
6
+ return tool(async (input) => {
7
+ try {
8
+ const series = (input.series || []).map((item) => ({
9
+ code: String(item.code || ''),
10
+ prices: (item.prices || []).map((point) => ({
11
+ date: String(point.date || ''),
12
+ close: Number(point.close || 0)
13
+ }))
14
+ }));
15
+ const result = runMomentumBacktest(series, {
16
+ initialCapital: Number(input.initialCapital),
17
+ lookbackDays: input.lookbackDays,
18
+ rebalanceEveryDays: input.rebalanceEveryDays,
19
+ topN: input.topN,
20
+ feeRate: input.feeRate,
21
+ slippageRate: input.slippageRate,
22
+ maxSingleWeight: input.maxSingleWeight,
23
+ cashReserveRatio: input.cashReserveRatio,
24
+ benchmarkSeries: (input.benchmarkSeries || []).map((point) => ({
25
+ date: String(point.date || ''),
26
+ close: Number(point.close || 0)
27
+ }))
28
+ });
29
+ return JSON.stringify(result, null, 2);
30
+ }
31
+ catch (error) {
32
+ throw new Error(`回测失败: ${getErrorMessage(error)}`);
33
+ }
34
+ }, {
35
+ name: 'backtest_momentum_strategy',
36
+ description: '使用价格序列执行动量策略回测,并返回收益、回撤、夏普、基准对比、成本拆解、归因和交易记录',
37
+ schema: z.object({
38
+ initialCapital: z.number().positive().default(1_000_000),
39
+ series: z.array(z.object({
40
+ code: z.string(),
41
+ prices: z.array(z.object({
42
+ date: z.string(),
43
+ close: z.number().positive()
44
+ })).min(30)
45
+ })).min(2),
46
+ lookbackDays: z.number().int().min(5).max(250).optional().default(20),
47
+ rebalanceEveryDays: z.number().int().min(1).max(60).optional().default(5),
48
+ topN: z.number().int().min(1).max(20).optional().default(3),
49
+ feeRate: z.number().min(0).max(0.01).optional().default(0.0005),
50
+ slippageRate: z.number().min(0).max(0.01).optional().default(0.0005),
51
+ maxSingleWeight: z.number().min(0.01).max(1).optional().default(0.4),
52
+ cashReserveRatio: z.number().min(0).max(0.5).optional().default(0.05),
53
+ benchmarkSeries: z.array(z.object({
54
+ date: z.string(),
55
+ close: z.number().positive()
56
+ })).optional().default([])
57
+ })
58
+ });
59
+ }
60
+ //# sourceMappingURL=backtest-momentum.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backtest-momentum.tool.js","sourceRoot":"","sources":["../../../src/lib/tools/backtest-momentum.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ import { z } from 'zod';
2
+ export declare function buildStressTestTool(): import("@langchain/core/tools").DynamicStructuredTool<z.ZodObject<{
3
+ positions: z.ZodArray<z.ZodObject<{
4
+ code: z.ZodString;
5
+ quantity: z.ZodNumber;
6
+ price: z.ZodNumber;
7
+ beta: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ code?: string;
10
+ quantity?: number;
11
+ price?: number;
12
+ beta?: number;
13
+ }, {
14
+ code?: string;
15
+ quantity?: number;
16
+ price?: number;
17
+ beta?: number;
18
+ }>, "many">;
19
+ scenarios: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodObject<{
20
+ name: z.ZodString;
21
+ marketShock: z.ZodNumber;
22
+ betaScale: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
23
+ perSymbolShock: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNumber>>>;
24
+ }, "strip", z.ZodTypeAny, {
25
+ name?: string;
26
+ marketShock?: number;
27
+ betaScale?: number;
28
+ perSymbolShock?: Record<string, number>;
29
+ }, {
30
+ name?: string;
31
+ marketShock?: number;
32
+ betaScale?: number;
33
+ perSymbolShock?: Record<string, number>;
34
+ }>, "many">>>;
35
+ }, "strip", z.ZodTypeAny, {
36
+ positions?: {
37
+ code?: string;
38
+ quantity?: number;
39
+ price?: number;
40
+ beta?: number;
41
+ }[];
42
+ scenarios?: {
43
+ name?: string;
44
+ marketShock?: number;
45
+ betaScale?: number;
46
+ perSymbolShock?: Record<string, number>;
47
+ }[];
48
+ }, {
49
+ positions?: {
50
+ code?: string;
51
+ quantity?: number;
52
+ price?: number;
53
+ beta?: number;
54
+ }[];
55
+ scenarios?: {
56
+ name?: string;
57
+ marketShock?: number;
58
+ betaScale?: number;
59
+ perSymbolShock?: Record<string, number>;
60
+ }[];
61
+ }>, {
62
+ positions?: {
63
+ code?: string;
64
+ quantity?: number;
65
+ price?: number;
66
+ beta?: number;
67
+ }[];
68
+ scenarios?: {
69
+ name?: string;
70
+ marketShock?: number;
71
+ betaScale?: number;
72
+ perSymbolShock?: Record<string, number>;
73
+ }[];
74
+ }, {
75
+ positions?: {
76
+ code?: string;
77
+ quantity?: number;
78
+ price?: number;
79
+ beta?: number;
80
+ }[];
81
+ scenarios?: {
82
+ name?: string;
83
+ marketShock?: number;
84
+ betaScale?: number;
85
+ perSymbolShock?: Record<string, number>;
86
+ }[];
87
+ }, string>;
88
+ //# sourceMappingURL=stress-test.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stress-test.tool.d.ts","sourceRoot":"","sources":["../../../src/lib/tools/stress-test.tool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,wBAAgB,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAgDlC"}
@@ -0,0 +1,51 @@
1
+ import { tool } from '@langchain/core/tools';
2
+ import { getErrorMessage } from '@xpert-ai/plugin-sdk';
3
+ import { z } from 'zod';
4
+ import { runStressTest } from '../backtest-engine.js';
5
+ export function buildStressTestTool() {
6
+ return tool(async (input) => {
7
+ try {
8
+ const positions = (input.positions || []).map((item) => ({
9
+ code: String(item.code || ''),
10
+ quantity: Number(item.quantity || 0),
11
+ price: Number(item.price || 0),
12
+ beta: item.beta === undefined ? undefined : Number(item.beta)
13
+ }));
14
+ const scenarios = (input.scenarios || []).length > 0
15
+ ? (input.scenarios || []).map((item) => ({
16
+ name: String(item.name || 'scenario'),
17
+ marketShock: Number(item.marketShock || 0),
18
+ betaScale: item.betaScale === undefined ? undefined : Number(item.betaScale),
19
+ perSymbolShock: item.perSymbolShock || {}
20
+ }))
21
+ : [
22
+ { name: 'mild_drop', marketShock: -0.03, betaScale: 1 },
23
+ { name: 'medium_drop', marketShock: -0.08, betaScale: 1.1 },
24
+ { name: 'crash', marketShock: -0.15, betaScale: 1.2 }
25
+ ];
26
+ const result = runStressTest(positions, scenarios);
27
+ return JSON.stringify(result, null, 2);
28
+ }
29
+ catch (error) {
30
+ throw new Error(`压力测试失败: ${getErrorMessage(error)}`);
31
+ }
32
+ }, {
33
+ name: 'portfolio_stress_test',
34
+ description: '对当前持仓执行压力测试场景仿真,输出PnL与组合损失率',
35
+ schema: z.object({
36
+ positions: z.array(z.object({
37
+ code: z.string(),
38
+ quantity: z.number().nonnegative(),
39
+ price: z.number().positive(),
40
+ beta: z.number().min(0).max(5).optional().default(1)
41
+ })).min(1),
42
+ scenarios: z.array(z.object({
43
+ name: z.string(),
44
+ marketShock: z.number().min(-1).max(1),
45
+ betaScale: z.number().min(0).max(5).optional().default(1),
46
+ perSymbolShock: z.record(z.string(), z.number().min(-1).max(1)).optional().default({})
47
+ })).optional().default([])
48
+ })
49
+ });
50
+ }
51
+ //# sourceMappingURL=stress-test.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stress-test.tool.js","sourceRoot":"","sources":["../../../src/lib/tools/stress-test.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { BuiltinToolset } from '@xpert-ai/plugin-sdk';
2
+ export declare class StockBacktestSimToolset extends BuiltinToolset {
3
+ validateCredentials(credentials: Record<string, never>): Promise<void>;
4
+ _validateCredentials(credentials: Record<string, never>): Promise<void>;
5
+ initTools(): Promise<any[]>;
6
+ }
7
+ //# sourceMappingURL=toolset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolset.d.ts","sourceRoot":"","sources":["../../src/lib/toolset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAKrD,qBAAa,uBAAwB,SAAQ,cAAc;IAC1C,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAItE,oBAAoB,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvE,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;CAQ3C"}
@@ -0,0 +1,21 @@
1
+ import { BuiltinToolset } from '@xpert-ai/plugin-sdk';
2
+ import { buildBacktestMomentumTool } from './tools/backtest-momentum.tool.js';
3
+ import { buildBacktestMomentumAutoTool } from './tools/backtest-momentum-auto.tool.js';
4
+ import { buildStressTestTool } from './tools/stress-test.tool.js';
5
+ export class StockBacktestSimToolset extends BuiltinToolset {
6
+ async validateCredentials(credentials) {
7
+ await this._validateCredentials(credentials);
8
+ }
9
+ async _validateCredentials(credentials) {
10
+ // Backtest engine uses provided time series, no credentials required.
11
+ }
12
+ async initTools() {
13
+ this.tools = [
14
+ buildBacktestMomentumTool(),
15
+ buildBacktestMomentumAutoTool(),
16
+ buildStressTestTool()
17
+ ];
18
+ return this.tools;
19
+ }
20
+ }
21
+ //# sourceMappingURL=toolset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolset.js","sourceRoot":"","sources":["../../src/lib/toolset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAC7E,OAAO,EAAE,6BAA6B,EAAE,MAAM,wCAAwC,CAAA;AACtF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAEjE,MAAM,OAAO,uBAAwB,SAAQ,cAAc;IAChD,KAAK,CAAC,mBAAmB,CAAC,WAAkC;QACnE,MAAM,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAA;IAC9C,CAAC;IAEQ,KAAK,CAAC,oBAAoB,CAAC,WAAkC;QACpE,sEAAsE;IACxE,CAAC;IAEQ,KAAK,CAAC,SAAS;QACtB,IAAI,CAAC,KAAK,GAAG;YACX,yBAAyB,EAAE;YAC3B,6BAA6B,EAAE;YAC/B,mBAAmB,EAAE;SACtB,CAAA;QACD,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ export declare const StockBacktestSimProvider = "stock-backtest-sim";
2
+ export interface PricePoint {
3
+ date: string;
4
+ close: number;
5
+ }
6
+ export interface SymbolSeries {
7
+ code: string;
8
+ prices: PricePoint[];
9
+ }
10
+ export interface Holding {
11
+ code: string;
12
+ quantity: number;
13
+ }
14
+ export interface StressPosition {
15
+ code: string;
16
+ quantity: number;
17
+ price: number;
18
+ beta?: number;
19
+ }
20
+ export declare const icon = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMTBhMzdmIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBvbHlsaW5lIHBvaW50cz0iMyAxNyA5IDExIDEzIDE1IDIxIDciLz48L3N2Zz4=";
21
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB,uBAAuB,CAAA;AAE5D,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,UAAU,EAAE,CAAA;CACrB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,eAAO,MAAM,IAAI,2SAA2S,CAAA"}
@@ -0,0 +1,3 @@
1
+ export const StockBacktestSimProvider = 'stock-backtest-sim';
2
+ export const icon = `data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMTBhMzdmIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBvbHlsaW5lIHBvaW50cz0iMyAxNyA5IDExIDEzIDE1IDIxIDciLz48L3N2Zz4=`;
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG,oBAAoB,CAAA;AAwB5D,MAAM,CAAC,MAAM,IAAI,GAAG,wSAAwS,CAAA"}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@helloxiaohu/plugin-stock-backtest-sim",
3
+ "version": "0.0.1",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "https://github.com/xpert-ai/xpert-plugins"
7
+ },
8
+ "type": "module",
9
+ "main": "./dist/index.js",
10
+ "module": "./dist/index.js",
11
+ "types": "./dist/index.d.ts",
12
+ "exports": {
13
+ "./package.json": "./package.json",
14
+ ".": {
15
+ "@xpert-plugins-starter/source": "./src/index.ts",
16
+ "types": "./dist/index.d.ts",
17
+ "import": "./dist/index.js",
18
+ "default": "./dist/index.js"
19
+ }
20
+ },
21
+ "files": [
22
+ "dist",
23
+ "!**/*.tsbuildinfo"
24
+ ],
25
+ "dependencies": {
26
+ "tslib": "^2.3.0"
27
+ },
28
+ "peerDependencies": {
29
+ "@xpert-ai/plugin-sdk": "^3.6.2",
30
+ "zod": "3.25.67",
31
+ "chalk": "4.1.2",
32
+ "@nestjs/config": "^4.0.2",
33
+ "@nestjs/common": "^11.1.6",
34
+ "@langchain/core": "0.3.72"
35
+ }
36
+ }