@livefolio/sdk 0.2.3 → 0.2.5
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/README.md +3 -0
- package/dist/market/client.d.ts.map +1 -1
- package/dist/market/client.js +28 -0
- package/dist/market/client.js.map +1 -1
- package/dist/market/index.d.ts +2 -0
- package/dist/market/index.d.ts.map +1 -1
- package/dist/market/index.js +4 -1
- package/dist/market/index.js.map +1 -1
- package/dist/market/trackedTickers.d.ts +4 -0
- package/dist/market/trackedTickers.d.ts.map +1 -0
- package/dist/market/trackedTickers.js +256 -0
- package/dist/market/trackedTickers.js.map +1 -0
- package/dist/market/types.d.ts +2 -0
- package/dist/market/types.d.ts.map +1 -1
- package/dist/strategy/backtest.d.ts +5 -2
- package/dist/strategy/backtest.d.ts.map +1 -1
- package/dist/strategy/backtest.js +657 -2
- package/dist/strategy/backtest.js.map +1 -1
- package/dist/strategy/client.d.ts.map +1 -1
- package/dist/strategy/client.js +4 -1
- package/dist/strategy/client.js.map +1 -1
- package/dist/strategy/evaluate.d.ts.map +1 -1
- package/dist/strategy/evaluate.js +35 -8
- package/dist/strategy/evaluate.js.map +1 -1
- package/dist/strategy/index.d.ts +5 -2
- package/dist/strategy/index.d.ts.map +1 -1
- package/dist/strategy/index.js +11 -1
- package/dist/strategy/index.js.map +1 -1
- package/dist/strategy/livefolio.d.ts +25 -0
- package/dist/strategy/livefolio.d.ts.map +1 -0
- package/dist/strategy/livefolio.js +67 -0
- package/dist/strategy/livefolio.js.map +1 -0
- package/dist/strategy/rules.d.ts +3 -0
- package/dist/strategy/rules.d.ts.map +1 -0
- package/dist/strategy/rules.js +100 -0
- package/dist/strategy/rules.js.map +1 -0
- package/dist/strategy/types.d.ts +86 -1
- package/dist/strategy/types.d.ts.map +1 -1
- package/package.json +6 -2
package/dist/strategy/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Observation } from '../market/types';
|
|
1
|
+
import type { Observation, TradingDay } from '../market/types';
|
|
2
2
|
export type Comparison = '>' | '<' | '=';
|
|
3
3
|
export type IndicatorType = 'SMA' | 'EMA' | 'Price' | 'Return' | 'Volatility' | 'Drawdown' | 'RSI' | 'VIX' | 'VIX3M' | 'T3M' | 'T6M' | 'T1Y' | 'T2Y' | 'T3Y' | 'T5Y' | 'T7Y' | 'T10Y' | 'T20Y' | 'T30Y' | 'Month' | 'Day of Week' | 'Day of Month' | 'Day of Year' | 'Threshold';
|
|
4
4
|
export type Frequency = 'Daily' | 'Weekly' | 'Monthly' | 'Bi-monthly' | 'Quarterly' | 'Every 4 Months' | 'Semiannually' | 'Yearly';
|
|
@@ -66,6 +66,36 @@ export interface Strategy {
|
|
|
66
66
|
allocations: NamedAllocation[];
|
|
67
67
|
signals: NamedSignal[];
|
|
68
68
|
}
|
|
69
|
+
export interface SignalNameExpr {
|
|
70
|
+
kind: 'signal';
|
|
71
|
+
signalName: string;
|
|
72
|
+
}
|
|
73
|
+
export interface NotSignalNameExpr {
|
|
74
|
+
kind: 'not';
|
|
75
|
+
signalName: string;
|
|
76
|
+
}
|
|
77
|
+
export type SignalNameUnaryExpr = SignalNameExpr | NotSignalNameExpr;
|
|
78
|
+
export interface SignalNameAndExpr {
|
|
79
|
+
kind: 'and';
|
|
80
|
+
args: SignalNameUnaryExpr[];
|
|
81
|
+
}
|
|
82
|
+
export interface SignalNameOrExpr {
|
|
83
|
+
kind: 'or';
|
|
84
|
+
args: SignalNameAndExpr[];
|
|
85
|
+
}
|
|
86
|
+
export type SignalNameCondition = SignalNameOrExpr | SignalNameAndExpr | SignalNameUnaryExpr;
|
|
87
|
+
export interface StrategyAllocationDraft {
|
|
88
|
+
name: string;
|
|
89
|
+
condition: SignalNameCondition;
|
|
90
|
+
holdings: Holding[];
|
|
91
|
+
}
|
|
92
|
+
export interface StrategyDraft {
|
|
93
|
+
linkId: string;
|
|
94
|
+
name: string;
|
|
95
|
+
trading: Trading;
|
|
96
|
+
signals: NamedSignal[];
|
|
97
|
+
allocations: StrategyAllocationDraft[];
|
|
98
|
+
}
|
|
69
99
|
export interface EvaluationOptions {
|
|
70
100
|
at: Date;
|
|
71
101
|
batchSeries: Record<string, Observation[]>;
|
|
@@ -95,8 +125,61 @@ export interface StreamObservation {
|
|
|
95
125
|
export interface BacktestOptions {
|
|
96
126
|
startDate: string;
|
|
97
127
|
endDate: string;
|
|
128
|
+
initialCapital?: number;
|
|
129
|
+
batchSeries?: Record<string, Observation[]>;
|
|
130
|
+
tradingDays?: TradingDay[];
|
|
131
|
+
allocationRebalance?: Record<string, BacktestRebalanceConfig>;
|
|
132
|
+
debug?: boolean | BacktestDebugOptions;
|
|
133
|
+
}
|
|
134
|
+
export interface BacktestDebugOptions {
|
|
135
|
+
logEveryDays?: number;
|
|
136
|
+
}
|
|
137
|
+
export type BacktestRebalanceConfig = {
|
|
138
|
+
mode: 'on_change';
|
|
139
|
+
} | {
|
|
140
|
+
mode: 'drift';
|
|
141
|
+
driftPct: number;
|
|
142
|
+
} | {
|
|
143
|
+
mode: 'calendar';
|
|
144
|
+
frequency: 'Daily' | 'Monthly' | 'Yearly';
|
|
145
|
+
};
|
|
146
|
+
export interface BacktestTrade {
|
|
147
|
+
date: string;
|
|
148
|
+
ticker: string;
|
|
149
|
+
leverage: number;
|
|
150
|
+
shares: number;
|
|
151
|
+
price: number;
|
|
152
|
+
value: number;
|
|
153
|
+
action: 'buy' | 'sell';
|
|
154
|
+
allocation: string;
|
|
155
|
+
}
|
|
156
|
+
export interface BacktestTimeseries {
|
|
157
|
+
dates: string[];
|
|
158
|
+
portfolio: number[];
|
|
159
|
+
cash: number[];
|
|
160
|
+
drawdownPct: number[];
|
|
161
|
+
allocation: string[];
|
|
162
|
+
}
|
|
163
|
+
export interface BacktestSummary {
|
|
164
|
+
initialValue: number;
|
|
165
|
+
finalValue: number;
|
|
166
|
+
totalReturnPct: number;
|
|
167
|
+
cagrPct: number;
|
|
168
|
+
maxDrawdownPct: number;
|
|
169
|
+
annualizedVolatilityPct: number;
|
|
170
|
+
sharpeRatio: number;
|
|
171
|
+
tradeCount: number;
|
|
172
|
+
}
|
|
173
|
+
export interface BacktestAnnualTax {
|
|
174
|
+
year: number;
|
|
175
|
+
shortTermRealizedGains: number;
|
|
176
|
+
longTermRealizedGains: number;
|
|
98
177
|
}
|
|
99
178
|
export interface BacktestResult {
|
|
179
|
+
timeseries: BacktestTimeseries;
|
|
180
|
+
summary: BacktestSummary;
|
|
181
|
+
trades: BacktestTrade[];
|
|
182
|
+
annualTax: BacktestAnnualTax[];
|
|
100
183
|
}
|
|
101
184
|
export interface StrategyModule {
|
|
102
185
|
get(linkId: string): Promise<Strategy | null>;
|
|
@@ -107,6 +190,8 @@ export interface StrategyModule {
|
|
|
107
190
|
evaluateAllocation(allocation: Allocation, options: EvaluationOptions): boolean;
|
|
108
191
|
getEvaluationDate(trading: Trading, options: EvaluationOptions): Date;
|
|
109
192
|
extractSymbols(strategy: Strategy): string[];
|
|
193
|
+
compileRules(strategyDraft: StrategyDraft): Strategy;
|
|
194
|
+
backtestRules(strategyDraft: StrategyDraft, options: BacktestOptions): Promise<BacktestResult>;
|
|
110
195
|
stream(strategy: Strategy, observation: StreamObservation | StreamObservation[]): Promise<StrategyEvaluation>;
|
|
111
196
|
backtest(strategy: Strategy, options: BacktestOptions): Promise<BacktestResult>;
|
|
112
197
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/strategy/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/strategy/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@livefolio/sdk",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.5",
|
|
4
4
|
"description": "Livefolio SDK — market data, strategy evaluation, and portfolio management",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -33,7 +33,11 @@
|
|
|
33
33
|
"build": "tsc",
|
|
34
34
|
"clean": "rm -rf dist",
|
|
35
35
|
"test": "vitest run",
|
|
36
|
-
"test:watch": "vitest"
|
|
36
|
+
"test:watch": "vitest",
|
|
37
|
+
"ingest:init": "node scripts/ingest-price-observations.cjs --mode init",
|
|
38
|
+
"ingest:daily": "node scripts/ingest-price-observations.cjs --mode daily",
|
|
39
|
+
"backtest:smoke": "node scripts/backtest-smoke.cjs",
|
|
40
|
+
"prepare": "npm run build"
|
|
37
41
|
},
|
|
38
42
|
"dependencies": {
|
|
39
43
|
"@livefolio/db": "*",
|