Skip to main content

mts1b-treasury — public API surface

Capital allocator + transfer planner + fund registry + NAV tracker + tax lots.

Fund registry

from mts1b_treasury.fund_registry import FundRegistry, FundConfig

await FundRegistry.register(FundConfig(
fund_id="paper-momentum",
name="Paper Momentum",
target_nav_usd=Decimal("100000"),
broker="paper",
base_currency="USD",
asset_classes=["equities"],
strategies=["momentum_v3"],
tax_lot_method="hifo",
created_at=datetime.now(timezone.utc),
))

active = await FundRegistry.active()
fund = await FundRegistry.get("paper-momentum")
await FundRegistry.edit("paper-momentum", target_nav_usd=Decimal("150000"))
await FundRegistry.close("paper-momentum", reason="demo done")

Allocator

from mts1b_treasury.allocator import allocate, AllocatorMethod

decisions = await allocate(
funds=await FundRegistry.active(),
total_nav=Decimal("224150"),
method=AllocatorMethod.RISK_PARITY, # or EQUAL | KELLY | MANUAL
constraints={
"min_per_fund_usd": Decimal("25000"),
"max_per_fund_pct": 0.50,
"max_sleeve_correlation": 0.7,
"preserve_capital_dnt": True,
},
)
# list[AllocationDecision]


# Each decision is a plan (not action)
for d in decisions:
print(d.fund_id, d.current_nav, d.target_nav, d.delta, d.reason)

Transfer planner

from mts1b_treasury.transfers import plan_transfer

route = await plan_transfer(
from_fund="paper-momentum-internal",
to_fund="live-crypto-revol",
amount_usd=Decimal("10000"),
)
# TransferRoute(steps=[...], total_eta_business_days=2, total_fees=...)

Transfer executor (operator co-sign)

from mts1b_treasury.transfers import TransferExecutor

executor = TransferExecutor(transfer_id="xfer-001")
await executor.cosign(by="operator:mondipsen", twofa_token="...")

# Mark each leg done as operator manually executes
await executor.mark_step_done(step=1, txn_id="ACH-12345")
await executor.mark_step_done(step=2, txn_id="COINBASE-67890")
# status → "done"

⚠️ mts1b-treasury NEVER moves money on its own. It produces plans + tracks operator-confirmed completions.

from mts1b_treasury.nav import NavTracker

tracker = NavTracker()
snap = await tracker.snapshot(fund_id="paper-momentum")
# NavSnapshot(...)

# Daily snapshot from cron
await tracker.snapshot_all_funds() # publishes to mts.v1.treasury.nav.updated

Attribution

from mts1b_treasury.nav.attribution import attribute

attr = await attribute(
fund_id="paper-momentum",
window="mtd", # or "ytd" | "1y" | "all"
)
# {
# "strategy:momentum_v3": Decimal("+1.2%"),
# "strategy:carry": Decimal("-0.1%"),
# "cash_drag": Decimal("0.0%"),
# "rebalance_attribution": Decimal("+0.1%"),
# "fees": Decimal("-0.2%"),
# "total": Decimal("+1.0%"),
# }

Tax lots

from mts1b_treasury.tax_lots import TaxLotLedger

ledger = TaxLotLedger(fund_id="live-equities")

# List open lots
open_lots = await ledger.open_lots(symbol=Symbol("AAPL"))

# Match a close (FIFO / HIFO / etc per fund's tax_lot_method)
matched = await ledger.match_close(
symbol=Symbol("AAPL"),
close_qty=Decimal("100"),
close_price=Decimal("200"),
close_date=date.today(),
)
# list[tuple[TaxLot, qty_taken_from_lot]]

# Realized gains for year
realized = await ledger.realized_gains(year=2026)
# {"short_term": Decimal("$14,235"), "long_term": Decimal("$0")}

# Wash sale tracking
washes = await ledger.wash_sales(year=2026)

CLI

mts mts1b-treasury fund create --fund-id X --nav 100000 --broker paper
mts mts1b-treasury fund list
mts mts1b-treasury fund show --fund-id X

mts mts1b-treasury allocator config --method risk_parity --min-per-fund-usd 25000
mts mts1b-treasury allocator plan --dry-run
mts mts1b-treasury allocator execute --confirm REBALANCE

mts mts1b-treasury transfers list
mts mts1b-treasury transfer plan --from A --to B --amount 10000

mts mts1b-treasury nav --fund-id X
mts mts1b-treasury attribution --fund-id X --window mtd
mts mts1b-treasury tax-lots show --fund-id Y --year 2026

NATS subjects

SubjectDirectionPayload
mts.v1.treasury.nav.updatedpublishNavSnapshot
mts.v1.treasury.transfers.requestedpublishTransferRequest
mts.v1.oms.fills.createdsubscribeupdate NAV in real time

See also