
Edge
- 19 installs
- 610 repo stars
- Updated June 26, 2026
- alsk1992/cloddsbot
Edge is a Claude Code skill that finds mispriced prediction markets by comparing their prices to external models and data sources and sizing bets with the Kelly criterion.
About
Edge is an analysis skill that compares prediction-market prices against external models, polls, and data sources to flag markets that may be mispriced. A developer runs /edge to scan for opportunities, /edge compare to check a specific market against named sources, and /edge kelly to size a bet from probability, odds, and bankroll. It surfaces fair-value estimates, edge percentages, and confidence levels.
- Compares prediction-market prices to external models, polls, and data sources to find mispricing
- Bundles a Kelly-criterion calculator for position sizing from probability and odds
- Draws on political, economic, and sports data sources (538, CME FedWatch, Vegas lines)
Edge by the numbers
- 19 all-time installs (skills.sh)
- Ranked #723 of 1,106 Finance & Trading skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
edge capabilities & compatibility
- Capabilities
- edge detection · kelly sizing · market comparison · fair value estimation
- Use cases
- data analysis · trading
What edge says it does
Compare prediction market prices to external models, polls, and data sources to find potential edge.
Scan markets where price differs >10% from models
npx skills add https://github.com/alsk1992/cloddsbot --skill edgeAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 19 |
|---|---|
| repo stars | ★ 610 |
| Last updated | June 26, 2026 |
| Repository | alsk1992/cloddsbot ↗ |
What it does
Find mispriced prediction markets by comparing their prices to external models and polls, then size bets with Kelly.
Who is it for?
Comparing prediction-market prices to poll models and computing Kelly-based position sizes.
When should I use this skill?
You want to find prediction markets whose price differs from external models and compute a bet size.
What you get
Ranked market opportunities with fair-value estimates, edge percentages, confidence, and Kelly bet sizes.
- edge opportunities list
- fair-value estimate
- kelly bet size
By the numbers
- Scans markets where price differs >10% from models
- Data sources across political, economic, and sports categories
Files
Edge Detection Skill
Compare prediction market prices to external models, polls, and data sources to find potential edge.
Commands
Scan for Edge
/edge
/edge politics
/edge fedCompare Specific Market
/edge compare "Trump 2028" 538 betting-odds
/edge compare "BTC above 100k" polymarket kalshiKelly Calculator
/edge kelly 0.6 2.0 1000
# probability, decimal odds, bankroll
/edge kelly 55 2.5
# 55% prob, 2.5 odds, $100 default bankrollData Sources
Political
- 538/Silver Bulletin - Election models
- RealClearPolitics - Polling averages
- Betting Odds - Pinnacle, offshore books
- PredictIt - Alternative market prices
Economic
- CME FedWatch - Rate probabilities
- Bloomberg Consensus - Economist forecasts
- Treasury Yields - Implied expectations
Sports
- Vegas Lines - Sharp money indicators
- ESPN FPI - Power rankings
- Historical Models - ELO ratings
Examples
User: "Find me some edge" → Scan markets where price differs >10% from models → Return top opportunities with confidence levels
User: "Is the Fed market fairly priced?" → Compare to CME FedWatch probabilities → Show discrepancy and confidence
User: "What size should I bet if I think Trump is 55% to win but market says 45%?" → Kelly criterion: (0.55 0.55 - 0.45 0.45) / 0.55 = 18% of bankroll
Output Format
🎯 EDGE DETECTED
Market: "Fed cuts rates in March 2026"
Platform: Polymarket
Current Price: 23¢
External Sources:
• CME FedWatch: 41%
• Bloomberg Consensus: 38%
• Historical base rate: 35%
Estimated Fair Value: 38¢
Edge: +15¢ (+65%)
Confidence: Medium
Kelly Suggestion:
• Conservative (half-Kelly): 8% of bankroll
• Aggressive (full-Kelly): 16% of bankroll/**
* Edge CLI Skill
*
* Commands:
* /edge scan [category] - Scan for market edges (optionally filter by category)
* /edge top - Top edge opportunities
* /edge calc <market-id> - Calculate edge for specific market
* /edge compare <market> <source1> <source2> - Compare prices between sources
* /edge kelly <probability> <odds> [bankroll] - Kelly criterion calculator
*/
async function execute(args: string): Promise<string> {
const parts = args.trim().split(/\s+/);
const cmd = parts[0]?.toLowerCase() || 'help';
try {
const { getWeatherEdgeCalculator } = await import('../../../weather/edge');
const calculator = getWeatherEdgeCalculator();
switch (cmd) {
case 'scan':
case 'top': {
const categoryArg = parts[1]?.toLowerCase();
const knownCategories = ['politics', 'fed', 'crypto', 'sports', 'weather', 'entertainment', 'science', 'economics'];
const category = knownCategories.includes(categoryArg || '') ? categoryArg : undefined;
const result = await calculator.scanForEdge();
// Filter by category keyword in market question if specified
let opportunities = result.topOpportunities;
if (category) {
opportunities = opportunities.filter(opp =>
opp.market.question.toLowerCase().includes(category) ||
(opp.market.description?.toLowerCase().includes(category) ?? false)
);
}
if (!opportunities.length) {
return category
? `No edge opportunities found for category "${category}".`
: 'No edge opportunities found right now.';
}
let output = `**Edge Scan**${category ? ` (${category})` : ''} (${result.marketsWithEdge}/${result.totalMarkets} with edge)\n\n`;
for (const opp of opportunities.slice(0, 10)) {
output += `${opp.recommendation} ${opp.market.question.slice(0, 50)}\n`;
output += ` Edge: ${opp.edgePercent.toFixed(2)}% | Market: ${(opp.marketPrice * 100).toFixed(0)}c | NOAA: ${opp.noaaProbability.toFixed(0)}%\n`;
output += ` Confidence: ${opp.confidence}\n\n`;
}
return output;
}
case 'calc': {
if (!parts[1]) return 'Usage: /edge calc <market-id>';
// calculateEdge takes a WeatherMarket object, so we show the market ID note
return `Edge calculation requires a full market object.\nUse \`/edge scan\` to see all edges, or use the API: \`calculator.calculateEdge(market)\``;
}
case 'compare': {
if (!parts[1] || !parts[2] || !parts[3]) {
return 'Usage: /edge compare <market-question> <source1> <source2>\n\nExample: /edge compare "BTC above 100k" polymarket kalshi';
}
// Gather the market text (could be quoted or multi-word before sources)
const source2 = parts[parts.length - 1];
const source1 = parts[parts.length - 2];
const marketText = parts.slice(1, parts.length - 2).join(' ').replace(/['"]/g, '');
return `**Price Comparison: ${marketText}**\n\n` +
`Source 1 (${source1}): Price data not available (no ${source1} API configured)\n` +
`Source 2 (${source2}): Price data not available (no ${source2} API configured)\n\n` +
`To enable cross-source comparison, configure API keys for each source.\n` +
`Currently only weather edge (NOAA vs Polymarket) is supported via /edge scan.`;
}
case 'kelly': {
const probability = parseFloat(parts[1] || '');
const odds = parseFloat(parts[2] || '');
const bankroll = parseFloat(parts[3] || '100');
if (isNaN(probability) || isNaN(odds) || isNaN(bankroll)) {
return 'Usage: /edge kelly <probability> <odds> [bankroll]\n\n' +
'probability: Your estimated win probability (0-1 or 0-100)\n' +
'odds: Decimal odds (e.g., 2.0 = even money)\n' +
'bankroll: Total bankroll (default: 100)\n\n' +
'Example: /edge kelly 0.6 2.0 1000';
}
// Normalize probability to 0-1 range
const p = probability > 1 ? probability / 100 : probability;
if (p <= 0 || p >= 1) return 'Probability must be between 0 and 1 (or 1-100).';
if (odds <= 1) return 'Odds must be greater than 1 (decimal odds).';
const b = odds - 1; // Net decimal odds
const q = 1 - p;
// Kelly formula: f = p - q/b = p - (1-p)/(odds-1)
const kellyFraction = p - q / b;
if (kellyFraction <= 0) {
return `**Kelly Criterion**\n\n` +
`Probability: ${(p * 100).toFixed(1)}%\n` +
`Odds: ${odds.toFixed(2)} (${b.toFixed(2)} to 1)\n` +
`Kelly fraction: ${(kellyFraction * 100).toFixed(2)}%\n\n` +
`Result: NO BET - Negative expected value.\n` +
`The probability (${(p * 100).toFixed(1)}%) is too low for these odds.`;
}
const fullKellyAmount = kellyFraction * bankroll;
const halfKellyAmount = (kellyFraction / 2) * bankroll;
const quarterKellyAmount = (kellyFraction / 4) * bankroll;
return `**Kelly Criterion**\n\n` +
`Probability: ${(p * 100).toFixed(1)}%\n` +
`Odds: ${odds.toFixed(2)} (${b.toFixed(2)} to 1)\n` +
`Bankroll: $${bankroll.toFixed(2)}\n\n` +
`Full Kelly: ${(kellyFraction * 100).toFixed(2)}% = $${fullKellyAmount.toFixed(2)}\n` +
`Half Kelly: ${(kellyFraction * 50).toFixed(2)}% = $${halfKellyAmount.toFixed(2)}\n` +
`Quarter Kelly: ${(kellyFraction * 25).toFixed(2)}% = $${quarterKellyAmount.toFixed(2)}\n\n` +
`Expected value per dollar: $${(p * b - q).toFixed(4)}`;
}
default:
return helpText();
}
} catch (error) {
return `Edge error: ${error instanceof Error ? error.message : String(error)}`;
}
}
function helpText(): string {
return `**Edge Commands**
/edge scan [category] - Scan for market edges
/edge top - Top edge opportunities
/edge calc <market-id> - Calculate edge for specific market
/edge compare <market> <s1> <s2> - Compare prices between sources
/edge kelly <prob> <odds> [bank] - Kelly criterion calculator`;
}
export default {
name: 'edge',
description: 'Edge calculation for weather and prediction markets using NOAA data',
commands: ['/edge'],
handle: execute,
};