Skip to main content

mts1b-sports, mts1b-prediction-markets — public API surface

Treasury-allocated sleeves for non-traditional markets.

mts1b-sports

DFS optimizer

from mts1b_sports.dfs import optimize_lineup
from datetime import date

lineup = await optimize_lineup(
sport="nba",
site="draftkings",
slate_date=date(2026, 5, 25),
salary_cap=50_000,
projections=projections_df,
correlations=correlation_matrix,
n_lineups=20,
exposure_caps={"LeBron": 0.30, ...},
)
# list[Lineup]

Sportsbook arbitrage

from mts1b_sports.arb import find_arbs

arbs = await find_arbs(
sport="nfl",
books=["fanduel", "draftkings", "betmgm", "caesars", "pointsbet"],
min_edge_pct=2.0,
)
# [Arb(event=..., market=..., legs=[(book, side, odds)], net_edge_pct=..., stake_per_$100=...)]

Quirk: FanDuel inPlay=True games must NOT cross ESPN non-pre-state. Adapter handles.

Bradley-Terry ratings

from mts1b_sports.ratings import bradley_terry, elo

ratings = bradley_terry(
games=historical_games_df, # winner, loser, weight columns
prior_strength=10.0,
iterations=100,
)
# pd.Series indexed by team

elo_ratings = elo(games=..., k=32, initial=1500)

Free odds aggregator (The Odds API key is dead)

from mts1b_sports.odds import FreeOddsAggregator

async with FreeOddsAggregator() as agg:
odds = await agg.get_odds("nfl", market="moneyline")
# Reads FanDuel public + ESPN pickcenter

Per-league models

from mts1b_sports.markets import nba, nfl, mlb, nhl, soccer, esports

# NBA-specific: tempo + ORtg/DRtg
nba_model = await nba.build_model(season="2025-26")
prediction = nba_model.predict_game("LAL", "BOS", date=...)

# NFL-specific: EPA-based
nfl_model = await nfl.build_model(season=2025)

Treasury integration

mts mts1b-treasury fund create --fund-id sports-dfs --nav 10000 --broker paper

Sports funds use the same treasury infrastructure as trading funds. P/L flows into firm-level NAV.

mts1b-prediction-markets

Venue adapters

from mts1b_prediction_markets.kalshi import Kalshi
from mts1b_prediction_markets.polymarket import Polymarket
from mts1b_prediction_markets.manifold import Manifold
from mts1b_prediction_markets.limitless import Limitless
from mts1b_prediction_markets.predictfun import PredictFun

Kalshi (CFTC-regulated)

async with Kalshi(api_key="...") as k:
market = await k.market_by_ticker("PRESDEM-24")
# Market(ticker, title, yes_bid_dollars, yes_ask_dollars, ...)

politics = await k.markets(category="politics", status="open")

order = await k.place_order(
ticker="PRESDEM-24",
side="yes",
quantity=100,
limit_price_dollars=Decimal("0.42"),
type="limit",
time_in_force="day",
)

Quirk: yes_bid_dollars schema migrated to decimal; adapter parses both old + new defensively.

Polymarket (UMA Oracle)

async with Polymarket(
private_key_hex=vault.read("secret/mts1b/prediction_markets/polymarket/wallet"),
chain="polygon",
) as pm:
market = await pm.market_by_slug("trump-elected-2024")

Quirk: /event/ URLs 404; adapter uses polymarket.com/markets?_q= instead.

⚠️ Geo-blocked in many U.S. jurisdictions. Operator's compliance responsibility.

Manifold

async with Manifold(api_key="...") as m:
markets = await m.search("Trump elected 2024")
bet = await m.place_bet(market_id="...", outcome="YES", amount=100) # mana

Limitless / PredictFun

Same wallet-signature pattern as Polymarket. Smaller TVL, niche markets.

Cross-venue consensus

from mts1b_prediction_markets.unified import consensus, find_arbs, search

# Median YES probability across venues
c = await consensus(query="Trump elected 2024",
venues=["kalshi", "polymarket", "manifold"])
# Consensus(median=0.58, dispersion_iqr=0.05, matches=[(venue, p), ...])

# Cross-venue arbitrage
arbs = await find_arbs(query="Trump elected 2024", min_edge_pct=2.0)

# Search markets
results = await search(query="election", venues=["kalshi", "polymarket"])

Wallet management

Wallet private keys live in Vault, never hard-coded:

secret/mts1b/prediction_markets/polymarket/wallet_private_key
secret/mts1b/prediction_markets/limitless/wallet_private_key
secret/mts1b/prediction_markets/predictfun/wallet_private_key

NATS subjects (both repos)

SubjectDirection
mts.v1.sports.dfs.lineups.generatedpublish
mts.v1.sports.arb.foundpublish
mts.v1.predictionmarkets.markets.updatedpublish
mts.v1.predictionmarkets.arb.foundpublish

See also