@gonzih/polymarket-arb 1.0.6 → 1.0.7
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/claude.d.ts +7 -2
- package/dist/claude.d.ts.map +1 -1
- package/dist/claude.js +15 -2
- package/dist/claude.js.map +1 -1
- package/dist/daemon.d.ts +1 -0
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +44 -3
- package/dist/daemon.js.map +1 -1
- package/dist/polymarket.d.ts +15 -0
- package/dist/polymarket.d.ts.map +1 -1
- package/dist/polymarket.js +46 -0
- package/dist/polymarket.js.map +1 -1
- package/dist/simulate.d.ts +19 -0
- package/dist/simulate.d.ts.map +1 -0
- package/dist/simulate.js +99 -0
- package/dist/simulate.js.map +1 -0
- package/package.json +1 -1
package/dist/claude.d.ts
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
import type { MomentumSignal } from "./signal.js";
|
|
2
|
-
import type { Contract } from "./polymarket.js";
|
|
2
|
+
import type { Contract, WhaleFadeSignal } from "./polymarket.js";
|
|
3
3
|
export type TradeAnalysis = {
|
|
4
4
|
confidence: number;
|
|
5
5
|
kelly_fraction: number;
|
|
6
6
|
reasoning: string;
|
|
7
7
|
enter: boolean;
|
|
8
8
|
};
|
|
9
|
-
export
|
|
9
|
+
export type ExtraContext = {
|
|
10
|
+
whaleFade?: WhaleFadeSignal | null;
|
|
11
|
+
simulationGap?: number | null;
|
|
12
|
+
highConfidenceEdge?: boolean;
|
|
13
|
+
};
|
|
14
|
+
export declare function analyzeTradeOpportunity(signal: MomentumSignal, contract: Contract, extra?: ExtraContext): Promise<TradeAnalysis | null>;
|
|
10
15
|
//# 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,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;AAKjE,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;CAC9B,CAAC;AAEF,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,QAAQ,EAClB,KAAK,CAAC,EAAE,YAAY,GACnB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAsE/B"}
|
package/dist/claude.js
CHANGED
|
@@ -2,13 +2,26 @@ import { execFile } from "child_process";
|
|
|
2
2
|
import { promisify } from "util";
|
|
3
3
|
import { log } from "./logger.js";
|
|
4
4
|
const execFileAsync = promisify(execFile);
|
|
5
|
-
export async function analyzeTradeOpportunity(signal, contract) {
|
|
5
|
+
export async function analyzeTradeOpportunity(signal, contract, extra) {
|
|
6
6
|
const momentumPct = (signal.momentum * 100).toFixed(3);
|
|
7
7
|
const direction = signal.direction === "down" ? "dropped" : "rose";
|
|
8
8
|
const contractOdds = contract.yesPrice;
|
|
9
9
|
const minutesToExpiry = Math.round((contract.expiresAt - Date.now()) / 60_000);
|
|
10
10
|
const impliedProb = signal.direction === contract.direction ? 0.75 : 0.35;
|
|
11
11
|
const impliedEdge = Math.abs(impliedProb - contractOdds);
|
|
12
|
+
let extraContext = "";
|
|
13
|
+
if (extra) {
|
|
14
|
+
if (extra.whaleFade) {
|
|
15
|
+
extraContext += `\nWhale fade signal: $${extra.whaleFade.size.toLocaleString()} trade detected ${extra.whaleFade.minutesAgo} min ago — fade direction is ${extra.whaleFade.direction}.`;
|
|
16
|
+
}
|
|
17
|
+
if (extra.simulationGap !== null && extra.simulationGap !== undefined) {
|
|
18
|
+
const sign = extra.simulationGap > 0 ? "+" : "";
|
|
19
|
+
extraContext += `\nMulti-agent simulation consensus gap: ${sign}${extra.simulationGap.toFixed(1)} percentage points vs current market odds.`;
|
|
20
|
+
}
|
|
21
|
+
if (extra.highConfidenceEdge !== undefined) {
|
|
22
|
+
extraContext += `\nHigh-confidence edge: ${extra.highConfidenceEdge ? "YES — whale fade and simulation both agree on direction" : "NO"}.`;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
12
25
|
const prompt = `You are a prediction market arbitrage assistant. Analyze this trade opportunity and respond in JSON only.
|
|
13
26
|
|
|
14
27
|
Signal: ${signal.symbol} ${direction} ${momentumPct}% in 30 seconds on crypto exchange
|
|
@@ -16,7 +29,7 @@ Polymarket contract: "${contract.question}" currently priced at ${(contractOdds
|
|
|
16
29
|
Implied edge: ${(impliedEdge * 100).toFixed(1)} percentage points (estimated real probability ~${(impliedProb * 100).toFixed(0)}%)
|
|
17
30
|
Minutes to expiry: ${minutesToExpiry}
|
|
18
31
|
Recent price ticks: [${signal.recentTicks.join(", ")}]
|
|
19
|
-
Current price: ${signal.currentPrice}
|
|
32
|
+
Current price: ${signal.currentPrice}${extraContext}
|
|
20
33
|
|
|
21
34
|
Assess: Does the momentum signal justify a bet on this contract? Consider momentum strength, edge size, time to expiry, and signal-contract alignment.
|
|
22
35
|
|
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;AAGjC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon.d.ts
CHANGED
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":"AAiBA,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;gBAE/E,SAAS,UAAO;IAK5B,KAAK,IAAI,IAAI;IAoIb,IAAI,IAAI,IAAI;IAMZ,OAAO,CAAC,gBAAgB;CAWzB"}
|
package/dist/daemon.js
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import { FeedManager } from "./feeds.js";
|
|
2
2
|
import { SignalEngine } from "./signal.js";
|
|
3
|
-
import { fetchContracts, placeOrder } from "./polymarket.js";
|
|
3
|
+
import { fetchContracts, fetchRecentTrades, detectWhaleFade, placeOrder } from "./polymarket.js";
|
|
4
4
|
import { analyzeTradeOpportunity } from "./claude.js";
|
|
5
|
+
import { simulateMarket, computeHighConfidenceEdge } from "./simulate.js";
|
|
5
6
|
import { RiskManager } from "./kelly.js";
|
|
6
7
|
import { log } from "./logger.js";
|
|
7
8
|
const CLAUDE_CONFIDENCE_THRESHOLD = 0.65;
|
|
8
9
|
const INITIAL_BALANCE = 1000; // paper trading starts with $1000
|
|
9
10
|
const SIGNAL_COOLDOWN_MS = 60_000; // don't re-fire same symbol within 1 min
|
|
11
|
+
const SIM_MIN_VOLUME = 50_000; // 24h volume threshold for simulation
|
|
12
|
+
const SIM_MIN_ODDS = 0.15; // skip simulation near certainty
|
|
13
|
+
const SIM_MAX_ODDS = 0.85;
|
|
14
|
+
const SIM_CACHE_TTL_MS = 2 * 60 * 60 * 1000; // re-run sim at most every 2h per market
|
|
10
15
|
export class TradingDaemon {
|
|
11
16
|
feeds = new FeedManager();
|
|
12
17
|
signals = new SignalEngine();
|
|
@@ -14,6 +19,7 @@ export class TradingDaemon {
|
|
|
14
19
|
paperMode;
|
|
15
20
|
lastSignal = new Map();
|
|
16
21
|
dayResetTimer = null;
|
|
22
|
+
simCache = new Map();
|
|
17
23
|
constructor(paperMode = true) {
|
|
18
24
|
this.paperMode = paperMode;
|
|
19
25
|
log("info", { event: "daemon_start", paperMode, balance: INITIAL_BALANCE });
|
|
@@ -51,8 +57,43 @@ export class TradingDaemon {
|
|
|
51
57
|
}
|
|
52
58
|
// Process best contract (closest expiry)
|
|
53
59
|
const contract = matching.sort((a, b) => a.expiresAt - b.expiresAt)[0];
|
|
54
|
-
//
|
|
55
|
-
const
|
|
60
|
+
// Whale fade detection
|
|
61
|
+
const recentTrades = await fetchRecentTrades(contract.id, { limit: 20 });
|
|
62
|
+
const whaleFade = detectWhaleFade(recentTrades);
|
|
63
|
+
// Mini multi-agent simulation (trigger when odds are uncertain and not recently run)
|
|
64
|
+
const odds = contract.yesPrice;
|
|
65
|
+
const cached = this.simCache.get(contract.id);
|
|
66
|
+
const simStale = !cached || Date.now() - cached.lastRunAt > SIM_CACHE_TTL_MS;
|
|
67
|
+
const oddsInRange = odds >= SIM_MIN_ODDS && odds <= SIM_MAX_ODDS;
|
|
68
|
+
let simResult = null;
|
|
69
|
+
if (oddsInRange && simStale) {
|
|
70
|
+
simResult = await simulateMarket(contract.question, odds).catch(() => null);
|
|
71
|
+
if (simResult) {
|
|
72
|
+
this.simCache.set(contract.id, { lastRunAt: Date.now(), result: simResult });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else if (cached) {
|
|
76
|
+
simResult = cached.result;
|
|
77
|
+
}
|
|
78
|
+
const simulationGap = simResult
|
|
79
|
+
? parseFloat(((simResult.consensus - odds) * 100).toFixed(1))
|
|
80
|
+
: null;
|
|
81
|
+
const highConfidenceEdge = computeHighConfidenceEdge(whaleFade, simResult ? simResult.consensus : null, odds);
|
|
82
|
+
if (highConfidenceEdge) {
|
|
83
|
+
log("info", {
|
|
84
|
+
event: "high_confidence_edge",
|
|
85
|
+
symbol: signal.symbol,
|
|
86
|
+
contract: contract.question,
|
|
87
|
+
whaleFadeDirection: whaleFade?.direction,
|
|
88
|
+
simulationGapPp: simulationGap,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
// Ask Claude for analysis (with extra context)
|
|
92
|
+
const analysis = await analyzeTradeOpportunity(signal, contract, {
|
|
93
|
+
whaleFade,
|
|
94
|
+
simulationGap,
|
|
95
|
+
highConfidenceEdge,
|
|
96
|
+
});
|
|
56
97
|
if (!analysis)
|
|
57
98
|
return;
|
|
58
99
|
if (!analysis.enter || analysis.confidence < CLAUDE_CONFIDENCE_THRESHOLD) {
|
package/dist/daemon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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"}
|
package/dist/polymarket.d.ts
CHANGED
|
@@ -11,6 +11,21 @@ export type OrderResult = {
|
|
|
11
11
|
orderId: string;
|
|
12
12
|
status: string;
|
|
13
13
|
};
|
|
14
|
+
export type TradeEvent = {
|
|
15
|
+
size: number;
|
|
16
|
+
side: 'buy' | 'sell';
|
|
17
|
+
price: number;
|
|
18
|
+
timestamp: number;
|
|
19
|
+
};
|
|
20
|
+
export type WhaleFadeSignal = {
|
|
21
|
+
direction: 'buy' | 'sell';
|
|
22
|
+
size: number;
|
|
23
|
+
minutesAgo: number;
|
|
24
|
+
};
|
|
25
|
+
export declare function fetchRecentTrades(marketId: string, opts?: {
|
|
26
|
+
limit: number;
|
|
27
|
+
}): Promise<TradeEvent[]>;
|
|
28
|
+
export declare function detectWhaleFade(trades: TradeEvent[]): WhaleFadeSignal | null;
|
|
14
29
|
export declare function fetchContracts(symbol: "BTC" | "ETH"): Promise<Contract[]>;
|
|
15
30
|
export declare function placeOrder(contract: Contract, side: "YES" | "NO", size: number, price: number, paperMode: boolean): Promise<OrderResult | null>;
|
|
16
31
|
//# sourceMappingURL=polymarket.d.ts.map
|
package/dist/polymarket.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"polymarket.d.ts","sourceRoot":"","sources":["../src/polymarket.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,KAAK,GAAG,KAAK,CAAC;IACtB,SAAS,EAAE,IAAI,GAAG,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;
|
|
1
|
+
{"version":3,"file":"polymarket.d.ts","sourceRoot":"","sources":["../src/polymarket.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,KAAK,GAAG,KAAK,CAAC;IACtB,SAAS,EAAE,IAAI,GAAG,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AASF,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAkB,GACtC,OAAO,CAAC,UAAU,EAAE,CAAC,CAoBvB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,eAAe,GAAG,IAAI,CAwB5E;AAwBD,wBAAsB,cAAc,CAAC,MAAM,EAAE,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAgD/E;AAED,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,KAAK,GAAG,IAAI,EAClB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,OAAO,GACjB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAmD7B"}
|
package/dist/polymarket.js
CHANGED
|
@@ -1,6 +1,52 @@
|
|
|
1
1
|
import { log } from "./logger.js";
|
|
2
2
|
const GAMMA_API = "https://gamma-api.polymarket.com";
|
|
3
3
|
const CLOB_API = "https://clob.polymarket.com";
|
|
4
|
+
export async function fetchRecentTrades(marketId, opts = { limit: 20 }) {
|
|
5
|
+
try {
|
|
6
|
+
const url = `${CLOB_API}/trades?market=${encodeURIComponent(marketId)}&limit=${opts.limit}`;
|
|
7
|
+
const res = await fetch(url);
|
|
8
|
+
if (!res.ok)
|
|
9
|
+
return [];
|
|
10
|
+
const raw = (await res.json());
|
|
11
|
+
const trades = Array.isArray(raw) ? raw : (raw.data ?? []);
|
|
12
|
+
return trades.map((t) => {
|
|
13
|
+
const ts = Number(t.timestamp);
|
|
14
|
+
return {
|
|
15
|
+
size: Number(t.size),
|
|
16
|
+
side: String(t.side).toUpperCase() === "BUY" ? "buy" : "sell",
|
|
17
|
+
price: Number(t.price),
|
|
18
|
+
// CLOB timestamps are Unix seconds; convert to ms if needed
|
|
19
|
+
timestamp: ts < 1e12 ? ts * 1000 : ts,
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function detectWhaleFade(trades) {
|
|
28
|
+
const whaleTrades = trades.filter((t) => t.size > 10_000);
|
|
29
|
+
if (whaleTrades.length === 0)
|
|
30
|
+
return null;
|
|
31
|
+
const lastWhale = whaleTrades[0];
|
|
32
|
+
const timeSince = Date.now() - lastWhale.timestamp;
|
|
33
|
+
if (timeSince >= 30 * 60 * 1000)
|
|
34
|
+
return null;
|
|
35
|
+
const signal = {
|
|
36
|
+
direction: lastWhale.side === "buy" ? "sell" : "buy",
|
|
37
|
+
size: lastWhale.size,
|
|
38
|
+
minutesAgo: Math.round(timeSince / 60_000),
|
|
39
|
+
};
|
|
40
|
+
log("info", {
|
|
41
|
+
source: "polymarket",
|
|
42
|
+
event: "whale_fade_signal",
|
|
43
|
+
whaleSize: lastWhale.size,
|
|
44
|
+
whaleSide: lastWhale.side,
|
|
45
|
+
fadeDirection: signal.direction,
|
|
46
|
+
minutesAgo: signal.minutesAgo,
|
|
47
|
+
});
|
|
48
|
+
return signal;
|
|
49
|
+
}
|
|
4
50
|
function parseJsonField(field) {
|
|
5
51
|
if (Array.isArray(field))
|
|
6
52
|
return field;
|
package/dist/polymarket.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"polymarket.js","sourceRoot":"","sources":["../src/polymarket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,MAAM,SAAS,GAAG,kCAAkC,CAAC;AACrD,MAAM,QAAQ,GAAG,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"polymarket.js","sourceRoot":"","sources":["../src/polymarket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,MAAM,SAAS,GAAG,kCAAkC,CAAC;AACrD,MAAM,QAAQ,GAAG,6BAA6B,CAAC;AAqC/C,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,OAA0B,EAAE,KAAK,EAAE,EAAE,EAAE;IAEvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,GAAG,QAAQ,kBAAkB,kBAAkB,CAAC,QAAQ,CAAC,UAAU,IAAI,CAAC,KAAK,EAAE,CAAC;QAC5F,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAsC,CAAC;QACpE,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC3D,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACtB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAC/B,OAAO;gBACL,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;gBACpB,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;gBAC7D,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;gBACtB,4DAA4D;gBAC5D,SAAS,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE;aACtC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAoB;IAClD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC;IAC1D,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE1C,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,SAAS,CAAC;IACnD,IAAI,SAAS,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;QAAE,OAAO,IAAI,CAAC;IAE7C,MAAM,MAAM,GAAoB;QAC9B,SAAS,EAAE,SAAS,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;QACpD,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC;KAC3C,CAAC;IAEF,GAAG,CAAC,MAAM,EAAE;QACV,MAAM,EAAE,YAAY;QACpB,KAAK,EAAE,mBAAmB;QAC1B,SAAS,EAAE,SAAS,CAAC,IAAI;QACzB,SAAS,EAAE,SAAS,CAAC,IAAI;QACzB,aAAa,EAAE,MAAM,CAAC,SAAS;QAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAYD,SAAS,cAAc,CAAC,KAAwB;IAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AACxD,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACtC,MAAM,CAAC,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACjC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACrF,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC1G,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAqB;IACxD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,kBAAkB;IAE1D,MAAM,cAAc,GAAoC;QACtD,GAAG,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC;QAClC,GAAG,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,CAAC;KACrC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,GAAG,SAAS,6CAA6C,CAAC;QACtE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAE7B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YAC/E,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAiB,CAAC;QACnD,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,SAAS,GAAe,EAAE,CAAC;QAEjC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAAE,SAAS;YAE7D,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;YAChD,IAAI,SAAS,GAAG,SAAS,IAAI,SAAS,GAAG,GAAG;gBAAE,SAAS;YAEvD,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC7C,IAAI,CAAC,SAAS;gBAAE,SAAS;YAEzB,MAAM,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC3D,SAAS,CAAC,IAAI,CAAC;gBACb,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,SAAS;gBACT,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG;gBAC1B,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG;gBACzB,MAAM;gBACN,SAAS;aACV,CAAC,CAAC;QACL,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChF,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAAkB,EAClB,IAAkB,EAClB,IAAY,EACZ,KAAa,EACb,SAAkB;IAElB,MAAM,KAAK,GAAG;QACZ,QAAQ,EAAE,QAAQ,CAAC,EAAE;QACrB,IAAI;QACJ,IAAI;QACJ,KAAK;QACL,SAAS,EAAE,OAAO;KACnB,CAAC;IAEF,IAAI,SAAS,EAAE,CAAC;QACd,GAAG,CAAC,OAAO,EAAE;YACX,KAAK,EAAE,aAAa;YACpB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,IAAI;YACJ,IAAI;YACJ,KAAK;YACL,SAAS,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;SACtD,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC7D,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC7C,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,oEAAoE,EAAE,CAAC,CAAC;QACxH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,QAAQ,EAAE;YAC3C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,MAAM,EAAE;gBACjC,UAAU,EAAE,MAAM;aACnB;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SAC5B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,GAAG,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YACjF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAgB,CAAC;QACjD,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;QAC3E,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { WhaleFadeSignal } from "./polymarket.js";
|
|
2
|
+
export type PersonaResult = {
|
|
3
|
+
name: string;
|
|
4
|
+
estimate: number;
|
|
5
|
+
reasoning: string;
|
|
6
|
+
};
|
|
7
|
+
export type SimulationResult = {
|
|
8
|
+
consensus: number;
|
|
9
|
+
spread: number;
|
|
10
|
+
personas: PersonaResult[];
|
|
11
|
+
};
|
|
12
|
+
export declare function median(values: number[]): number;
|
|
13
|
+
export declare function simulateMarket(question: string, currentOdds: number): Promise<SimulationResult>;
|
|
14
|
+
/**
|
|
15
|
+
* Returns true when both whale fade signal and simulation edge agree on the
|
|
16
|
+
* same direction (high-conviction combined signal).
|
|
17
|
+
*/
|
|
18
|
+
export declare function computeHighConfidenceEdge(whaleFade: WhaleFadeSignal | null, simulationConsensus: number | null, currentOdds: number): boolean;
|
|
19
|
+
//# sourceMappingURL=simulate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simulate.d.ts","sourceRoot":"","sources":["../src/simulate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAYvD,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B,CAAC;AA8CF,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAO/C;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,CAAC,CAqC3B;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,eAAe,GAAG,IAAI,EACjC,mBAAmB,EAAE,MAAM,GAAG,IAAI,EAClC,WAAW,EAAE,MAAM,GAClB,OAAO,CAQT"}
|
package/dist/simulate.js
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { execFile } from "child_process";
|
|
2
|
+
import { promisify } from "util";
|
|
3
|
+
import { log } from "./logger.js";
|
|
4
|
+
const execFileAsync = promisify(execFile);
|
|
5
|
+
const PERSONAS = [
|
|
6
|
+
{ name: "skeptic", prior: "You are deeply skeptical. Challenge assumptions, look for what could go wrong." },
|
|
7
|
+
{ name: "optimist", prior: "You are optimistic about outcomes. Look for reasons things will succeed." },
|
|
8
|
+
{ name: "regulator", prior: "You think like a financial regulator. Focus on compliance, risk, systemic issues." },
|
|
9
|
+
{ name: "trader", prior: "You are a quantitative trader. Focus on base rates, historical precedent, market signals." },
|
|
10
|
+
{ name: "journalist", prior: "You are an investigative journalist. Look for narrative, public perception, media dynamics." },
|
|
11
|
+
];
|
|
12
|
+
async function runPersona(persona, question, currentOdds) {
|
|
13
|
+
const prompt = `${persona.prior}
|
|
14
|
+
|
|
15
|
+
Prediction market question: "${question}"
|
|
16
|
+
Current market price: ${(currentOdds * 100).toFixed(1)}% YES
|
|
17
|
+
|
|
18
|
+
What is your probability estimate (0-100) for YES? Keep it brief.
|
|
19
|
+
Respond with JSON only, no markdown:
|
|
20
|
+
{"probability": <0-100>, "reasoning": "<one sentence>"}`;
|
|
21
|
+
try {
|
|
22
|
+
const { stdout } = await execFileAsync("claude", ["--print", "--model", "claude-haiku-4-5-20251001", prompt], {
|
|
23
|
+
timeout: 15000,
|
|
24
|
+
env: {
|
|
25
|
+
...process.env,
|
|
26
|
+
CLAUDE_CODE_OAUTH_TOKEN: process.env.CLAUDE_CODE_OAUTH_TOKEN ?? "",
|
|
27
|
+
ANTHROPIC_AUTH_TOKEN: process.env.ANTHROPIC_AUTH_TOKEN ??
|
|
28
|
+
process.env.CLAUDE_CODE_OAUTH_TOKEN ??
|
|
29
|
+
"",
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
const jsonMatch = stdout.match(/\{[\s\S]*?\}/);
|
|
33
|
+
if (!jsonMatch)
|
|
34
|
+
return null;
|
|
35
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
36
|
+
return {
|
|
37
|
+
name: persona.name,
|
|
38
|
+
estimate: Math.max(0, Math.min(100, Number(parsed.probability))) / 100,
|
|
39
|
+
reasoning: String(parsed.reasoning),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export function median(values) {
|
|
47
|
+
if (values.length === 0)
|
|
48
|
+
return 0.5;
|
|
49
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
50
|
+
const mid = Math.floor(sorted.length / 2);
|
|
51
|
+
return sorted.length % 2 === 0
|
|
52
|
+
? (sorted[mid - 1] + sorted[mid]) / 2
|
|
53
|
+
: sorted[mid];
|
|
54
|
+
}
|
|
55
|
+
export async function simulateMarket(question, currentOdds) {
|
|
56
|
+
const results = await Promise.all(PERSONAS.map((p) => runPersona(p, question, currentOdds)));
|
|
57
|
+
const personas = results.filter((r) => r !== null);
|
|
58
|
+
const estimates = personas.map((p) => p.estimate);
|
|
59
|
+
const consensus = median(estimates);
|
|
60
|
+
const spread = estimates.length > 1
|
|
61
|
+
? Math.max(...estimates) - Math.min(...estimates)
|
|
62
|
+
: 0;
|
|
63
|
+
log("info", {
|
|
64
|
+
source: "simulate",
|
|
65
|
+
event: "simulation_complete",
|
|
66
|
+
question,
|
|
67
|
+
currentOdds,
|
|
68
|
+
consensus,
|
|
69
|
+
spread,
|
|
70
|
+
personaCount: personas.length,
|
|
71
|
+
});
|
|
72
|
+
const gapPp = Math.abs((consensus - currentOdds) * 100);
|
|
73
|
+
if (gapPp > 8) {
|
|
74
|
+
log("info", {
|
|
75
|
+
source: "simulate",
|
|
76
|
+
event: "simulation_edge",
|
|
77
|
+
question,
|
|
78
|
+
currentOdds,
|
|
79
|
+
consensus,
|
|
80
|
+
gapPercentagePoints: parseFloat(gapPp.toFixed(1)),
|
|
81
|
+
direction: consensus > currentOdds ? "buy" : "sell",
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
return { consensus, spread, personas };
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Returns true when both whale fade signal and simulation edge agree on the
|
|
88
|
+
* same direction (high-conviction combined signal).
|
|
89
|
+
*/
|
|
90
|
+
export function computeHighConfidenceEdge(whaleFade, simulationConsensus, currentOdds) {
|
|
91
|
+
if (!whaleFade || simulationConsensus === null)
|
|
92
|
+
return false;
|
|
93
|
+
const gapPp = Math.abs((simulationConsensus - currentOdds) * 100);
|
|
94
|
+
if (gapPp <= 8)
|
|
95
|
+
return false;
|
|
96
|
+
const simDirection = simulationConsensus > currentOdds ? "buy" : "sell";
|
|
97
|
+
return whaleFade.direction === simDirection;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=simulate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simulate.js","sourceRoot":"","sources":["../src/simulate.ts"],"names":[],"mappings":"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"}
|