Skip to content
Docs

Norynta public docs

Norynta OSS Trading Framework Adapters

Ready-to-run adapters for 18 popular OSS trading, research, backtest, and analytics frameworks with explicit execution safety.

OSS Trading Framework Adapters

What Norynta supports

Norynta ships a Python adapter kit for widely used open-source trading and research frameworks. The kit lives in packages/python-sdk, has no mandatory framework dependency, and keeps prediction-market identity explicit as:

<eventPubkey>:<outcomeIndex>/USDC

Prices exposed to general trading frameworks use USDC units (0.49), while Norynta API requests continue to use integer cents (49) where the API contract requires them. Exchange sequences remain decimal strings and are never coerced to JavaScript or floating-point numbers.

Why these projects

The following projects are both widely used and relevant to Norynta's market-data, research, market-making, or execution surface. Popularity figures are a July 2026 snapshot from each official GitHub repository; stars are only a rough adoption signal, not a quality ranking.

ProjectApprox. GitHub starsPrimary useNorynta integration
Freqtrade51.5kcrypto strategies, optimization, bot operationsOHLCV research/backtest bridge
Qlib46.6kAI-oriented quantitative researchinstrument/datetime feature-frame bridge
vn.py43.8kevent-driven quantitative tradingBarData-compatible research/backtest bridge
CCXT43.4kunified exchange APIexchange-style market data, paper orders, caller-signed live orders
NautilusTrader24.9kevent-driven research and executionquote-tick research/replay bridge
Backtrader22.5kPython backtestingPandasData-compatible feed
LEAN20.7kmulti-asset algorithm enginecustom-data CSV bridge
Hummingbot19.2kCLOB market makingorder-book snapshot bridge
FinRL / FinRL-X15.8kreinforcement-learning research and production pipelinesdate/ticker OHLCV frame bridge
Backtesting.py8.7kconcise Python strategy backtestsnative Open/High/Low/Close/Volume frame
vectorbt8.4kvectorized research and parameter sweepspandas price/volume bridge
Jesse8.2kcrypto strategy research and botsnative candle-shape research/backtest bridge
OpenBBactiveinvestment research platformhistorical-price model bridge
Lumibotactiveevent-driven backtesting and botspandas historical-data bridge
QuantStatsactiveportfolio analytics and reportsUTC decimal-return series
TensorTradeactivereinforcement-learning trading environmentsdeterministic data-feed features
Zipline Reloadedactiveevent-driven backtestingcustom bundle-ingest rows
OctoBotactivecrypto automation and backtestinghistorical candle bridge

These projects do not share one execution model. Hummingbot connectors, Freqtrade exchanges, NautilusTrader adapters, and LEAN brokerages each have substantial framework-owned lifecycle contracts. Norynta therefore advertises the exact supported mode for every bridge instead of claiming that a data export is a native live brokerage.

Ready-to-run repository

The cloneable starter for all eighteen integrations is at examples/oss-trading-adapters. It includes executable CCXT-style and Hummingbot examples, historical export commands for every research bridge, native Backtrader/Backtesting.py/vectorbt and vn.py samples, Qlib/FinRL frame examples, Freqtrade, LEAN, and Jesse starter classes, sequence-aware order-book streaming, and Docker/Compose setup.

The same starter URL and exact supported modes are machine-readable under compatibility.ossAdapters on /api/bot/config, /api/agent/access, and /api/agent/card. This lets an agent discover the integration without scraping this page.

Install from this repository

git clone https://github.com/norynta/norynta.git
cd norynta
python3 -m venv .venv-norynta
. .venv-norynta/bin/activate
python -m pip install -e packages/python-sdk
norynta-adapters list

Optional research integrations:

python -m pip install -e 'packages/python-sdk[research]'
python -m pip install -e 'packages/python-sdk[backtrader]'
python -m pip install -e 'packages/python-sdk[backtesting]'
python -m pip install -e 'packages/python-sdk[vectorbt]'

Configure a local or hosted Norynta API:

export NORYNTA_BASE_URL=http://localhost:3000
export NORYNTA_AGENT_API_KEY=pmak_your_scoped_key
norynta-adapters doctor

Do not put wallet private keys in these variables. The Python SDK and adapter kit never load or store wallet keys.

doctor exits nonzero when the installed SDK advertises an adapter missing from the server discovery contract. This catches partial upgrades in CI before a bot starts.

One-command exports

Use an event public key and outcome index:

norynta-adapters export ccxt EVENT_PUBKEY --outcome-index 0 --output norynta-ccxt.json
norynta-adapters export hummingbot EVENT_PUBKEY --outcome-index 0 --output hummingbot-book.json
norynta-adapters export freqtrade EVENT_PUBKEY --outcome-index 0 --timeframe 5m --output freqtrade.csv
norynta-adapters export nautilustrader EVENT_PUBKEY --outcome-index 0 --output nautilus-quotes.csv
norynta-adapters export lean EVENT_PUBKEY --outcome-index 0 --output lean-custom-data.csv
norynta-adapters export backtrader EVENT_PUBKEY --outcome-index 0 --timeframe 1h --output backtrader.csv
norynta-adapters export backtesting EVENT_PUBKEY --outcome-index 0 --timeframe 1h --output backtesting.csv
norynta-adapters export vectorbt EVENT_PUBKEY --outcome-index 0 --timeframe 1h --output vectorbt.csv
norynta-adapters export vnpy EVENT_PUBKEY --outcome-index 0 --timeframe 1m --output vnpy-bars.csv
norynta-adapters export qlib EVENT_PUBKEY --outcome-index 0 --timeframe 1h --output qlib-features.csv
norynta-adapters export finrl EVENT_PUBKEY --outcome-index 0 --timeframe 1h --output finrl-market-data.csv
norynta-adapters export jesse EVENT_PUBKEY --outcome-index 0 --timeframe 5m --output jesse-candles.csv
norynta-adapters export openbb EVENT_PUBKEY --outcome-index 0 --timeframe 1h --output openbb-prices.csv
norynta-adapters export lumibot EVENT_PUBKEY --outcome-index 0 --timeframe 1h --output lumibot-bars.csv
norynta-adapters export quantstats EVENT_PUBKEY --outcome-index 0 --timeframe 1h --output quantstats-returns.csv
norynta-adapters export tensortrade EVENT_PUBKEY --outcome-index 0 --timeframe 1h --output tensortrade-feed.csv
norynta-adapters export zipline EVENT_PUBKEY --outcome-index 0 --timeframe 1h --output zipline-bundle.csv
norynta-adapters export octobot EVENT_PUBKEY --outcome-index 0 --timeframe 5m --output octobot-candles.csv

Every export accepts --from-time and --to-time ISO-8601 bounds. Files are written atomically, price levels outside 0–100 cents and negative sizes are rejected, order books are normalized best-price-first, duplicate sequences are removed, and sequence regressions fail closed for replay data.

Historical trade and order-book exports require an API key with exports:read. Current order-book reads use the normal market-data contract.

CCXT-style usage

The facade follows familiar CCXT method names without monkey-patching or vendoring CCXT:

from norynta import NoryntaCcxtAdapter

exchange = NoryntaCcxtAdapter(
    base_url="http://localhost:3000",
    api_key="pmak_scoped_key",
)
markets = exchange.load_markets()
book = exchange.fetch_order_book("EVENT_PUBKEY:0/USDC")
candles = exchange.fetch_ohlcv("EVENT_PUBKEY:0/USDC", "5m")

Paper orders are the default:

result = exchange.create_order(
    "EVENT_PUBKEY:0/USDC",
    "limit",
    "buy",
    10,
    0.49,
    {"idempotencyKey": "paper:strategy-a:001"},
)

Live submission fails closed unless the caller provides both a signed Norynta body and a deterministic idempotency key:

result = exchange.create_order(
    "EVENT_PUBKEY:0/USDC",
    "limit",
    "buy",
    10,
    0.49,
    {
        "paper": False,
        "signedOrder": caller_signed_norynta_body,
        "idempotencyKey": "live:strategy-a:001",
    },
)

The adapter does not generate signatures, timestamps, nonces, or wallet keys. Transport retries must reuse the same signed body and idempotency key.

Python framework usage

from norynta import NoryntaClient, NoryntaFrameworkAdapter

client = NoryntaClient(
    base_url="http://localhost:3000",
    api_key="pmak_scoped_key",
)
adapter = NoryntaFrameworkAdapter(client)
instrument = adapter.instrument("EVENT_PUBKEY", 0)

hummingbot_content = adapter.hummingbot_snapshot(instrument)
freqtrade_ohlcv = adapter.ohlcv(instrument, timeframe="5m")
nautilus_ticks = adapter.quote_ticks(instrument)
lean_rows = adapter.lean_rows(instrument)
backtrader_frame = adapter.backtrader_frame(instrument, timeframe="1h")
backtesting_frame = adapter.backtesting_frame(instrument, timeframe="1h")
vectorbt_frame = adapter.vectorbt_frame(instrument, timeframe="1h")
vnpy_rows = adapter.vnpy_rows(instrument, timeframe="1m")
qlib_frame = adapter.qlib_frame(instrument, timeframe="1h")
finrl_frame = adapter.finrl_frame(instrument, timeframe="1h")
jesse_candles = adapter.jesse_candles(instrument, timeframe="5m")
openbb_rows = adapter.openbb_rows(instrument, timeframe="1h")
lumibot_frame = adapter.lumibot_frame(instrument, timeframe="1h")
quantstats_returns = adapter.quantstats_returns(instrument, timeframe="1h")
tensortrade_rows = adapter.tensortrade_rows(instrument, timeframe="1h")
zipline_rows = adapter.zipline_rows(instrument, timeframe="1h")
octobot_candles = adapter.octobot_candles(instrument, timeframe="5m")

For Backtrader, pass the returned frame to backtrader.feeds.PandasData. For Backtesting.py, pass its native-capitalized frame directly to Backtest. For vectorbt, use the frame's close column as the price series. For NautilusTrader and LEAN, the normalized rows are intentionally custom-data inputs; they are not advertised as native live execution clients.

For vn.py, the starter constructs native BarData objects when vn.py is installed. Qlib uses a (datetime, instrument) feature index, FinRL/FinRL-X receives date/tic OHLCV rows, and Jesse receives candles ordered as timestamp, open, close, high, low, volume. These four bridges are likewise research/backtest inputs, not native Norynta live gateways.

Support and safety matrix

AdapterMarket dataHistorical/replayPaperLive
CCXT-style facadeYesYesYesCaller-signed Norynta request only
Hummingbot bridgeYesNoVia Norynta paper APINo native connector yet
Freqtrade bridgeOHLCVYesBacktest/dry-run dataNo
NautilusTrader bridgeQuote ticksYesEngine-side simulationNo
LEAN bridgeCustom dataYesEngine-side simulationNo
Backtrader bridgeOHLCV frameYesBacktestNo
Backtesting.py bridgeNative OHLCV frameYesBacktestNo
vectorbt bridgePrice/volume frameYesBacktestNo
vn.py bridgeBarData-compatible barsYesBacktestNo native gateway
Qlib bridgeAI feature frameYesBacktest/MLNo
FinRL/FinRL-X bridgeRL-ready OHLCV frameYesBacktest/MLNo
Jesse bridgeNative candle shapeYesBacktestNo native exchange
OpenBB bridgeHistorical price recordsYesAnalysisNo
Lumibot bridgeOHLCV frameYesBacktest/paper dataNo native broker
QuantStats bridgeReturn seriesYesAnalyticsNo
TensorTrade bridgeFeed featuresYesBacktest/MLNo
Zipline Reloaded bridgeBundle rowsYesBacktestNo
OctoBot bridgeHistorical candlesYesBacktest/paper dataNo native exchange

The machine-readable version of this matrix is exposed at /api/bot/config, /api/agent/access, and /api/agent/card under compatibility.ossAdapters, including the GitHub starter URL for every adapter.

Sequence-aware order-book streaming

The SDK can maintain a normalized book from the dedicated SSE stream:

for book in adapter.reconciled_orderbook_stream(
    "EVENT_SLUG",
    instrument,
    stale_after_seconds=30,
):
    print(book["sequence"], book["bids"][:1], book["asks"][:1])

Norynta sequences are global exchange sequences, so jumps are valid and do not by themselves cause a resync. The reconciler repairs deltas that arrive before a snapshot, regress, conflict at the same sequence, or contain invalid levels. Each snapshot carries a deterministic SHA-256 bookRevision; deltas bind both previousBookRevision and bookRevision, so a missed same-market update is detectable even when unrelated markets legitimately advance the global sequence. SSE event IDs use orderbook:<decimal-sequence>:<book-revision>. Both Python and TypeScript clients send the last ID on reconnect, the server replays up to 100 persisted events, and a resync event directs the client to the following authoritative snapshot when the bounded replay window is unavailable or exhausted. Repair uses the read-only current-order-book endpoint and exposes stale, resyncCount, source, and action in every yielded state. It does not submit orders or load wallet keys.

Upstream compatibility policy

packages/python-sdk/compatibility/upstream.json identifies the official repository and actual verification depth for every adapter. Lightweight native integrations—Backtrader, Backtesting.py, and vectorbt—install both their minimum-supported and latest SDK-compatible releases and run a real engine smoke. Heavy or source-oriented frameworks use contract fixtures and compiled starters so the repository does not pretend an export bridge is a fully installed live connector.

Validate the repository setup

npm run trading-adapters:check
npm run trading-adapters:upstream:check
npm run python-sdk:check
npm run openapi:check
npm run check:agent-docs

python-sdk:check requires the development extras, including mypy, build, and twine.