@gonzih/polymarket-arb 1.0.7 → 1.0.9
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 +32 -11
- 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/simulate.d.ts.map +1 -1
- package/dist/simulate.js +25 -13
- package/dist/simulate.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
|
@@ -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.9",
|
|
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"
|