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.
NAV tracker
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
| Subject | Direction | Payload |
|---|---|---|
mts.v1.treasury.nav.updated | publish | NavSnapshot |
mts.v1.treasury.transfers.requested | publish | TransferRequest |
mts.v1.oms.fills.created | subscribe | update NAV in real time |