@gonzih/polymarket-arb 1.0.7 → 1.0.8
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/dist/backtest.d.ts +96 -0
- package/dist/backtest.d.ts.map +1 -0
- package/dist/backtest.js +370 -0
- package/dist/backtest.js.map +1 -0
- package/dist/backtestRunner.d.ts +2 -0
- package/dist/backtestRunner.d.ts.map +1 -0
- package/dist/backtestRunner.js +136 -0
- package/dist/backtestRunner.js.map +1 -0
- package/dist/claude.d.ts +2 -0
- package/dist/claude.d.ts.map +1 -1
- package/dist/claude.js +7 -0
- package/dist/claude.js.map +1 -1
- package/dist/daemon.d.ts +5 -0
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +111 -3
- package/dist/daemon.js.map +1 -1
- package/dist/index.js +52 -38
- package/dist/index.js.map +1 -1
- package/dist/simulationSignal.d.ts +42 -0
- package/dist/simulationSignal.d.ts.map +1 -0
- package/dist/simulationSignal.js +146 -0
- package/dist/simulationSignal.js.map +1 -0
- package/package.json +3 -2
package/dist/claude.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { MomentumSignal } from "./signal.js";
|
|
2
2
|
import type { Contract, WhaleFadeSignal } from "./polymarket.js";
|
|
3
|
+
import type { SimulationResult } from "./simulationSignal.js";
|
|
3
4
|
export type TradeAnalysis = {
|
|
4
5
|
confidence: number;
|
|
5
6
|
kelly_fraction: number;
|
|
@@ -10,6 +11,7 @@ export type ExtraContext = {
|
|
|
10
11
|
whaleFade?: WhaleFadeSignal | null;
|
|
11
12
|
simulationGap?: number | null;
|
|
12
13
|
highConfidenceEdge?: boolean;
|
|
14
|
+
simulation?: SimulationResult;
|
|
13
15
|
};
|
|
14
16
|
export declare function analyzeTradeOpportunity(signal: MomentumSignal, contract: Contract, extra?: ExtraContext): Promise<TradeAnalysis | null>;
|
|
15
17
|
//# sourceMappingURL=claude.d.ts.map
|
package/dist/claude.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAK9D,MAAM,MAAM,aAAa,GAAG;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B,CAAC;AAEF,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,QAAQ,EAClB,KAAK,CAAC,EAAE,YAAY,GACnB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA6E/B"}
|
package/dist/claude.js
CHANGED
|
@@ -21,6 +21,13 @@ export async function analyzeTradeOpportunity(signal, contract, extra) {
|
|
|
21
21
|
if (extra.highConfidenceEdge !== undefined) {
|
|
22
22
|
extraContext += `\nHigh-confidence edge: ${extra.highConfidenceEdge ? "YES — whale fade and simulation both agree on direction" : "NO"}.`;
|
|
23
23
|
}
|
|
24
|
+
if (extra.simulation) {
|
|
25
|
+
const sim = extra.simulation;
|
|
26
|
+
const edgeSign = sim.edge > 0 ? "+" : "";
|
|
27
|
+
extraContext += `\n4-agent debate signal: ${sim.signal} | Synthetic P(YES)=${(sim.syntheticProb * 100).toFixed(1)}% | Edge=${edgeSign}${(sim.edge * 100).toFixed(1)}pp | Spread=${(sim.spread * 100).toFixed(1)}pp`;
|
|
28
|
+
const breakdown = sim.agents.map((a) => `${a.agent}=${(a.prob * 100).toFixed(0)}%`).join(", ");
|
|
29
|
+
extraContext += `\n Agent breakdown: ${breakdown}`;
|
|
30
|
+
}
|
|
24
31
|
}
|
|
25
32
|
const prompt = `You are a prediction market arbitrage assistant. Analyze this trade opportunity and respond in JSON only.
|
|
26
33
|
|
package/dist/claude.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon.d.ts
CHANGED
|
@@ -6,9 +6,14 @@ export declare class TradingDaemon {
|
|
|
6
6
|
private lastSignal;
|
|
7
7
|
private dayResetTimer;
|
|
8
8
|
private simCache;
|
|
9
|
+
private lastDebateSimAt;
|
|
10
|
+
private lastMarketOdds;
|
|
11
|
+
private debateScheduleTimer;
|
|
12
|
+
private activeMarkets;
|
|
9
13
|
constructor(paperMode?: boolean);
|
|
10
14
|
start(): void;
|
|
11
15
|
stop(): void;
|
|
16
|
+
private scheduleDebateSimulation;
|
|
12
17
|
private scheduleDayReset;
|
|
13
18
|
}
|
|
14
19
|
//# sourceMappingURL=daemon.d.ts.map
|
package/dist/daemon.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AA8BA,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,IAAI,CAAoC;IAChD,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,QAAQ,CAA2E;IAG3F,OAAO,CAAC,eAAe,CAAkC;IACzD,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,mBAAmB,CAA+B;IAC1D,OAAO,CAAC,aAAa,CAAyG;gBAElH,SAAS,UAAO;IAK5B,KAAK,IAAI,IAAI;IA0Mb,IAAI,IAAI,IAAI;IAOZ,OAAO,CAAC,wBAAwB;IA+BhC,OAAO,CAAC,gBAAgB;CAWzB"}
|
package/dist/daemon.js
CHANGED
|
@@ -3,6 +3,7 @@ import { SignalEngine } from "./signal.js";
|
|
|
3
3
|
import { fetchContracts, fetchRecentTrades, detectWhaleFade, placeOrder } from "./polymarket.js";
|
|
4
4
|
import { analyzeTradeOpportunity } from "./claude.js";
|
|
5
5
|
import { simulateMarket, computeHighConfidenceEdge } from "./simulate.js";
|
|
6
|
+
import { runSimulation, shouldRunSimulation, kellyAdjustment, logSimulationResult, } from "./simulationSignal.js";
|
|
6
7
|
import { RiskManager } from "./kelly.js";
|
|
7
8
|
import { log } from "./logger.js";
|
|
8
9
|
const CLAUDE_CONFIDENCE_THRESHOLD = 0.65;
|
|
@@ -12,6 +13,11 @@ const SIM_MIN_VOLUME = 50_000; // 24h volume threshold for simulation
|
|
|
12
13
|
const SIM_MIN_ODDS = 0.15; // skip simulation near certainty
|
|
13
14
|
const SIM_MAX_ODDS = 0.85;
|
|
14
15
|
const SIM_CACHE_TTL_MS = 2 * 60 * 60 * 1000; // re-run sim at most every 2h per market
|
|
16
|
+
// Debate simulation constants
|
|
17
|
+
const DEBATE_WHALE_THRESHOLD = 100_000; // run debate simulation on whale trades >= $100k
|
|
18
|
+
const DEBATE_ODDS_DELTA_THRESHOLD = 0.07; // 7% odds change triggers debate simulation
|
|
19
|
+
const DEBATE_SCHEDULE_MIN_MS = 4 * 60 * 60 * 1000; // 4h minimum
|
|
20
|
+
const DEBATE_SCHEDULE_MAX_MS = 6 * 60 * 60 * 1000; // 6h maximum
|
|
15
21
|
export class TradingDaemon {
|
|
16
22
|
feeds = new FeedManager();
|
|
17
23
|
signals = new SignalEngine();
|
|
@@ -20,6 +26,11 @@ export class TradingDaemon {
|
|
|
20
26
|
lastSignal = new Map();
|
|
21
27
|
dayResetTimer = null;
|
|
22
28
|
simCache = new Map();
|
|
29
|
+
// Debate simulation state
|
|
30
|
+
lastDebateSimAt = new Map();
|
|
31
|
+
lastMarketOdds = new Map();
|
|
32
|
+
debateScheduleTimer = null;
|
|
33
|
+
activeMarkets = new Map();
|
|
23
34
|
constructor(paperMode = true) {
|
|
24
35
|
this.paperMode = paperMode;
|
|
25
36
|
log("info", { event: "daemon_start", paperMode, balance: INITIAL_BALANCE });
|
|
@@ -88,11 +99,76 @@ export class TradingDaemon {
|
|
|
88
99
|
simulationGapPp: simulationGap,
|
|
89
100
|
});
|
|
90
101
|
}
|
|
102
|
+
// Track this market for scheduled debate simulations
|
|
103
|
+
const hoursToResolution = Math.max(0, (contract.expiresAt - Date.now()) / 3_600_000);
|
|
104
|
+
this.activeMarkets.set(contract.id, {
|
|
105
|
+
question: contract.question,
|
|
106
|
+
odds,
|
|
107
|
+
volume: 0, // volume not available in Contract type; will be checked against threshold
|
|
108
|
+
hoursToResolution,
|
|
109
|
+
});
|
|
110
|
+
// Check for odds delta trigger (>7% change since last observed)
|
|
111
|
+
const lastOdds = this.lastMarketOdds.get(contract.id);
|
|
112
|
+
const oddsDelta = lastOdds !== undefined ? Math.abs(odds - lastOdds) : 0;
|
|
113
|
+
this.lastMarketOdds.set(contract.id, odds);
|
|
114
|
+
// Run debate simulation on whale trade or odds delta
|
|
115
|
+
let debateResult = null;
|
|
116
|
+
if (whaleFade && whaleFade.size >= DEBATE_WHALE_THRESHOLD) {
|
|
117
|
+
log("info", {
|
|
118
|
+
event: "debate_sim_trigger",
|
|
119
|
+
reason: "whale_trade",
|
|
120
|
+
marketId: contract.id,
|
|
121
|
+
whaleSize: whaleFade.size,
|
|
122
|
+
});
|
|
123
|
+
debateResult = await runSimulation({
|
|
124
|
+
type: 'whale',
|
|
125
|
+
marketId: contract.id,
|
|
126
|
+
marketQuestion: contract.question,
|
|
127
|
+
marketOdds: odds,
|
|
128
|
+
volume: whaleFade.size,
|
|
129
|
+
hoursToResolution,
|
|
130
|
+
}).catch(() => null);
|
|
131
|
+
if (debateResult)
|
|
132
|
+
logSimulationResult(debateResult, contract.question);
|
|
133
|
+
}
|
|
134
|
+
else if (oddsDelta >= DEBATE_ODDS_DELTA_THRESHOLD) {
|
|
135
|
+
log("info", {
|
|
136
|
+
event: "debate_sim_trigger",
|
|
137
|
+
reason: "odds_delta",
|
|
138
|
+
marketId: contract.id,
|
|
139
|
+
oddsDelta: parseFloat((oddsDelta * 100).toFixed(2)),
|
|
140
|
+
});
|
|
141
|
+
debateResult = await runSimulation({
|
|
142
|
+
type: 'odds_delta',
|
|
143
|
+
marketId: contract.id,
|
|
144
|
+
marketQuestion: contract.question,
|
|
145
|
+
marketOdds: odds,
|
|
146
|
+
volume: 0,
|
|
147
|
+
hoursToResolution,
|
|
148
|
+
}).catch(() => null);
|
|
149
|
+
if (debateResult)
|
|
150
|
+
logSimulationResult(debateResult, contract.question);
|
|
151
|
+
}
|
|
152
|
+
// Apply Kelly adjustment from debate result
|
|
153
|
+
let kellyMultiplier = 1.0;
|
|
154
|
+
if (debateResult) {
|
|
155
|
+
kellyMultiplier = kellyAdjustment(debateResult);
|
|
156
|
+
if (kellyMultiplier === 0.0) {
|
|
157
|
+
log("info", {
|
|
158
|
+
event: "trade_skipped",
|
|
159
|
+
reason: "debate_volatility_signal",
|
|
160
|
+
marketId: contract.id,
|
|
161
|
+
spread: debateResult.spread,
|
|
162
|
+
});
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
91
166
|
// Ask Claude for analysis (with extra context)
|
|
92
167
|
const analysis = await analyzeTradeOpportunity(signal, contract, {
|
|
93
168
|
whaleFade,
|
|
94
169
|
simulationGap,
|
|
95
170
|
highConfidenceEdge,
|
|
171
|
+
simulation: debateResult ?? undefined,
|
|
96
172
|
});
|
|
97
173
|
if (!analysis)
|
|
98
174
|
return;
|
|
@@ -106,9 +182,10 @@ export class TradingDaemon {
|
|
|
106
182
|
});
|
|
107
183
|
return;
|
|
108
184
|
}
|
|
109
|
-
// Size the position
|
|
185
|
+
// Size the position (apply debate Kelly multiplier)
|
|
110
186
|
const price = contract.yesPrice;
|
|
111
|
-
const
|
|
187
|
+
const adjustedKelly = analysis.kelly_fraction * kellyMultiplier;
|
|
188
|
+
const size = this.risk.sizePosition(adjustedKelly, price);
|
|
112
189
|
if (size <= 0) {
|
|
113
190
|
log("info", { event: "trade_skipped", reason: "zero_size" });
|
|
114
191
|
return;
|
|
@@ -121,7 +198,7 @@ export class TradingDaemon {
|
|
|
121
198
|
size,
|
|
122
199
|
price,
|
|
123
200
|
confidence: analysis.confidence,
|
|
124
|
-
kellyFraction:
|
|
201
|
+
kellyFraction: adjustedKelly,
|
|
125
202
|
reasoning: analysis.reasoning,
|
|
126
203
|
expiresAt: new Date(contract.expiresAt).toISOString(),
|
|
127
204
|
paperMode: this.paperMode,
|
|
@@ -131,14 +208,45 @@ export class TradingDaemon {
|
|
|
131
208
|
this.feeds.start();
|
|
132
209
|
// Reset daily P&L at midnight
|
|
133
210
|
this.scheduleDayReset();
|
|
211
|
+
// Schedule periodic debate simulations (every 4-6h)
|
|
212
|
+
this.scheduleDebateSimulation();
|
|
134
213
|
log("info", { event: "feeds_started" });
|
|
135
214
|
}
|
|
136
215
|
stop() {
|
|
137
216
|
this.feeds.stop();
|
|
138
217
|
if (this.dayResetTimer)
|
|
139
218
|
clearTimeout(this.dayResetTimer);
|
|
219
|
+
if (this.debateScheduleTimer)
|
|
220
|
+
clearTimeout(this.debateScheduleTimer);
|
|
140
221
|
log("info", { event: "daemon_stopped" });
|
|
141
222
|
}
|
|
223
|
+
scheduleDebateSimulation() {
|
|
224
|
+
const jitter = DEBATE_SCHEDULE_MIN_MS +
|
|
225
|
+
Math.random() * (DEBATE_SCHEDULE_MAX_MS - DEBATE_SCHEDULE_MIN_MS);
|
|
226
|
+
this.debateScheduleTimer = setTimeout(async () => {
|
|
227
|
+
log("info", { event: "debate_sim_scheduled_run", marketCount: this.activeMarkets.size });
|
|
228
|
+
for (const [marketId, market] of this.activeMarkets.entries()) {
|
|
229
|
+
if (!shouldRunSimulation(market.volume, market.hoursToResolution))
|
|
230
|
+
continue;
|
|
231
|
+
const lastRun = this.lastDebateSimAt.get(marketId) ?? 0;
|
|
232
|
+
if (Date.now() - lastRun < DEBATE_SCHEDULE_MIN_MS)
|
|
233
|
+
continue;
|
|
234
|
+
this.lastDebateSimAt.set(marketId, Date.now());
|
|
235
|
+
const result = await runSimulation({
|
|
236
|
+
type: 'scheduled',
|
|
237
|
+
marketId,
|
|
238
|
+
marketQuestion: market.question,
|
|
239
|
+
marketOdds: market.odds,
|
|
240
|
+
volume: market.volume,
|
|
241
|
+
hoursToResolution: market.hoursToResolution,
|
|
242
|
+
}).catch(() => null);
|
|
243
|
+
if (result)
|
|
244
|
+
logSimulationResult(result, market.question);
|
|
245
|
+
}
|
|
246
|
+
// Reschedule
|
|
247
|
+
this.scheduleDebateSimulation();
|
|
248
|
+
}, jitter);
|
|
249
|
+
}
|
|
142
250
|
scheduleDayReset() {
|
|
143
251
|
const now = new Date();
|
|
144
252
|
const midnight = new Date(now);
|
package/dist/daemon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -2,8 +2,20 @@
|
|
|
2
2
|
import { TradingDaemon } from "./daemon.js";
|
|
3
3
|
import { log, logDir } from "./logger.js";
|
|
4
4
|
const args = process.argv.slice(2);
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
// Backtest mode: `node dist/index.js backtest` or `docker run ... backtest`
|
|
6
|
+
if (args[0] === "backtest") {
|
|
7
|
+
import("./backtestRunner.js")
|
|
8
|
+
.then(({ runBacktest }) => runBacktest())
|
|
9
|
+
.then(() => process.exit(0))
|
|
10
|
+
.catch((err) => {
|
|
11
|
+
console.error("Backtest failed:", err);
|
|
12
|
+
process.exit(1);
|
|
13
|
+
});
|
|
14
|
+
// async import started; JS event loop keeps process alive until it resolves/rejects
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
18
|
+
console.log(`polymarket-arb — Claude-powered prediction market arbitrage bot
|
|
7
19
|
|
|
8
20
|
Usage: polymarket-arb [options]
|
|
9
21
|
|
|
@@ -11,6 +23,7 @@ Options:
|
|
|
11
23
|
--paper Paper trading mode (default, no real orders)
|
|
12
24
|
--live Live trading mode (requires POLYMARKET_API_KEY + POLYMARKET_SECRET)
|
|
13
25
|
--log-dir Override log directory (default: ~/.polymarket-arb)
|
|
26
|
+
--backtest Run historical backtest (alias: pass 'backtest' as first arg)
|
|
14
27
|
--help Show this help
|
|
15
28
|
|
|
16
29
|
Environment variables:
|
|
@@ -21,41 +34,42 @@ Environment variables:
|
|
|
21
34
|
|
|
22
35
|
Log directory: ${logDir()}
|
|
23
36
|
`);
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
// Determine paper mode
|
|
27
|
-
const paperMode = args.includes("--live")
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
if (!paperMode && !process.env.POLYMARKET_API_KEY) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
log("info", {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
});
|
|
42
|
-
if (process.env.CLAUDE_CODE_OAUTH_TOKEN) {
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
|
|
37
|
+
process.exit(0);
|
|
38
|
+
}
|
|
39
|
+
// Determine paper mode
|
|
40
|
+
const paperMode = args.includes("--live")
|
|
41
|
+
? false
|
|
42
|
+
: args.includes("--paper")
|
|
43
|
+
? true
|
|
44
|
+
: process.env.PAPER_MODE !== "false";
|
|
45
|
+
if (!paperMode && !process.env.POLYMARKET_API_KEY) {
|
|
46
|
+
console.error("ERROR: --live mode requires POLYMARKET_API_KEY environment variable");
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
log("info", {
|
|
50
|
+
event: "startup",
|
|
51
|
+
mode: paperMode ? "paper" : "live",
|
|
52
|
+
logDir: logDir(),
|
|
53
|
+
nodeVersion: process.version,
|
|
54
|
+
});
|
|
55
|
+
if (process.env.CLAUDE_CODE_OAUTH_TOKEN) {
|
|
56
|
+
log("info", { event: "claude_auth", method: "oauth_token" });
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
log("warn", { event: "claude_auth", method: "credential_file", note: "no CLAUDE_CODE_OAUTH_TOKEN set" });
|
|
60
|
+
}
|
|
61
|
+
const daemon = new TradingDaemon(paperMode);
|
|
62
|
+
daemon.start();
|
|
63
|
+
// Graceful shutdown
|
|
64
|
+
process.on("SIGTERM", () => {
|
|
65
|
+
log("info", { event: "sigterm_received" });
|
|
66
|
+
daemon.stop();
|
|
67
|
+
process.exit(0);
|
|
68
|
+
});
|
|
69
|
+
process.on("SIGINT", () => {
|
|
70
|
+
log("info", { event: "sigint_received" });
|
|
71
|
+
daemon.stop();
|
|
72
|
+
process.exit(0);
|
|
73
|
+
});
|
|
47
74
|
}
|
|
48
|
-
const daemon = new TradingDaemon(paperMode);
|
|
49
|
-
daemon.start();
|
|
50
|
-
// Graceful shutdown
|
|
51
|
-
process.on("SIGTERM", () => {
|
|
52
|
-
log("info", { event: "sigterm_received" });
|
|
53
|
-
daemon.stop();
|
|
54
|
-
process.exit(0);
|
|
55
|
-
});
|
|
56
|
-
process.on("SIGINT", () => {
|
|
57
|
-
log("info", { event: "sigint_received" });
|
|
58
|
-
daemon.stop();
|
|
59
|
-
process.exit(0);
|
|
60
|
-
});
|
|
61
75
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export type SimulationSignal = 'DIRECTIONAL' | 'VOLATILITY' | 'PASS';
|
|
2
|
+
export interface AgentEstimate {
|
|
3
|
+
agent: string;
|
|
4
|
+
prob: number;
|
|
5
|
+
reasoning: string;
|
|
6
|
+
}
|
|
7
|
+
export interface SimulationResult {
|
|
8
|
+
signal: SimulationSignal;
|
|
9
|
+
edge: number;
|
|
10
|
+
spread: number;
|
|
11
|
+
syntheticProb: number;
|
|
12
|
+
marketOdds: number;
|
|
13
|
+
agents: AgentEstimate[];
|
|
14
|
+
timestamp: number;
|
|
15
|
+
}
|
|
16
|
+
export interface SimulationTrigger {
|
|
17
|
+
type: 'scheduled' | 'whale' | 'odds_delta';
|
|
18
|
+
marketId: string;
|
|
19
|
+
marketQuestion: string;
|
|
20
|
+
marketOdds: number;
|
|
21
|
+
volume: number;
|
|
22
|
+
hoursToResolution: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Runs the 4-agent debate and returns a SimulationResult.
|
|
26
|
+
*/
|
|
27
|
+
export declare function runSimulation(trigger: SimulationTrigger): Promise<SimulationResult>;
|
|
28
|
+
/**
|
|
29
|
+
* Checks whether a market qualifies to run simulation.
|
|
30
|
+
* Requires volume > 250k and hoursToResolution > 24.
|
|
31
|
+
*/
|
|
32
|
+
export declare function shouldRunSimulation(volume: number, hoursToResolution: number): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Adjusts Kelly fraction based on simulation result.
|
|
35
|
+
* Returns multiplier: 1.0 (DIRECTIONAL low-spread), 0.5 (high spread), 0.0 (VOLATILITY).
|
|
36
|
+
*/
|
|
37
|
+
export declare function kellyAdjustment(result: SimulationResult): number;
|
|
38
|
+
/**
|
|
39
|
+
* Logs simulation result to the log system.
|
|
40
|
+
*/
|
|
41
|
+
export declare function logSimulationResult(result: SimulationResult, marketQuestion: string): void;
|
|
42
|
+
//# sourceMappingURL=simulationSignal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simulationSignal.d.ts","sourceRoot":"","sources":["../src/simulationSignal.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,YAAY,GAAG,MAAM,CAAC;AAErE,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,gBAAgB,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,WAAW,GAAG,OAAO,GAAG,YAAY,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAiFD;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAmCzF;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAEtF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAIhE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CAiB1F"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
// 4-agent async debate engine
|
|
2
|
+
// Triggers: scheduled (4-6h) + whale trade + odds delta (7%)
|
|
3
|
+
// Output: { signal: 'DIRECTIONAL'|'VOLATILITY'|'PASS', edge, spread, syntheticProb, agents }
|
|
4
|
+
import { execFile } from "child_process";
|
|
5
|
+
import { promisify } from "util";
|
|
6
|
+
import { log } from "./logger.js";
|
|
7
|
+
const execFileAsync = promisify(execFile);
|
|
8
|
+
const AGENTS = [
|
|
9
|
+
{
|
|
10
|
+
name: 'Bull',
|
|
11
|
+
system: `You are an institutional investor and prediction market bull. You look for institutional flow, narrative momentum, structural tailwinds, convexity. You find reasons YES is underpriced. Output: P(YES)=0.XX | Bull: [2 sentences]`,
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
name: 'Bear',
|
|
15
|
+
system: `You are a contrarian focused on retail participation decay. You track volume trends, whale vs retail mix, thin liquidity masking, post-hype base rates. You find reasons YES is overpriced. Output: P(YES)=0.XX | Bear: [2 sentences]`,
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'Regulator',
|
|
19
|
+
system: `You analyze from institutional power structure lens. What do regulatory bodies want? Who benefits from YES vs NO? You weight regulatory incentives heavily. Output: P(YES)=0.XX | Regulator: [2 sentences]`,
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: 'Contrarian',
|
|
23
|
+
system: `You are a professional contrarian. Markets overshoot on news, undershoot on slow change. You fade current consensus. Above 75%? Find the break narrative. Below 25%? Find the flip catalyst. Output: P(YES)=0.XX | Contrarian: [2 sentences]`,
|
|
24
|
+
},
|
|
25
|
+
];
|
|
26
|
+
function parseAgentResponse(agentName, text) {
|
|
27
|
+
const match = text.match(/P\(YES\)=(\d+\.?\d*)/i);
|
|
28
|
+
const prob = match ? Math.max(0, Math.min(1, parseFloat(match[1]))) : 0.5;
|
|
29
|
+
// Extract reasoning: everything after the pipe separator
|
|
30
|
+
const pipeIdx = text.indexOf('|');
|
|
31
|
+
const reasoning = pipeIdx >= 0 ? text.slice(pipeIdx + 1).trim() : text.trim();
|
|
32
|
+
return { agent: agentName, prob, reasoning };
|
|
33
|
+
}
|
|
34
|
+
async function runAgent(agent, question, marketOdds) {
|
|
35
|
+
const prompt = `${agent.system}
|
|
36
|
+
|
|
37
|
+
Prediction market question: "${question}"
|
|
38
|
+
Current market price: ${(marketOdds * 100).toFixed(1)}% YES
|
|
39
|
+
|
|
40
|
+
Provide your probability estimate and reasoning.`;
|
|
41
|
+
try {
|
|
42
|
+
const { stdout } = await execFileAsync("claude", ["--print", "--model", "claude-haiku-4-5-20251001", prompt], {
|
|
43
|
+
timeout: 15000,
|
|
44
|
+
env: {
|
|
45
|
+
...process.env,
|
|
46
|
+
CLAUDE_CODE_OAUTH_TOKEN: process.env.CLAUDE_CODE_OAUTH_TOKEN ?? '',
|
|
47
|
+
ANTHROPIC_AUTH_TOKEN: process.env.ANTHROPIC_AUTH_TOKEN ??
|
|
48
|
+
process.env.CLAUDE_CODE_OAUTH_TOKEN ??
|
|
49
|
+
'',
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
return parseAgentResponse(agent.name, stdout.trim());
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return { agent: agent.name, prob: 0.5, reasoning: 'Agent failed — using fallback probability.' };
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function computeMedian(values) {
|
|
59
|
+
if (values.length === 0)
|
|
60
|
+
return 0.5;
|
|
61
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
62
|
+
const mid = Math.floor(sorted.length / 2);
|
|
63
|
+
return sorted.length % 2 === 0
|
|
64
|
+
? (sorted[mid - 1] + sorted[mid]) / 2
|
|
65
|
+
: sorted[mid];
|
|
66
|
+
}
|
|
67
|
+
function classifySignal(edge, spread) {
|
|
68
|
+
if (spread > 0.30)
|
|
69
|
+
return 'VOLATILITY';
|
|
70
|
+
if (Math.abs(edge) > 0.10 && spread < 0.20)
|
|
71
|
+
return 'DIRECTIONAL';
|
|
72
|
+
return 'PASS';
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Runs the 4-agent debate and returns a SimulationResult.
|
|
76
|
+
*/
|
|
77
|
+
export async function runSimulation(trigger) {
|
|
78
|
+
const agents = await Promise.all(AGENTS.map((a) => runAgent(a, trigger.marketQuestion, trigger.marketOdds)));
|
|
79
|
+
const probs = agents.map((a) => a.prob);
|
|
80
|
+
const syntheticProb = computeMedian(probs);
|
|
81
|
+
const spread = Math.max(...probs) - Math.min(...probs);
|
|
82
|
+
const edge = syntheticProb - trigger.marketOdds;
|
|
83
|
+
const signal = classifySignal(edge, spread);
|
|
84
|
+
const result = {
|
|
85
|
+
signal,
|
|
86
|
+
edge,
|
|
87
|
+
spread,
|
|
88
|
+
syntheticProb,
|
|
89
|
+
marketOdds: trigger.marketOdds,
|
|
90
|
+
agents,
|
|
91
|
+
timestamp: Date.now(),
|
|
92
|
+
};
|
|
93
|
+
log("info", {
|
|
94
|
+
source: "simulationSignal",
|
|
95
|
+
event: "simulation_complete",
|
|
96
|
+
triggerType: trigger.type,
|
|
97
|
+
marketId: trigger.marketId,
|
|
98
|
+
question: trigger.marketQuestion,
|
|
99
|
+
signal,
|
|
100
|
+
edge: parseFloat((edge * 100).toFixed(2)),
|
|
101
|
+
spread: parseFloat((spread * 100).toFixed(2)),
|
|
102
|
+
syntheticProb: parseFloat(syntheticProb.toFixed(4)),
|
|
103
|
+
marketOdds: trigger.marketOdds,
|
|
104
|
+
});
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Checks whether a market qualifies to run simulation.
|
|
109
|
+
* Requires volume > 250k and hoursToResolution > 24.
|
|
110
|
+
*/
|
|
111
|
+
export function shouldRunSimulation(volume, hoursToResolution) {
|
|
112
|
+
return volume > 250_000 && hoursToResolution > 24;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Adjusts Kelly fraction based on simulation result.
|
|
116
|
+
* Returns multiplier: 1.0 (DIRECTIONAL low-spread), 0.5 (high spread), 0.0 (VOLATILITY).
|
|
117
|
+
*/
|
|
118
|
+
export function kellyAdjustment(result) {
|
|
119
|
+
if (result.signal === 'VOLATILITY')
|
|
120
|
+
return 0.0;
|
|
121
|
+
if (result.spread >= 0.20)
|
|
122
|
+
return 0.5;
|
|
123
|
+
return 1.0;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Logs simulation result to the log system.
|
|
127
|
+
*/
|
|
128
|
+
export function logSimulationResult(result, marketQuestion) {
|
|
129
|
+
log("info", {
|
|
130
|
+
source: "simulationSignal",
|
|
131
|
+
event: "simulation_result",
|
|
132
|
+
marketQuestion,
|
|
133
|
+
signal: result.signal,
|
|
134
|
+
edge: parseFloat((result.edge * 100).toFixed(2)),
|
|
135
|
+
spread: parseFloat((result.spread * 100).toFixed(2)),
|
|
136
|
+
syntheticProb: parseFloat(result.syntheticProb.toFixed(4)),
|
|
137
|
+
marketOdds: result.marketOdds,
|
|
138
|
+
agents: result.agents.map((a) => ({
|
|
139
|
+
agent: a.agent,
|
|
140
|
+
prob: parseFloat(a.prob.toFixed(4)),
|
|
141
|
+
reasoning: a.reasoning,
|
|
142
|
+
})),
|
|
143
|
+
timestamp: result.timestamp,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=simulationSignal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simulationSignal.js","sourceRoot":"","sources":["../src/simulationSignal.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gonzih/polymarket-arb",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.8",
|
|
4
4
|
"description": "Claude-powered Polymarket arbitrage bot — BTC/ETH momentum signal + AI trade analysis",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"polymarket",
|
|
@@ -31,7 +31,8 @@
|
|
|
31
31
|
"test": "vitest run",
|
|
32
32
|
"test:watch": "vitest",
|
|
33
33
|
"test:coverage": "vitest run --coverage",
|
|
34
|
-
"test:integration": "vitest run --config vitest.integration.config.ts"
|
|
34
|
+
"test:integration": "vitest run --config vitest.integration.config.ts",
|
|
35
|
+
"backtest": "tsx src/backtestRunner.ts"
|
|
35
36
|
},
|
|
36
37
|
"engines": {
|
|
37
38
|
"node": ">=18.0.0"
|