backtest-kit 10.1.0 → 11.0.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.
- package/LICENSE +21 -21
- package/README.md +1995 -1995
- package/build/index.cjs +747 -238
- package/build/index.mjs +751 -242
- package/package.json +86 -86
- package/types.d.ts +44 -9
package/package.json
CHANGED
|
@@ -1,86 +1,86 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "backtest-kit",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "A TypeScript library for trading system backtest",
|
|
5
|
-
"author": {
|
|
6
|
-
"name": "Petr Tripolsky",
|
|
7
|
-
"email": "tripolskypetr@gmail.com",
|
|
8
|
-
"url": "https://github.com/tripolskypetr"
|
|
9
|
-
},
|
|
10
|
-
"funding": {
|
|
11
|
-
"type": "individual",
|
|
12
|
-
"url": "http://paypal.me/tripolskypetr"
|
|
13
|
-
},
|
|
14
|
-
"license": "MIT",
|
|
15
|
-
"homepage": "https://backtest-kit.github.io/documents/article_07_ai_news_trading_signals.html",
|
|
16
|
-
"keywords": [
|
|
17
|
-
"backtesting",
|
|
18
|
-
"backtest",
|
|
19
|
-
"finance",
|
|
20
|
-
"trading",
|
|
21
|
-
"candles",
|
|
22
|
-
"indicators",
|
|
23
|
-
"multi value",
|
|
24
|
-
"multi symbol",
|
|
25
|
-
"framework"
|
|
26
|
-
],
|
|
27
|
-
"files": [
|
|
28
|
-
"build",
|
|
29
|
-
"types.d.ts",
|
|
30
|
-
"README.md"
|
|
31
|
-
],
|
|
32
|
-
"repository": {
|
|
33
|
-
"type": "git",
|
|
34
|
-
"url": "https://github.com/tripolskypetr/backtest-kit",
|
|
35
|
-
"documentation": "https://github.com/tripolskypetr/backtest-kit/tree/master/docs"
|
|
36
|
-
},
|
|
37
|
-
"bugs": {
|
|
38
|
-
"url": "https://github.com/tripolskypetr/backtest-kit/issues"
|
|
39
|
-
},
|
|
40
|
-
"scripts": {
|
|
41
|
-
"build": "rollup -c",
|
|
42
|
-
"test": "npm run build && node ./test/index.mjs",
|
|
43
|
-
"build:docs": "rimraf docs && mkdir docs && node ./scripts/dts-docs.cjs ./types.d.ts ./docs",
|
|
44
|
-
"docs:gpt": "npm run build && node ./tools/gpt-docs/index.mjs",
|
|
45
|
-
"docs:uml": "npm run build && node ./scripts/uml.mjs",
|
|
46
|
-
"docs:www": "rimraf docs/wwwroot && node ./tools/typedoc-packages-docs/index.mjs && typedoc && node ./tools/typedoc-yandex-metrica/index.mjs",
|
|
47
|
-
"repl": "dotenv -e .env -- npm run build && node -e \"import('./scripts/repl.mjs')\" --interactive"
|
|
48
|
-
},
|
|
49
|
-
"main": "build/index.cjs",
|
|
50
|
-
"module": "build/index.mjs",
|
|
51
|
-
"source": "src/index.ts",
|
|
52
|
-
"types": "./types.d.ts",
|
|
53
|
-
"exports": {
|
|
54
|
-
"require": "./build/index.cjs",
|
|
55
|
-
"types": "./types.d.ts",
|
|
56
|
-
"import": "./build/index.mjs",
|
|
57
|
-
"default": "./build/index.cjs"
|
|
58
|
-
},
|
|
59
|
-
"devDependencies": {
|
|
60
|
-
"@rollup/plugin-typescript": "11.1.6",
|
|
61
|
-
"@types/node": "22.9.0",
|
|
62
|
-
"glob": "11.0.1",
|
|
63
|
-
"plantuml": "0.0.2",
|
|
64
|
-
"rimraf": "6.0.1",
|
|
65
|
-
"rollup": "3.29.5",
|
|
66
|
-
"rollup-plugin-dts": "6.1.1",
|
|
67
|
-
"rollup-plugin-peer-deps-external": "2.2.4",
|
|
68
|
-
"ts-morph": "27.0.2",
|
|
69
|
-
"tslib": "2.7.0",
|
|
70
|
-
"typedoc": "0.27.9",
|
|
71
|
-
"worker-testbed": "2.0.0"
|
|
72
|
-
},
|
|
73
|
-
"peerDependencies": {
|
|
74
|
-
"typescript": "^5.0.0"
|
|
75
|
-
},
|
|
76
|
-
"dependencies": {
|
|
77
|
-
"di-kit": "^1.1.1",
|
|
78
|
-
"di-scoped": "^1.0.21",
|
|
79
|
-
"di-singleton": "^1.0.5",
|
|
80
|
-
"functools-kit": "^2.3.0",
|
|
81
|
-
"get-moment-stamp": "^2.0.0"
|
|
82
|
-
},
|
|
83
|
-
"publishConfig": {
|
|
84
|
-
"access": "public"
|
|
85
|
-
}
|
|
86
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "backtest-kit",
|
|
3
|
+
"version": "11.0.0",
|
|
4
|
+
"description": "A TypeScript library for trading system backtest",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Petr Tripolsky",
|
|
7
|
+
"email": "tripolskypetr@gmail.com",
|
|
8
|
+
"url": "https://github.com/tripolskypetr"
|
|
9
|
+
},
|
|
10
|
+
"funding": {
|
|
11
|
+
"type": "individual",
|
|
12
|
+
"url": "http://paypal.me/tripolskypetr"
|
|
13
|
+
},
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"homepage": "https://backtest-kit.github.io/documents/article_07_ai_news_trading_signals.html",
|
|
16
|
+
"keywords": [
|
|
17
|
+
"backtesting",
|
|
18
|
+
"backtest",
|
|
19
|
+
"finance",
|
|
20
|
+
"trading",
|
|
21
|
+
"candles",
|
|
22
|
+
"indicators",
|
|
23
|
+
"multi value",
|
|
24
|
+
"multi symbol",
|
|
25
|
+
"framework"
|
|
26
|
+
],
|
|
27
|
+
"files": [
|
|
28
|
+
"build",
|
|
29
|
+
"types.d.ts",
|
|
30
|
+
"README.md"
|
|
31
|
+
],
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "https://github.com/tripolskypetr/backtest-kit",
|
|
35
|
+
"documentation": "https://github.com/tripolskypetr/backtest-kit/tree/master/docs"
|
|
36
|
+
},
|
|
37
|
+
"bugs": {
|
|
38
|
+
"url": "https://github.com/tripolskypetr/backtest-kit/issues"
|
|
39
|
+
},
|
|
40
|
+
"scripts": {
|
|
41
|
+
"build": "rollup -c",
|
|
42
|
+
"test": "npm run build && node ./test/index.mjs",
|
|
43
|
+
"build:docs": "rimraf docs && mkdir docs && node ./scripts/dts-docs.cjs ./types.d.ts ./docs",
|
|
44
|
+
"docs:gpt": "npm run build && node ./tools/gpt-docs/index.mjs",
|
|
45
|
+
"docs:uml": "npm run build && node ./scripts/uml.mjs",
|
|
46
|
+
"docs:www": "rimraf docs/wwwroot && node ./tools/typedoc-packages-docs/index.mjs && typedoc && node ./tools/typedoc-yandex-metrica/index.mjs",
|
|
47
|
+
"repl": "dotenv -e .env -- npm run build && node -e \"import('./scripts/repl.mjs')\" --interactive"
|
|
48
|
+
},
|
|
49
|
+
"main": "build/index.cjs",
|
|
50
|
+
"module": "build/index.mjs",
|
|
51
|
+
"source": "src/index.ts",
|
|
52
|
+
"types": "./types.d.ts",
|
|
53
|
+
"exports": {
|
|
54
|
+
"require": "./build/index.cjs",
|
|
55
|
+
"types": "./types.d.ts",
|
|
56
|
+
"import": "./build/index.mjs",
|
|
57
|
+
"default": "./build/index.cjs"
|
|
58
|
+
},
|
|
59
|
+
"devDependencies": {
|
|
60
|
+
"@rollup/plugin-typescript": "11.1.6",
|
|
61
|
+
"@types/node": "22.9.0",
|
|
62
|
+
"glob": "11.0.1",
|
|
63
|
+
"plantuml": "0.0.2",
|
|
64
|
+
"rimraf": "6.0.1",
|
|
65
|
+
"rollup": "3.29.5",
|
|
66
|
+
"rollup-plugin-dts": "6.1.1",
|
|
67
|
+
"rollup-plugin-peer-deps-external": "2.2.4",
|
|
68
|
+
"ts-morph": "27.0.2",
|
|
69
|
+
"tslib": "2.7.0",
|
|
70
|
+
"typedoc": "0.27.9",
|
|
71
|
+
"worker-testbed": "2.0.0"
|
|
72
|
+
},
|
|
73
|
+
"peerDependencies": {
|
|
74
|
+
"typescript": "^5.0.0"
|
|
75
|
+
},
|
|
76
|
+
"dependencies": {
|
|
77
|
+
"di-kit": "^1.1.1",
|
|
78
|
+
"di-scoped": "^1.0.21",
|
|
79
|
+
"di-singleton": "^1.0.5",
|
|
80
|
+
"functools-kit": "^2.3.0",
|
|
81
|
+
"get-moment-stamp": "^2.0.0"
|
|
82
|
+
},
|
|
83
|
+
"publishConfig": {
|
|
84
|
+
"access": "public"
|
|
85
|
+
}
|
|
86
|
+
}
|
package/types.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as di_scoped from 'di-scoped';
|
|
2
2
|
import * as functools_kit from 'functools-kit';
|
|
3
|
-
import { Subject } from 'functools-kit';
|
|
3
|
+
import { Subject, BehaviorSubject } from 'functools-kit';
|
|
4
4
|
import { WriteStream } from 'fs';
|
|
5
5
|
|
|
6
6
|
/**
|
|
@@ -4618,7 +4618,7 @@ interface BacktestStatisticsModel {
|
|
|
4618
4618
|
stdDev: number | null;
|
|
4619
4619
|
/** Sharpe Ratio (risk-adjusted return = avgPnl / stdDev), null if unsafe. Higher is better. */
|
|
4620
4620
|
sharpeRatio: number | null;
|
|
4621
|
-
/** Annualized Sharpe Ratio (sharpeRatio × √
|
|
4621
|
+
/** Annualized Sharpe Ratio (sharpeRatio × √tradesPerYear), null if unsafe. Higher is better. */
|
|
4622
4622
|
annualizedSharpeRatio: number | null;
|
|
4623
4623
|
/** Certainty Ratio (avgWin / |avgLoss|), null if unsafe. Higher is better. */
|
|
4624
4624
|
certaintyRatio: number | null;
|
|
@@ -4628,7 +4628,7 @@ interface BacktestStatisticsModel {
|
|
|
4628
4628
|
avgPeakPnl: number | null;
|
|
4629
4629
|
/** Average fall PNL percentage across all signals (_fall.pnlPercentage), null if unsafe. Lower (more negative) means deeper drawdowns. */
|
|
4630
4630
|
avgFallPnl: number | null;
|
|
4631
|
-
/** Sortino Ratio (avgPnl / downside deviation —
|
|
4631
|
+
/** Sortino Ratio (avgPnl / downside deviation — RMS of losing trades only), null if unsafe. Higher is better. */
|
|
4632
4632
|
sortinoRatio: number | null;
|
|
4633
4633
|
/** Calmar Ratio (annualized expected return / max drawdown), null if unsafe. Higher is better. */
|
|
4634
4634
|
calmarRatio: number | null;
|
|
@@ -10693,7 +10693,7 @@ interface IHeatmapRow {
|
|
|
10693
10693
|
symbol: string;
|
|
10694
10694
|
/** Total profit/loss percentage across all closed trades */
|
|
10695
10695
|
totalPnl: number | null;
|
|
10696
|
-
/** Risk-adjusted return (Sharpe Ratio) */
|
|
10696
|
+
/** Risk-adjusted return per trade (Sharpe Ratio = avgPnl / stdDev) */
|
|
10697
10697
|
sharpeRatio: number | null;
|
|
10698
10698
|
/** Maximum drawdown percentage (largest peak-to-trough decline) */
|
|
10699
10699
|
maxDrawdown: number | null;
|
|
@@ -10725,7 +10725,7 @@ interface IHeatmapRow {
|
|
|
10725
10725
|
avgPeakPnl: number | null;
|
|
10726
10726
|
/** Average fall PNL percentage across all trades (_fall.pnlPercentage). Closer to 0 is better. */
|
|
10727
10727
|
avgFallPnl: number | null;
|
|
10728
|
-
/** Sortino Ratio (avgPnl / downside deviation —
|
|
10728
|
+
/** Sortino Ratio (avgPnl / downside deviation — RMS of losing trades only). Higher is better. */
|
|
10729
10729
|
sortinoRatio: number | null;
|
|
10730
10730
|
/** Calmar Ratio (totalPnl / maxDrawdown). Higher is better. */
|
|
10731
10731
|
calmarRatio: number | null;
|
|
@@ -12593,7 +12593,7 @@ interface LiveStatisticsModel {
|
|
|
12593
12593
|
stdDev: number | null;
|
|
12594
12594
|
/** Sharpe Ratio (risk-adjusted return = avgPnl / stdDev), null if unsafe. Higher is better. */
|
|
12595
12595
|
sharpeRatio: number | null;
|
|
12596
|
-
/** Annualized Sharpe Ratio (sharpeRatio × √
|
|
12596
|
+
/** Annualized Sharpe Ratio (sharpeRatio × √tradesPerYear), null if unsafe. Higher is better. */
|
|
12597
12597
|
annualizedSharpeRatio: number | null;
|
|
12598
12598
|
/** Certainty Ratio (avgWin / |avgLoss|), null if unsafe. Higher is better. */
|
|
12599
12599
|
certaintyRatio: number | null;
|
|
@@ -12603,7 +12603,7 @@ interface LiveStatisticsModel {
|
|
|
12603
12603
|
avgPeakPnl: number | null;
|
|
12604
12604
|
/** Average fall PNL percentage across all closed signals (_fall.pnlPercentage), null if unsafe. Closer to 0 is better. */
|
|
12605
12605
|
avgFallPnl: number | null;
|
|
12606
|
-
/** Sortino Ratio (avgPnl / downside deviation —
|
|
12606
|
+
/** Sortino Ratio (avgPnl / downside deviation — RMS of losing trades only), null if unsafe. Higher is better. */
|
|
12607
12607
|
sortinoRatio: number | null;
|
|
12608
12608
|
/** Calmar Ratio (annualized expected return / max drawdown), null if unsafe. Higher is better. */
|
|
12609
12609
|
calmarRatio: number | null;
|
|
@@ -21480,7 +21480,7 @@ declare class HeatMarkdownService {
|
|
|
21480
21480
|
* console.log(markdown);
|
|
21481
21481
|
* // # Portfolio Heatmap: my-strategy
|
|
21482
21482
|
* //
|
|
21483
|
-
* // **Total Symbols:** 5 | **Portfolio PNL:** +45.3% | **
|
|
21483
|
+
* // **Total Symbols:** 5 | **Portfolio PNL:** +45.3% | **Pooled Sharpe:** 1.85 | **Total Trades:** 120
|
|
21484
21484
|
* //
|
|
21485
21485
|
* // | Symbol | Total PNL | Sharpe | Max DD | Trades |
|
|
21486
21486
|
* // | --- | --- | --- | --- | --- |
|
|
@@ -26529,6 +26529,33 @@ declare class CronUtils {
|
|
|
26529
26529
|
* `clear()` for those).
|
|
26530
26530
|
*/
|
|
26531
26531
|
disable: () => void;
|
|
26532
|
+
/**
|
|
26533
|
+
* Hard-reset the entire `Cron` state.
|
|
26534
|
+
*
|
|
26535
|
+
* Performs in order:
|
|
26536
|
+
* 1. {@link disable} — tears down lifecycle subscriptions and resets the
|
|
26537
|
+
* `enable` singleshot so a future `enable()` re-subscribes cleanly.
|
|
26538
|
+
* 2. Wipes `_entries` — every {@link register}'ed entry is forgotten.
|
|
26539
|
+
* Disposers returned by previous `register()` calls become no-ops
|
|
26540
|
+
* (their `unregister(name)` will not find anything to remove).
|
|
26541
|
+
* 3. Wipes `_firedOnce` — all fire-once marks are dropped, so any future
|
|
26542
|
+
* re-registration of the same `name` fires again on the next matching
|
|
26543
|
+
* tick.
|
|
26544
|
+
* 4. Does **not** touch `_inFlight` — in-flight handlers continue to
|
|
26545
|
+
* settle in the background and clear their own slots via `.finally()`.
|
|
26546
|
+
* Their final `_firedOnce.add(firedKey)` writes carry old-generation
|
|
26547
|
+
* keys and are harmless (lookup uses the post-dispose generation).
|
|
26548
|
+
*
|
|
26549
|
+
* Use from a CLI/session teardown when you want to throw away every
|
|
26550
|
+
* registration along with the lifecycle wiring — e.g. between two
|
|
26551
|
+
* independent runner scopes. For "just snap the subscriptions but keep
|
|
26552
|
+
* registrations" use {@link disable} instead; for "just re-arm fire-once
|
|
26553
|
+
* marks" use {@link clear}.
|
|
26554
|
+
*
|
|
26555
|
+
* Idempotent. Safe to call multiple times and safe to call before
|
|
26556
|
+
* `enable()` / without any registrations.
|
|
26557
|
+
*/
|
|
26558
|
+
dispose: () => void;
|
|
26532
26559
|
}
|
|
26533
26560
|
/**
|
|
26534
26561
|
* Singleton instance of {@link CronUtils} for registering periodic tasks
|
|
@@ -29064,6 +29091,13 @@ declare const beforeStartSubject: Subject<BeforeStartContract>;
|
|
|
29064
29091
|
* Emits when the engine has completed processing a signal.
|
|
29065
29092
|
*/
|
|
29066
29093
|
declare const afterEndSubject: Subject<AfterEndContract>;
|
|
29094
|
+
/**
|
|
29095
|
+
* Emitter for `@backtest-kit/cli`, which notifies the application
|
|
29096
|
+
* that all modules have been initialized.
|
|
29097
|
+
*
|
|
29098
|
+
* Send entry absolute path to the consumer
|
|
29099
|
+
*/
|
|
29100
|
+
declare const entrySubject: BehaviorSubject<string>;
|
|
29067
29101
|
|
|
29068
29102
|
declare const emitters_activePingSubject: typeof activePingSubject;
|
|
29069
29103
|
declare const emitters_afterEndSubject: typeof afterEndSubject;
|
|
@@ -29073,6 +29107,7 @@ declare const emitters_breakevenSubject: typeof breakevenSubject;
|
|
|
29073
29107
|
declare const emitters_doneBacktestSubject: typeof doneBacktestSubject;
|
|
29074
29108
|
declare const emitters_doneLiveSubject: typeof doneLiveSubject;
|
|
29075
29109
|
declare const emitters_doneWalkerSubject: typeof doneWalkerSubject;
|
|
29110
|
+
declare const emitters_entrySubject: typeof entrySubject;
|
|
29076
29111
|
declare const emitters_errorEmitter: typeof errorEmitter;
|
|
29077
29112
|
declare const emitters_exitEmitter: typeof exitEmitter;
|
|
29078
29113
|
declare const emitters_highestProfitSubject: typeof highestProfitSubject;
|
|
@@ -29097,7 +29132,7 @@ declare const emitters_walkerCompleteSubject: typeof walkerCompleteSubject;
|
|
|
29097
29132
|
declare const emitters_walkerEmitter: typeof walkerEmitter;
|
|
29098
29133
|
declare const emitters_walkerStopSubject: typeof walkerStopSubject;
|
|
29099
29134
|
declare namespace emitters {
|
|
29100
|
-
export { emitters_activePingSubject as activePingSubject, emitters_afterEndSubject as afterEndSubject, emitters_backtestScheduleOpenSubject as backtestScheduleOpenSubject, emitters_beforeStartSubject as beforeStartSubject, emitters_breakevenSubject as breakevenSubject, emitters_doneBacktestSubject as doneBacktestSubject, emitters_doneLiveSubject as doneLiveSubject, emitters_doneWalkerSubject as doneWalkerSubject, emitters_errorEmitter as errorEmitter, emitters_exitEmitter as exitEmitter, emitters_highestProfitSubject as highestProfitSubject, emitters_idlePingSubject as idlePingSubject, emitters_maxDrawdownSubject as maxDrawdownSubject, emitters_partialLossSubject as partialLossSubject, emitters_partialProfitSubject as partialProfitSubject, emitters_performanceEmitter as performanceEmitter, emitters_progressBacktestEmitter as progressBacktestEmitter, emitters_progressWalkerEmitter as progressWalkerEmitter, emitters_riskSubject as riskSubject, emitters_schedulePingSubject as schedulePingSubject, emitters_shutdownEmitter as shutdownEmitter, emitters_signalBacktestEmitter as signalBacktestEmitter, emitters_signalEmitter as signalEmitter, emitters_signalLiveEmitter as signalLiveEmitter, emitters_signalNotifySubject as signalNotifySubject, emitters_strategyCommitSubject as strategyCommitSubject, emitters_syncSubject as syncSubject, emitters_validationSubject as validationSubject, emitters_walkerCompleteSubject as walkerCompleteSubject, emitters_walkerEmitter as walkerEmitter, emitters_walkerStopSubject as walkerStopSubject };
|
|
29135
|
+
export { emitters_activePingSubject as activePingSubject, emitters_afterEndSubject as afterEndSubject, emitters_backtestScheduleOpenSubject as backtestScheduleOpenSubject, emitters_beforeStartSubject as beforeStartSubject, emitters_breakevenSubject as breakevenSubject, emitters_doneBacktestSubject as doneBacktestSubject, emitters_doneLiveSubject as doneLiveSubject, emitters_doneWalkerSubject as doneWalkerSubject, emitters_entrySubject as entrySubject, emitters_errorEmitter as errorEmitter, emitters_exitEmitter as exitEmitter, emitters_highestProfitSubject as highestProfitSubject, emitters_idlePingSubject as idlePingSubject, emitters_maxDrawdownSubject as maxDrawdownSubject, emitters_partialLossSubject as partialLossSubject, emitters_partialProfitSubject as partialProfitSubject, emitters_performanceEmitter as performanceEmitter, emitters_progressBacktestEmitter as progressBacktestEmitter, emitters_progressWalkerEmitter as progressWalkerEmitter, emitters_riskSubject as riskSubject, emitters_schedulePingSubject as schedulePingSubject, emitters_shutdownEmitter as shutdownEmitter, emitters_signalBacktestEmitter as signalBacktestEmitter, emitters_signalEmitter as signalEmitter, emitters_signalLiveEmitter as signalLiveEmitter, emitters_signalNotifySubject as signalNotifySubject, emitters_strategyCommitSubject as strategyCommitSubject, emitters_syncSubject as syncSubject, emitters_validationSubject as validationSubject, emitters_walkerCompleteSubject as walkerCompleteSubject, emitters_walkerEmitter as walkerEmitter, emitters_walkerStopSubject as walkerStopSubject };
|
|
29101
29136
|
}
|
|
29102
29137
|
|
|
29103
29138
|
/**
|