@gonzih/polymarket-arb 1.0.6 → 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.
@@ -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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"}
@@ -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.6",
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"