@samsmith2121/synthetic-leverage-engine 0.1.0 → 0.1.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.
@@ -1,5 +1,5 @@
1
1
  import { DayInput, EngineConfig } from '../types';
2
- import { SimulatorBacktestRequest, SimulatorDay, SimulatorMonteCarloRequest } from './types';
2
+ import { SimulatorBacktestRequest, SimulatorDiagnosticsRequest, SimulatorDay, SimulatorMonteCarloRequest } from './types';
3
3
  export interface PreparedSimulatorRun {
4
4
  sourceDays: SimulatorDay[];
5
5
  engineDays: DayInput[];
@@ -7,3 +7,4 @@ export interface PreparedSimulatorRun {
7
7
  }
8
8
  export declare function prepareSimulatorBacktest(request: SimulatorBacktestRequest): PreparedSimulatorRun;
9
9
  export declare function prepareSimulatorMonteCarlo(request: SimulatorMonteCarloRequest): PreparedSimulatorRun;
10
+ export declare function prepareSimulatorDiagnostics(request: SimulatorDiagnosticsRequest): PreparedSimulatorRun[];
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.prepareSimulatorBacktest = prepareSimulatorBacktest;
4
4
  exports.prepareSimulatorMonteCarlo = prepareSimulatorMonteCarlo;
5
+ exports.prepareSimulatorDiagnostics = prepareSimulatorDiagnostics;
5
6
  const costs_1 = require("../costs");
6
7
  const signal_1 = require("../signal");
7
8
  const DEFAULT_BUILTIN_RATE_ANNUAL = 0.04;
@@ -11,6 +12,9 @@ function prepareSimulatorBacktest(request) {
11
12
  function prepareSimulatorMonteCarlo(request) {
12
13
  return prepareSimulatorRun(request.days, request.config, request.strategy);
13
14
  }
15
+ function prepareSimulatorDiagnostics(request) {
16
+ return request.strategies.map((strategy) => prepareSimulatorRun(request.days, request.config, strategy));
17
+ }
14
18
  function prepareSimulatorRun(sourceDays, simulatorConfig, simulatorStrategy) {
15
19
  const targetSignals = (0, signal_1.buildThresholdSignalTargets)(sourceDays, simulatorStrategy);
16
20
  const engineDays = sourceDays.map((day, index) => buildEngineDay({
@@ -1,4 +1,5 @@
1
- import type { SimulatorBacktestRequest, SimulatorBacktestResponse, SimulatorMonteCarloRequest, SimulatorMonteCarloResponse } from './types';
2
- export type { SimulatorAnnualReturnPoint, SimulatorBacktestRequest, SimulatorBacktestResponse, SimulatorBacktestSeries, SimulatorBacktestSummary, SimulatorConfig, SimulatorDay, SimulatorMonteCarloPoint, SimulatorMonteCarloRequest, SimulatorMonteCarloResponse, SimulatorStrategy, SimulatorWarning, } from './types';
1
+ import type { SimulatorBacktestRequest, SimulatorBacktestResponse, SimulatorDiagnosticsRequest, SimulatorDiagnosticsResponse, SimulatorMonteCarloRequest, SimulatorMonteCarloResponse } from './types';
2
+ export type { SimulatorAnnualReturnPoint, SimulatorBacktestRequest, SimulatorBacktestResponse, SimulatorBacktestSeries, SimulatorBacktestSummary, SimulatorConfig, SimulatorDay, SimulatorDiagnosticsRequest, SimulatorDiagnosticsResponse, SimulatorDiagnosticsRow, SimulatorMonteCarloPoint, SimulatorMonteCarloRequest, SimulatorMonteCarloResponse, SimulatorStrategy, SimulatorWarning, } from './types';
3
3
  export declare function runSingleBacktest(request: SimulatorBacktestRequest): SimulatorBacktestResponse;
4
4
  export declare function runMonteCarlo(request: SimulatorMonteCarloRequest): SimulatorMonteCarloResponse;
5
+ export declare function runDiagnostics(request: SimulatorDiagnosticsRequest): SimulatorDiagnosticsResponse;
@@ -2,6 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.runSingleBacktest = runSingleBacktest;
4
4
  exports.runMonteCarlo = runMonteCarlo;
5
+ exports.runDiagnostics = runDiagnostics;
6
+ const analysis_1 = require("../analysis");
5
7
  const backtest_1 = require("../backtest");
6
8
  const adapters_1 = require("./adapters");
7
9
  const monte_carlo_1 = require("./monte-carlo");
@@ -29,3 +31,33 @@ function runMonteCarlo(request) {
29
31
  initialEquity: request.config.initialEquity,
30
32
  });
31
33
  }
34
+ function runDiagnostics(request) {
35
+ const preparedRuns = (0, adapters_1.prepareSimulatorDiagnostics)(request);
36
+ return {
37
+ diagnosticsRows: preparedRuns.map((prepared, index) => {
38
+ const result = (0, backtest_1.runFixedBacktest)(prepared.engineDays, prepared.engineConfig);
39
+ return mapDiagnosticsRow(request.strategies[index], (0, analysis_1.buildStrategyDiagnostics)(result, totalInvested(result, request.config.initialEquity)));
40
+ }),
41
+ };
42
+ }
43
+ function totalInvested(result, initialEquity) {
44
+ return initialEquity + result.daily.reduce((sum, day) => sum + day.contribution, 0);
45
+ }
46
+ function mapDiagnosticsRow(strategy, diagnostics) {
47
+ return {
48
+ strategy_name: strategy.name,
49
+ pct_days_cash: diagnostics.exposure.pctDaysCash,
50
+ pct_days_one_x: diagnostics.exposure.pctDaysOneX,
51
+ pct_days_leveraged: diagnostics.exposure.pctDaysLeveraged,
52
+ average_applied_leverage: diagnostics.exposure.averageAppliedLeverage,
53
+ total_switches: diagnostics.transitions.totalSwitches,
54
+ total_cost: diagnostics.costs.totalCost,
55
+ trade_cost_share: diagnostics.costs.tradeCostShare,
56
+ borrow_cost_share: diagnostics.costs.borrowCostShare,
57
+ er_cost_share: diagnostics.costs.erCostShare,
58
+ max_drawdown: diagnostics.drawdown.maxDrawdown,
59
+ max_drawdown_duration_days: diagnostics.drawdown.maxDrawdownDurationDays,
60
+ outperform_pct: diagnostics.benchmarkRelative?.outperformPct ?? null,
61
+ excess_twr_cagr: diagnostics.benchmarkRelative?.excessTwrCagr ?? null,
62
+ };
63
+ }
@@ -109,3 +109,27 @@ export interface SimulatorMonteCarloResponse {
109
109
  warnings: SimulatorWarning[];
110
110
  };
111
111
  }
112
+ export interface SimulatorDiagnosticsRow {
113
+ strategy_name: string;
114
+ pct_days_cash: number;
115
+ pct_days_one_x: number;
116
+ pct_days_leveraged: number;
117
+ average_applied_leverage: number;
118
+ total_switches: number;
119
+ total_cost: number;
120
+ trade_cost_share: number;
121
+ borrow_cost_share: number;
122
+ er_cost_share: number;
123
+ max_drawdown: number;
124
+ max_drawdown_duration_days: number;
125
+ outperform_pct: number | null;
126
+ excess_twr_cagr: number | null;
127
+ }
128
+ export interface SimulatorDiagnosticsRequest {
129
+ days: SimulatorDay[];
130
+ config: SimulatorConfig;
131
+ strategies: SimulatorStrategy[];
132
+ }
133
+ export interface SimulatorDiagnosticsResponse {
134
+ diagnosticsRows: SimulatorDiagnosticsRow[];
135
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@samsmith2121/synthetic-leverage-engine",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "type": "commonjs",
5
5
  "main": "./dist/src/index.js",
6
6
  "types": "./dist/src/index.d.ts",