@stvy/fund-indicators 1.0.0 → 1.0.2

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 (52) hide show
  1. package/.github/workflows/publish.yml +79 -0
  2. package/AGENTS.md +322 -0
  3. package/dist/index.cjs +1615 -0
  4. package/dist/index.d.cts +779 -0
  5. package/dist/index.d.cts.map +1 -0
  6. package/dist/index.mjs +1518 -0
  7. package/package.json +10 -29
  8. package/pnpm-workspace.yaml +2 -0
  9. package/src/dca.ts +420 -0
  10. package/src/index.ts +133 -0
  11. package/src/jstat.d.ts +17 -0
  12. package/src/pattern.ts +447 -0
  13. package/src/risk.ts +516 -0
  14. package/src/statistics.ts +428 -0
  15. package/src/technical.ts +738 -0
  16. package/src/types.ts +369 -0
  17. package/test/index.test.ts +355 -0
  18. package/tsconfig.json +20 -0
  19. package/dist/browser/fund-indicators.esm.js +0 -7505
  20. package/dist/browser/fund-indicators.esm.min.js +0 -8
  21. package/dist/browser/fund-indicators.esm.min.js.map +0 -7
  22. package/dist/browser/fund-indicators.js +0 -7517
  23. package/dist/browser/fund-indicators.min.js +0 -8
  24. package/dist/browser/fund-indicators.min.js.map +0 -7
  25. package/dist/dca.d.ts +0 -91
  26. package/dist/dca.d.ts.map +0 -1
  27. package/dist/dca.js +0 -354
  28. package/dist/dca.js.map +0 -1
  29. package/dist/index.d.ts +0 -18
  30. package/dist/index.d.ts.map +0 -1
  31. package/dist/index.js +0 -141
  32. package/dist/index.js.map +0 -1
  33. package/dist/pattern.d.ts +0 -60
  34. package/dist/pattern.d.ts.map +0 -1
  35. package/dist/pattern.js +0 -386
  36. package/dist/pattern.js.map +0 -1
  37. package/dist/risk.d.ts +0 -115
  38. package/dist/risk.d.ts.map +0 -1
  39. package/dist/risk.js +0 -502
  40. package/dist/risk.js.map +0 -1
  41. package/dist/statistics.d.ts +0 -78
  42. package/dist/statistics.d.ts.map +0 -1
  43. package/dist/statistics.js +0 -402
  44. package/dist/statistics.js.map +0 -1
  45. package/dist/technical.d.ts +0 -105
  46. package/dist/technical.d.ts.map +0 -1
  47. package/dist/technical.js +0 -633
  48. package/dist/technical.js.map +0 -1
  49. package/dist/types.d.ts +0 -327
  50. package/dist/types.d.ts.map +0 -1
  51. package/dist/types.js +0 -7
  52. package/dist/types.js.map +0 -1
package/dist/pattern.d.ts DELETED
@@ -1,60 +0,0 @@
1
- /**
2
- * 形态识别模块
3
- * 包含:支撑/阻力位、双底/双顶、缺口识别、趋势强度等
4
- */
5
- import { NavSeries, SupportResistanceResult, DoubleBottomTopResult, GapResult } from './types';
6
- /**
7
- * 基于净值密集区识别支撑位和阻力位
8
- * 使用核密度估计(KDE)思想,找到净值频繁出现的价位
9
- *
10
- * @param nav 净值序列
11
- * @param tolerance 价格容差比例(如 0.02 = 2%以内的视为同一价位)
12
- * @param minTouches 最少触及次数(默认3)
13
- */
14
- export declare function supportResistance(nav: NavSeries, tolerance?: number, minTouches?: number): SupportResistanceResult;
15
- /**
16
- * 双底/双顶形态识别
17
- * @param nav 净值序列
18
- * @param lookback 回看天数(默认60)
19
- * @param tolerance 两底/顶之间的价格容差比例(默认0.03 = 3%)
20
- * @param minDistance 两个底/顶之间的最小间隔天数(默认10)
21
- */
22
- export declare function doubleBottomTop(nav: NavSeries, lookback?: number, tolerance?: number, minDistance?: number): DoubleBottomTopResult;
23
- /**
24
- * 净值缺口识别(分红、估值调整等导致的净值跳变)
25
- * @param nav 净值序列
26
- * @param threshold 缺口阈值百分比(默认0.02 = 2%)
27
- */
28
- export declare function detectGaps(nav: NavSeries, threshold?: number): GapResult[];
29
- /**
30
- * 趋势强度评分(0-100)
31
- * 综合多个维度评估当前趋势的强弱
32
- *
33
- * @param nav 净值序列
34
- * @param period 评估周期(默认20天)
35
- */
36
- export declare function trendStrength(nav: NavSeries, period?: number): number;
37
- /**
38
- * 头肩形态识别(简化版)
39
- * @param nav 净值序列
40
- * @param lookback 回看天数
41
- * @returns 头肩顶/底形态信息
42
- */
43
- export declare function headAndShoulders(nav: NavSeries, lookback?: number): {
44
- type: 'head_and_shoulders_top' | 'head_and_shoulders_bottom' | 'none';
45
- leftShoulder: {
46
- index: number;
47
- value: number;
48
- } | null;
49
- head: {
50
- index: number;
51
- value: number;
52
- } | null;
53
- rightShoulder: {
54
- index: number;
55
- value: number;
56
- } | null;
57
- neckline: number | null;
58
- confidence: number;
59
- };
60
- //# sourceMappingURL=pattern.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pattern.d.ts","sourceRoot":"","sources":["../src/pattern.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAM/F;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,SAAS,EACd,SAAS,GAAE,MAAa,EACxB,UAAU,GAAE,MAAU,GACrB,uBAAuB,CAoEzB;AAMD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,SAAS,EACd,QAAQ,GAAE,MAAW,EACrB,SAAS,GAAE,MAAa,EACxB,WAAW,GAAE,MAAW,GACvB,qBAAqB,CA2GvB;AAMD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,GAAE,MAAa,GAAG,SAAS,EAAE,CAkDhF;AAMD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,GAAE,MAAW,GAAG,MAAM,CAsCzE;AAMD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,SAAS,EACd,QAAQ,GAAE,MAAW,GACpB;IACD,IAAI,EAAE,wBAAwB,GAAG,2BAA2B,GAAG,MAAM,CAAC;IACtE,YAAY,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACtD,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC9C,aAAa,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACvD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB,CAgGA"}
package/dist/pattern.js DELETED
@@ -1,386 +0,0 @@
1
- "use strict";
2
- /**
3
- * 形态识别模块
4
- * 包含:支撑/阻力位、双底/双顶、缺口识别、趋势强度等
5
- */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.headAndShoulders = exports.trendStrength = exports.detectGaps = exports.doubleBottomTop = exports.supportResistance = void 0;
8
- // ============================================================
9
- // 支撑位 / 阻力位
10
- // ============================================================
11
- /**
12
- * 基于净值密集区识别支撑位和阻力位
13
- * 使用核密度估计(KDE)思想,找到净值频繁出现的价位
14
- *
15
- * @param nav 净值序列
16
- * @param tolerance 价格容差比例(如 0.02 = 2%以内的视为同一价位)
17
- * @param minTouches 最少触及次数(默认3)
18
- */
19
- function supportResistance(nav, tolerance = 0.02, minTouches = 3) {
20
- if (nav.length < 10) {
21
- return { supports: [], resistances: [] };
22
- }
23
- const current = nav[nav.length - 1];
24
- // 统计每个价位附近的触及次数
25
- const levelMap = new Map();
26
- for (let i = 0; i < nav.length; i++) {
27
- // 寻找局部极值(局部最高点和最低点)
28
- const isLocalHigh = (i > 0 && i < nav.length - 1) &&
29
- nav[i] >= nav[i - 1] && nav[i] >= nav[i + 1];
30
- const isLocalLow = (i > 0 && i < nav.length - 1) &&
31
- nav[i] <= nav[i - 1] && nav[i] <= nav[i + 1];
32
- if (isLocalHigh || isLocalLow) {
33
- // 合并相近价位
34
- let merged = false;
35
- for (const [level, count] of levelMap.entries()) {
36
- if (Math.abs(nav[i] - level) / level < tolerance) {
37
- levelMap.set(level, count + 1);
38
- merged = true;
39
- break;
40
- }
41
- }
42
- if (!merged) {
43
- levelMap.set(nav[i], 1);
44
- }
45
- }
46
- }
47
- // 也考虑净值序列中出现频率高的价位
48
- for (const price of nav) {
49
- let merged = false;
50
- for (const [level, count] of levelMap.entries()) {
51
- if (Math.abs(price - level) / level < tolerance) {
52
- levelMap.set(level, count + 1);
53
- merged = true;
54
- break;
55
- }
56
- }
57
- if (!merged) {
58
- levelMap.set(price, 1);
59
- }
60
- }
61
- // 过滤并排序
62
- const validLevels = Array.from(levelMap.entries())
63
- .filter(([, touches]) => touches >= minTouches)
64
- .map(([level, touches]) => ({
65
- level,
66
- touches,
67
- strength: touches / nav.length,
68
- }))
69
- .sort((a, b) => b.strength - a.strength);
70
- // 分为支撑位(低于当前价)和阻力位(高于当前价)
71
- const supports = validLevels
72
- .filter((l) => l.level < current)
73
- .sort((a, b) => b.level - a.level); // 最近的支撑位排前面
74
- const resistances = validLevels
75
- .filter((l) => l.level > current)
76
- .sort((a, b) => a.level - b.level); // 最近的阻力位排前面
77
- return { supports, resistances };
78
- }
79
- exports.supportResistance = supportResistance;
80
- // ============================================================
81
- // 双底 (W底) / 双顶 (M头) 识别
82
- // ============================================================
83
- /**
84
- * 双底/双顶形态识别
85
- * @param nav 净值序列
86
- * @param lookback 回看天数(默认60)
87
- * @param tolerance 两底/顶之间的价格容差比例(默认0.03 = 3%)
88
- * @param minDistance 两个底/顶之间的最小间隔天数(默认10)
89
- */
90
- function doubleBottomTop(nav, lookback = 60, tolerance = 0.03, minDistance = 10) {
91
- const noResult = {
92
- type: 'none',
93
- firstPointIndex: null,
94
- secondPointIndex: null,
95
- necklineIndex: null,
96
- necklinePrice: null,
97
- breakout: false,
98
- confidence: 0,
99
- };
100
- if (nav.length < lookback || lookback < minDistance * 2)
101
- return noResult;
102
- const window = nav.slice(-lookback);
103
- const offset = nav.length - lookback;
104
- // 寻找局部极值
105
- const localMins = [];
106
- const localMaxs = [];
107
- for (let i = 2; i < window.length - 2; i++) {
108
- if (window[i] <= window[i - 1] && window[i] <= window[i + 1] &&
109
- window[i] <= window[i - 2] && window[i] <= window[i + 2]) {
110
- localMins.push({ index: i, value: window[i] });
111
- }
112
- if (window[i] >= window[i - 1] && window[i] >= window[i + 1] &&
113
- window[i] >= window[i - 2] && window[i] >= window[i + 2]) {
114
- localMaxs.push({ index: i, value: window[i] });
115
- }
116
- }
117
- // 检测双底(W底)
118
- for (let i = 0; i < localMins.length; i++) {
119
- for (let j = i + 1; j < localMins.length; j++) {
120
- const first = localMins[i];
121
- const second = localMins[j];
122
- const distance = second.index - first.index;
123
- if (distance < minDistance)
124
- continue;
125
- const priceDiff = Math.abs(first.value - second.value) / first.value;
126
- if (priceDiff > tolerance)
127
- continue;
128
- // 找两底之间的颈线(最高点)
129
- const between = window.slice(first.index, second.index + 1);
130
- const neckValue = Math.max(...between);
131
- const neckIdx = first.index + between.indexOf(neckValue);
132
- // 检查是否突破颈线
133
- const currentPrice = window[window.length - 1];
134
- const breakout = currentPrice > neckValue;
135
- // 计算信号强度
136
- const similarity = 1 - priceDiff / tolerance;
137
- const distanceFactor = Math.min(1, distance / lookback * 2);
138
- const confidence = (similarity * 0.6 + distanceFactor * 0.4) * (breakout ? 1 : 0.7);
139
- return {
140
- type: 'double_bottom',
141
- firstPointIndex: offset + first.index,
142
- secondPointIndex: offset + second.index,
143
- necklineIndex: offset + neckIdx,
144
- necklinePrice: neckValue,
145
- breakout,
146
- confidence,
147
- };
148
- }
149
- }
150
- // 检测双顶(M头)
151
- for (let i = 0; i < localMaxs.length; i++) {
152
- for (let j = i + 1; j < localMaxs.length; j++) {
153
- const first = localMaxs[i];
154
- const second = localMaxs[j];
155
- const distance = second.index - first.index;
156
- if (distance < minDistance)
157
- continue;
158
- const priceDiff = Math.abs(first.value - second.value) / first.value;
159
- if (priceDiff > tolerance)
160
- continue;
161
- // 找两顶之间的颈线(最低点)
162
- const between = window.slice(first.index, second.index + 1);
163
- const neckValue = Math.min(...between);
164
- const neckIdx = first.index + between.indexOf(neckValue);
165
- // 检查是否跌破颈线
166
- const currentPrice = window[window.length - 1];
167
- const breakout = currentPrice < neckValue;
168
- const similarity = 1 - priceDiff / tolerance;
169
- const distanceFactor = Math.min(1, distance / lookback * 2);
170
- const confidence = (similarity * 0.6 + distanceFactor * 0.4) * (breakout ? 1 : 0.7);
171
- return {
172
- type: 'double_top',
173
- firstPointIndex: offset + first.index,
174
- secondPointIndex: offset + second.index,
175
- necklineIndex: offset + neckIdx,
176
- necklinePrice: neckValue,
177
- breakout,
178
- confidence,
179
- };
180
- }
181
- }
182
- return noResult;
183
- }
184
- exports.doubleBottomTop = doubleBottomTop;
185
- // ============================================================
186
- // 缺口识别
187
- // ============================================================
188
- /**
189
- * 净值缺口识别(分红、估值调整等导致的净值跳变)
190
- * @param nav 净值序列
191
- * @param threshold 缺口阈值百分比(默认0.02 = 2%)
192
- */
193
- function detectGaps(nav, threshold = 0.02) {
194
- const gaps = [];
195
- for (let i = 1; i < nav.length; i++) {
196
- const change = (nav[i] - nav[i - 1]) / nav[i - 1];
197
- const absChange = Math.abs(change);
198
- if (absChange >= threshold) {
199
- const isGapUp = change > 0;
200
- const gapTop = isGapUp ? nav[i] : nav[i - 1];
201
- const gapBottom = isGapUp ? nav[i - 1] : nav[i];
202
- // 检查缺口是否已回补
203
- let filled = false;
204
- let filledIndex = null;
205
- if (isGapUp) {
206
- // 向上缺口:后续净值跌回缺口下沿即为回补
207
- for (let j = i + 1; j < nav.length; j++) {
208
- if (nav[j] <= gapBottom) {
209
- filled = true;
210
- filledIndex = j;
211
- break;
212
- }
213
- }
214
- }
215
- else {
216
- // 向下缺口:后续净值涨回缺口上沿即为回补
217
- for (let j = i + 1; j < nav.length; j++) {
218
- if (nav[j] >= gapTop) {
219
- filled = true;
220
- filledIndex = j;
221
- break;
222
- }
223
- }
224
- }
225
- gaps.push({
226
- type: isGapUp ? 'gap_up' : 'gap_down',
227
- startIndex: i - 1,
228
- endIndex: i,
229
- gapTop,
230
- gapBottom,
231
- gapSize: absChange,
232
- filled,
233
- filledIndex,
234
- });
235
- }
236
- }
237
- return gaps;
238
- }
239
- exports.detectGaps = detectGaps;
240
- // ============================================================
241
- // 趋势强度评估
242
- // ============================================================
243
- /**
244
- * 趋势强度评分(0-100)
245
- * 综合多个维度评估当前趋势的强弱
246
- *
247
- * @param nav 净值序列
248
- * @param period 评估周期(默认20天)
249
- */
250
- function trendStrength(nav, period = 20) {
251
- if (nav.length < period + 10)
252
- return 50;
253
- const recent = nav.slice(-period);
254
- const returns = [];
255
- for (let i = 1; i < recent.length; i++) {
256
- returns.push((recent[i] - recent[i - 1]) / recent[i - 1]);
257
- }
258
- // 1. 方向一致性(正收益天数占比)
259
- const positiveDays = returns.filter((r) => r > 0).length;
260
- const directionScore = (positiveDays / returns.length) * 100;
261
- // 2. 线性回归拟合度 (R²)
262
- const indices = returns.map((_, i) => i);
263
- const meanY = returns.reduce((a, b) => a + b, 0) / returns.length;
264
- const meanX = indices.reduce((a, b) => a + b, 0) / indices.length;
265
- let ssXY = 0, ssXX = 0, ssYY = 0;
266
- for (let i = 0; i < returns.length; i++) {
267
- ssXY += (indices[i] - meanX) * (returns[i] - meanY);
268
- ssXX += (indices[i] - meanX) ** 2;
269
- ssYY += (returns[i] - meanY) ** 2;
270
- }
271
- const rSquared = ssXX > 0 && ssYY > 0 ? (ssXY * ssXY) / (ssXX * ssYY) : 0;
272
- const fitScore = rSquared * 100;
273
- // 3. 连续上涨/下跌天数
274
- let maxStreak = 0;
275
- let currentStreak = 0;
276
- for (const r of returns) {
277
- if (r > 0) {
278
- currentStreak++;
279
- maxStreak = Math.max(maxStreak, currentStreak);
280
- }
281
- else
282
- currentStreak = 0;
283
- }
284
- const streakScore = Math.min(100, (maxStreak / returns.length) * 200);
285
- // 综合评分(加权)
286
- return directionScore * 0.4 + fitScore * 0.35 + streakScore * 0.25;
287
- }
288
- exports.trendStrength = trendStrength;
289
- // ============================================================
290
- // 头肩形态识别
291
- // ============================================================
292
- /**
293
- * 头肩形态识别(简化版)
294
- * @param nav 净值序列
295
- * @param lookback 回看天数
296
- * @returns 头肩顶/底形态信息
297
- */
298
- function headAndShoulders(nav, lookback = 90) {
299
- const noResult = {
300
- type: 'none',
301
- leftShoulder: null,
302
- head: null,
303
- rightShoulder: null,
304
- neckline: null,
305
- confidence: 0,
306
- };
307
- if (nav.length < lookback)
308
- return noResult;
309
- const window = nav.slice(-lookback);
310
- // 寻找局部极值
311
- const peaks = [];
312
- const troughs = [];
313
- for (let i = 3; i < window.length - 3; i++) {
314
- const isPeak = window[i] > window[i - 1] && window[i] > window[i + 1] &&
315
- window[i] > window[i - 2] && window[i] > window[i + 2] &&
316
- window[i] > window[i - 3] && window[i] > window[i + 3];
317
- const isTrough = window[i] < window[i - 1] && window[i] < window[i + 1] &&
318
- window[i] < window[i - 2] && window[i] < window[i + 2] &&
319
- window[i] < window[i - 3] && window[i] < window[i + 3];
320
- if (isPeak)
321
- peaks.push({ index: i, value: window[i] });
322
- if (isTrough)
323
- troughs.push({ index: i, value: window[i] });
324
- }
325
- // 检查头肩顶:三个峰,中间最高,两侧相近
326
- if (peaks.length >= 3) {
327
- for (let i = 0; i < peaks.length - 2; i++) {
328
- const left = peaks[i];
329
- const head = peaks[i + 1];
330
- const right = peaks[i + 2];
331
- // 头部必须高于两肩
332
- if (head.value <= left.value || head.value <= right.value)
333
- continue;
334
- // 两肩高度相近(容差5%)
335
- const shoulderDiff = Math.abs(left.value - right.value) / left.value;
336
- if (shoulderDiff > 0.05)
337
- continue;
338
- // 头部高于肩部至少3%
339
- const headPremium = (head.value - (left.value + right.value) / 2) / ((left.value + right.value) / 2);
340
- if (headPremium < 0.03)
341
- continue;
342
- // 颈线 = 两肩之间的最低点
343
- const between = window.slice(left.index, right.index + 1);
344
- const neckline = Math.min(...between);
345
- const confidence = Math.min(1, (1 - shoulderDiff / 0.05) * 0.5 + Math.min(headPremium / 0.1, 1) * 0.5);
346
- return {
347
- type: 'head_and_shoulders_top',
348
- leftShoulder: { index: nav.length - lookback + left.index, value: left.value },
349
- head: { index: nav.length - lookback + head.index, value: head.value },
350
- rightShoulder: { index: nav.length - lookback + right.index, value: right.value },
351
- neckline,
352
- confidence,
353
- };
354
- }
355
- }
356
- // 检查头肩底(反转头肩)
357
- if (troughs.length >= 3) {
358
- for (let i = 0; i < troughs.length - 2; i++) {
359
- const left = troughs[i];
360
- const head = troughs[i + 1];
361
- const right = troughs[i + 2];
362
- if (head.value >= left.value || head.value >= right.value)
363
- continue;
364
- const shoulderDiff = Math.abs(left.value - right.value) / left.value;
365
- if (shoulderDiff > 0.05)
366
- continue;
367
- const headDiscount = ((left.value + right.value) / 2 - head.value) / ((left.value + right.value) / 2);
368
- if (headDiscount < 0.03)
369
- continue;
370
- const between = window.slice(left.index, right.index + 1);
371
- const neckline = Math.max(...between);
372
- const confidence = Math.min(1, (1 - shoulderDiff / 0.05) * 0.5 + Math.min(headDiscount / 0.1, 1) * 0.5);
373
- return {
374
- type: 'head_and_shoulders_bottom',
375
- leftShoulder: { index: nav.length - lookback + left.index, value: left.value },
376
- head: { index: nav.length - lookback + head.index, value: head.value },
377
- rightShoulder: { index: nav.length - lookback + right.index, value: right.value },
378
- neckline,
379
- confidence,
380
- };
381
- }
382
- }
383
- return noResult;
384
- }
385
- exports.headAndShoulders = headAndShoulders;
386
- //# sourceMappingURL=pattern.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pattern.js","sourceRoot":"","sources":["../src/pattern.ts"],"names":[],"mappings":"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"}
package/dist/risk.d.ts DELETED
@@ -1,115 +0,0 @@
1
- /**
2
- * 风险与绩效指标模块
3
- * 包含:波动率、最大回撤、VaR、CVaR、夏普比率、索提诺、卡尔玛、特雷诺、Omega 等
4
- */
5
- import { NavSeries, ReturnSeries, DateSeries, DrawdownResult, RiskMetrics, PerformanceMetrics, BenchmarkMetrics } from './types';
6
- /** 净值序列 → 日收益率序列 */
7
- export declare function navToReturns(nav: NavSeries): ReturnSeries;
8
- /** 日收益率 → 年化收益率(几何平均) */
9
- export declare function annualizeReturn(dailyReturns: ReturnSeries): number;
10
- /** 累计收益率 */
11
- export declare function totalReturn(nav: NavSeries): number;
12
- /** 年化波动率 */
13
- export declare function annualizedVolatility(returns: ReturnSeries): number;
14
- /** 下行波动率(年化),只计算负收益 */
15
- export declare function downsideVolatility(returns: ReturnSeries, riskFreeRate?: number): number;
16
- /**
17
- * 滚动波动率
18
- * @param returns 日收益率
19
- * @param window 滚动窗口大小
20
- */
21
- export declare function rollingVolatility(returns: ReturnSeries, window?: number): (number | null)[];
22
- /**
23
- * 波动率锥 - 不同时间窗口的波动率分位数分布
24
- * @param returns 日收益率
25
- * @param windows 要分析的时间窗口列表
26
- * @param quantiles 要计算的分位数列表
27
- */
28
- export declare function volatilityCone(returns: ReturnSeries, windows?: number[], quantiles?: number[]): Map<number, Map<number, number>>;
29
- /**
30
- * 最大回撤分析
31
- * @param nav 净值序列
32
- * @param dates 可选日期序列
33
- */
34
- export declare function maxDrawdown(nav: NavSeries, dates?: DateSeries): DrawdownResult;
35
- /**
36
- * 最大回撤持续天数(从峰顶到下一次创新高)
37
- */
38
- export declare function maxDrawdownDuration(nav: NavSeries): number;
39
- /**
40
- * VaR(在险价值)
41
- * @param returns 日收益率
42
- * @param confidence 置信度(默认 0.95)
43
- * @param method 计算方法:'historical'(历史模拟)| 'parametric'(参数法/正态假设)
44
- */
45
- export declare function calculateVaR(returns: ReturnSeries, confidence?: number, method?: 'historical' | 'parametric'): number;
46
- /**
47
- * CVaR / Expected Shortfall(条件在险价值 / 预期亏损)
48
- * @param returns 日收益率
49
- * @param confidence 置信度(默认 0.95)
50
- */
51
- export declare function calculateCVaR(returns: ReturnSeries, confidence?: number): number;
52
- /**
53
- * 一次性计算所有风险指标
54
- * @param nav 净值序列
55
- * @param riskFreeRate 年化无风险利率(默认 0.025 = 2.5%)
56
- */
57
- export declare function riskMetrics(nav: NavSeries, riskFreeRate?: number): RiskMetrics;
58
- /**
59
- * 夏普比率 = (年化收益 - 无风险利率) / 年化波动率
60
- */
61
- export declare function sharpeRatio(nav: NavSeries, riskFreeRate?: number): number;
62
- /**
63
- * 索提诺比率 = (年化收益 - 无风险利率) / 下行波动率
64
- */
65
- export declare function sortinoRatio(nav: NavSeries, riskFreeRate?: number): number;
66
- /**
67
- * 卡尔玛比率 = 年化收益 / |最大回撤|
68
- */
69
- export declare function calmarRatio(nav: NavSeries): number;
70
- /**
71
- * 特雷诺比率 = (年化收益 - 无风险利率) / Beta
72
- * @param nav 基金净值
73
- * @param benchmarkNav 基准净值
74
- * @param riskFreeRate 无风险利率
75
- */
76
- export declare function treynorRatio(nav: NavSeries, benchmarkNav: NavSeries, riskFreeRate?: number): number | null;
77
- /**
78
- * Omega 比率 = 加权上行收益 / 加权下行亏损
79
- * @param nav 净值序列
80
- * @param threshold 阈值(默认 0)
81
- */
82
- export declare function omegaRatio(nav: NavSeries, threshold?: number): number;
83
- /** 胜率 = 正收益天数 / 总天数 */
84
- export declare function winRate(returns: ReturnSeries): number;
85
- /** 盈亏比 = 平均盈利 / 平均亏损的绝对值 */
86
- export declare function profitLossRatio(returns: ReturnSeries): number;
87
- /** 利润因子 = 总盈利 / 总亏损 */
88
- export declare function profitFactor(returns: ReturnSeries): number;
89
- /** 最大连续盈利/亏损天数 */
90
- export declare function consecutiveWinLoss(returns: ReturnSeries): {
91
- maxWins: number;
92
- maxLosses: number;
93
- };
94
- /**
95
- * 一次性计算所有绩效指标
96
- * @param nav 净值序列
97
- * @param riskFreeRate 年化无风险利率
98
- */
99
- export declare function performanceMetrics(nav: NavSeries, riskFreeRate?: number): PerformanceMetrics;
100
- /** Beta 系数 */
101
- export declare function calculateBeta(fundReturns: ReturnSeries, benchmarkReturns: ReturnSeries): number;
102
- /** Alpha(年化超额收益) */
103
- export declare function calculateAlpha(fundReturns: ReturnSeries, benchmarkReturns: ReturnSeries, riskFreeRate?: number): number;
104
- /** 跟踪误差(年化) */
105
- export declare function trackingError(fundReturns: ReturnSeries, benchmarkReturns: ReturnSeries): number;
106
- /** 信息比率 = 超额收益 / 跟踪误差 */
107
- export declare function informationRatio(fundReturns: ReturnSeries, benchmarkReturns: ReturnSeries): number;
108
- /**
109
- * 一次性计算所有相对基准指标
110
- * @param fundNav 基金净值序列
111
- * @param benchmarkNav 基准净值序列(如沪深300净值)
112
- * @param riskFreeRate 年化无风险利率
113
- */
114
- export declare function benchmarkMetrics(fundNav: NavSeries, benchmarkNav: NavSeries, riskFreeRate?: number): BenchmarkMetrics;
115
- //# sourceMappingURL=risk.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"risk.d.ts","sourceRoot":"","sources":["../src/risk.ts"],"names":[],"mappings":"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"}