NovaMarket
← All strategies

Settlement convergence

PolymarketEventEvent marketMedium risk

near resolution, hold the clearly-leading side to settlement payout

Track record

Return
+1.6%
Sharpe
3.12
Max DD
0.0%
AUM
$0
Created
2026-07-12
Investors
0
Pools
0
Settled days
0

Market fit

EventBets on a specific outcome (e.g. BTC price by year-end)
  • When your view of the odds differs from the market's pricing
  • Liquidity thins near resolution; binary outcomes can go to zero
Not sure where the market is headed? Browse market-neutral strategies →

Backtest (deterministic simulator)

Parameters: enter_prob / window / size

Binary prediction-market simulation (YES/NO, settles YES after 180 steps) — not a promise of future returns.

"""结算收敛(Settlement convergence)—— 临近结算顺势持有高胜率一侧至兑付。

思路:临近事件结算时,市场价格已充分反映信息、向真实结果收敛。若在结算前窗口内某一侧概率已明显占优
(YES ≥ enter_prob 或 NO ≥ enter_prob),则买入该侧并持有至结算兑付:买价约 enter_prob、兑付 1,若
判断正确即赚 (1 - 买价)。窗口外保持空仓,只在收敛阶段下注以降低方向误判风险。

适用性:instrument="event"、venues=["POLYMARKET"]。
"""
from __future__ import annotations

from ..base import StrategyBase
from ..context import StrategyContext
from ..registry import register


@register("结算收敛")
class PmSettlementConvergence(StrategyBase):
    description = "临近结算窗口内,价格明显偏向某侧则买入该侧持有至兑付。"
    params = {"enter_prob": 0.65, "window": 12, "size": 20.0}
    venues = ["POLYMARKET"]
    symbols: list = []
    instrument = "event"

    def __init__(self, enter_prob: float = 0.65, window: int = 12, size: float = 20.0) -> None:
        self.enter_prob = float(enter_prob)
        self.window = int(window)
        self.size = float(size)

    async def on_tick(self, ctx: StrategyContext) -> None:
        sym = ctx.conn_symbol()
        no = ctx.complement_token(sym)
        ttr = ctx.time_to_resolution()
        if ttr is None:
            return  # 非事件 feed
        band = self.size * 0.1
        yes = await ctx.price(sym)

        if ttr > self.window:  # 收敛窗口外:空仓
            await ctx.target(sym, 0.0, band=band)
            if no is not None:
                await ctx.target(no, 0.0, band=band)
            return

        if yes >= self.enter_prob:  # YES 占优 → 持 YES 至兑付
            if no is not None:
                await ctx.target(no, 0.0, band=band)
            await ctx.target(sym, self.size, band=band)
        elif yes <= 1.0 - self.enter_prob and no is not None:  # NO 占优 → 持 NO
            await ctx.target(sym, 0.0, band=band)
            await ctx.target(no, self.size, band=band)

The full SDK and all strategies are MIT-licensed open source — backtest, paper-trade, or fork them directly.

Pools running this strategy

No pools are running this strategy yet — be the first to launch one.