Markets¶
The markets module provides data models for all market-related information: instrument metadata, candlestick data, trade records, order books, positions, and funding/lending rates.
Trading Pairs and Market Info¶
TradingPair¶
TradingPair is a singleton Pydantic model identified by its name string. The name follows the pattern BASE-QUOTE[-TYPE[-TIMEFRAME-EXPIRY[-STRIKE]]].
from financepype.markets.trading_pair import TradingPair
# Spot pair
spot = TradingPair(name="BTC-USDT")
print(spot.base) # BTC
print(spot.quote) # USDT
# Perpetual contract
perp = TradingPair(name="BTC-USDT-PERPETUAL")
print(perp.market_type) # MarketType.PERPETUAL
print(perp.market_info.is_perpetual) # True
# Weekly future expiring 2026-01-01
future = TradingPair(name="BTC-USDT-FUTURE-1W-20260101")
print(future.market_info.is_future) # True
print(future.market_info.expiry_date) # datetime(2026, 1, 1)
print(future.market_info.timeframe_type) # MarketTimeframe.WEEKLY
Singleton behaviour: the same name always returns the same object.
a = TradingPair(name="BTC-USDT")
b = TradingPair(name="BTC-USDT")
assert a is b
MarketType¶
MarketType categorises instruments:
| Value | Description |
|---|---|
SPOT |
Spot trading |
FUTURE |
Linear futures |
INVERSE_FUTURE |
Inverse futures |
PERPETUAL |
Linear perpetual |
INVERSE_PERPETUAL |
Inverse perpetual |
EQUITY |
Equity (treated as perpetual) |
CALL_OPTION |
Call option |
PUT_OPTION |
Put option |
INVERSE_CALL_OPTION |
Inverse call option |
INVERSE_PUT_OPTION |
Inverse put option |
CALL_SPREAD |
Call spread |
PUT_SPREAD |
Put spread |
VOLATILITY |
Volatility instrument |
Useful boolean properties on MarketType:
from financepype.markets.market import MarketType
t = MarketType.PERPETUAL
print(t.is_spot) # False
print(t.is_derivative) # True
print(t.is_perpetual) # True
print(t.is_future) # False
print(t.is_option) # False
print(t.is_linear) # True
print(t.is_inverse) # False
MarketInfo¶
MarketInfo contains fully parsed instrument metadata. It is returned by TradingPair.market_info and by MarketInfo.split_client_instrument_name().
from financepype.markets.market import MarketInfo, MarketType
# Parse directly
info = MarketInfo.split_client_instrument_name("ETH-USDT-PERPETUAL")
print(info.base) # ETH
print(info.quote) # USDT
print(info.market_type) # MarketType.PERPETUAL
# Reconstruct client name
print(info.client_name) # ETH-USDT-PERPETUAL
For options, strike_price and expiry_date are required:
info = MarketInfo.split_client_instrument_name("BTC-USDT-CALL_OPTION-1W-20260101-50000")
print(info.strike_price) # Decimal('50000')
MarketTimeframe¶
MarketTimeframe represents standard contract durations:
1H, 2H, 4H, 1D, 2D, 1W, 2W, 1M, 2M, 1Q, 2Q, 1Y, NA
Candlestick Data¶
Candle¶
Candle is an OHLCV record for a time period.
from datetime import datetime, timedelta
from decimal import Decimal
from financepype.markets.candle import Candle, CandleTimeframe, CandleType
candle = Candle(
start_time=datetime(2026, 1, 1, 0, 0),
end_time=datetime(2026, 1, 1, 1, 0),
open=Decimal("50000"),
close=Decimal("51000"),
high=Decimal("51500"),
low=Decimal("49800"),
volume=Decimal("123.45"),
)
Gap filling — produce a continuous series by propagating the previous close:
start = datetime(2026, 1, 1)
end = datetime(2026, 1, 2)
filled = Candle.fill_missing_candles_with_prev_candle(candles, start, end)
Interval conversion — aggregate 1-hour candles into 4-hour candles:
four_hour = Candle.convert_candles_interval(hourly_candles, seconds_interval=14400)
CandleTimeframe¶
Pre-defined second values for standard intervals:
SEC_1=1, MIN_1=60, MIN_5=300, MIN_15=900, MIN_30=1800,
HOUR_1=3600, HOUR_2=7200, HOUR_4=14400,
DAY_1=86400, WEEK_1=604800, MONTH_1=2592000
CandleType¶
PRICE, MARK, INDEX, PREMIUM, FUNDING, ACCRUED_FUNDING
Trades¶
PublicTrade¶
Represents a single public trade visible on the market feed.
from datetime import datetime
from decimal import Decimal
from financepype.markets.trade import PublicTrade
from financepype.markets.trading_pair import TradingPair
from financepype.operations.orders.models import TradeType
trade = PublicTrade(
trade_id="t001",
trading_pair=TradingPair(name="BTC-USDT"),
price=Decimal("50000"),
amount=Decimal("0.1"),
side=TradeType.BUY,
time=datetime.now(),
is_liquidation=False,
)
Order Book¶
The order book implementation uses float internally for performance, with Decimal conversions for client-facing APIs.
Key Data Classes¶
| Class | Description |
|---|---|
OrderBookEntry |
A single price level: price, amount, update_id |
OrderBookRow |
Internal row used when applying updates (float) |
ClientOrderBookRow |
External row with Decimal values |
OrderBookQueryResult |
Result of a price/volume query (float) |
ClientOrderBookQueryResult |
Same with Decimal values |
Order Book Messages¶
| Class | Type | Description |
|---|---|---|
OrderBookUpdateMessage |
SNAPSHOT / DIFF | Full or incremental book update |
OrderBookTradeMessage |
TRADE | A trade event |
from financepype.markets.orderbook.models import (
OrderBookUpdateMessage, OrderBookMessageType, OrderBookTradeMessage
)
from financepype.markets.trading_pair import TradingPair
pair = TradingPair(name="BTC-USDT")
snapshot = OrderBookUpdateMessage(
type=OrderBookMessageType.SNAPSHOT,
timestamp=1700000000.0,
trading_pair=pair,
update_id=1,
raw_asks=[(50100.0, 0.5), (50200.0, 1.0)],
raw_bids=[(49900.0, 0.3), (49800.0, 2.0)],
)
print(snapshot.asks[0]) # OrderBookRow(price=50100.0, amount=0.5, update_id=1)
OrderBookEvent¶
Events emitted by the order book:
TradeEvent— a trade occurredOrderBookUpdateEvent— the book state changed
Positions¶
Position¶
Position models an open derivative position.
from decimal import Decimal
from financepype.markets.position import Position
from financepype.assets.contract import DerivativeContract, DerivativeSide
from financepype.assets.asset_id import AssetIdentifier
from financepype.platforms.platform import Platform
platform = Platform(identifier="binance")
asset = DerivativeContract(
platform=platform,
identifier=AssetIdentifier(value="BTC-USDT-PERPETUAL"),
side=DerivativeSide.LONG,
)
position = Position(
asset=asset,
amount=Decimal("0.1"),
leverage=Decimal("10"),
entry_price=Decimal("50000"),
entry_index_price=Decimal("49990"),
margin=Decimal("500"),
unrealized_pnl=Decimal("100"),
liquidation_price=Decimal("45000"),
)
print(position.is_long) # True
print(position.value) # Decimal('5000') (entry_price * amount)
print(position.unrealized_percentage_pnl) # Decimal('20') %
# Distance from liquidation
print(position.distance_from_liquidation(Decimal("50000"))) # 5000
Funding Rates¶
FundingInfo¶
FundingInfo holds the current funding state for a perpetual market.
from decimal import Decimal
from financepype.markets.funding import FundingInfo, FundingPaymentType
from financepype.markets.trading_pair import TradingPair
info = FundingInfo(
trading_pair=TradingPair(name="BTC-USDT-PERPETUAL"),
index_price=Decimal("50000"),
mark_price=Decimal("50100"),
next_funding_utc_timestamp=1700028800,
next_funding_rate=Decimal("0.01"),
last_funding_utc_timestamp=1700000000,
last_funding_rate=Decimal("0.008"),
payment_type=FundingPaymentType.NEXT,
)
print(info.payment_seconds_interval) # 28800 (8 hours)
print(info.has_live_payments) # False
# Project future payments
rates = info.get_next_payment_rates()
FundingPayment¶
Records an actual funding payment that was received or paid.
FundingInfoUpdate¶
A partial update to apply to an existing FundingInfo via info.update(update).
Borrow and Staking Rates¶
The rates module mirrors the funding structure but for lending (borrow rates) and staking rewards.
BorrowInfo / StakingInfo¶
from financepype.markets.rates import BorrowInfo, RatePaymentType
from financepype.assets.factory import AssetFactory
from financepype.platforms.platform import Platform
from decimal import Decimal
platform = Platform(identifier="binance")
usdt = AssetFactory.get_asset(platform, "USDT")
borrow = BorrowInfo(
asset=usdt,
current_rate=Decimal("5.0"), # 5% APR
next_payment_utc_timestamp=1700028800,
next_rate=Decimal("5.1"),
last_payment_utc_timestamp=1700000000,
last_rate=Decimal("4.9"),
payment_type=RatePaymentType.NEXT,
)
print(borrow.payment_seconds_interval) # 28800
Both classes expose update(info_update) and get_next_payment_rates() with the same signatures as FundingInfo.
Lending Positions¶
The lending module provides position models for borrow and staking positions — representing the ongoing state, not the operations that created them.
BorrowPosition¶
from financepype.markets.lending import BorrowPosition
from decimal import Decimal
pos = BorrowPosition(
borrowed_asset=usdt,
collateral_asset=btc,
borrowed_amount=Decimal("10000"),
collateral_amount=Decimal("0.25"),
interest_rate=Decimal("5.0"),
entry_timestamp=1700000000,
liquidation_threshold=Decimal("80"),
)
print(pos.total_debt) # borrowed_amount + accrued_interest
print(pos.collateral_ratio) # percentage
print(pos.is_at_liquidation_risk(
collateral_price=Decimal("50000"),
borrowed_price=Decimal("1"),
))
StakingPosition¶
Similar to BorrowPosition but tracks staked amount and reward accrual:
from financepype.markets.lending import StakingPosition
staking = StakingPosition(
staked_asset=btc,
reward_asset=btc,
staked_amount=Decimal("1.0"),
reward_rate=Decimal("3.0"), # 3% APY
entry_timestamp=1700000000,
)
rewards = staking.calculate_rewards_for_period(1700000000, 1731536000)