Moar `.accounting` tweaks
- start flipping over internals to `Position.cumsize` - allow passing in a `_mktmap_table` to `Account.update_from_ledger()` for cases where the caller wants to per-call-dyamically insert the `MktPair` via a one-off table (cough IB). - use `polars.from_dicts()` in `.calc.open_ledger_dfs()`. and wrap the whole func in a new `toolz.open_crash_handler()`.account_tests
parent
759ebe71e9
commit
897c20bd4a
|
@ -324,7 +324,7 @@ class Position(Struct):
|
|||
(fiat) units.
|
||||
|
||||
'''
|
||||
return self.ppu * self.size
|
||||
return self.ppu * self.cumsize
|
||||
|
||||
def expired(self) -> bool:
|
||||
'''
|
||||
|
@ -483,6 +483,8 @@ class Account(Struct):
|
|||
cost_scalar: float = 2,
|
||||
symcache: SymbologyCache | None = None,
|
||||
|
||||
_mktmap_table: dict[str, MktPair] | None = None,
|
||||
|
||||
) -> dict[str, Position]:
|
||||
'''
|
||||
Update the internal `.pps[str, Position]` table from input
|
||||
|
@ -519,7 +521,14 @@ class Account(Struct):
|
|||
|
||||
# template the mkt-info presuming a legacy market ticks
|
||||
# if no info exists in the transactions..
|
||||
mkt: MktPair = symcache.mktmaps[fqme]
|
||||
try:
|
||||
mkt: MktPair = symcache.mktmaps[fqme]
|
||||
except KeyError:
|
||||
# XXX: caller is allowed to provide a fallback
|
||||
# mktmap table for the case where a new position is
|
||||
# being added and the preloaded symcache didn't
|
||||
# have this entry prior (eg. with frickin IB..)
|
||||
mkt = _mktmap_table[fqme]
|
||||
|
||||
if not (pos := pps.get(bs_mktid)):
|
||||
|
||||
|
|
|
@ -361,8 +361,8 @@ def open_ledger_dfs(
|
|||
if not ledger:
|
||||
import time
|
||||
from tractor._debug import open_crash_handler
|
||||
now = time.time()
|
||||
|
||||
now = time.time()
|
||||
with (
|
||||
open_crash_handler(),
|
||||
|
||||
|
@ -390,26 +390,29 @@ def open_ledger_dfs(
|
|||
# )
|
||||
|
||||
txns: dict[str, Transaction] = ledger.to_txns()
|
||||
ldf = pl.DataFrame(
|
||||
# ldf = pl.DataFrame(
|
||||
# list(txn.to_dict() for txn in txns.values()),
|
||||
ldf = pl.from_dicts(
|
||||
list(txn.to_dict() for txn in txns.values()),
|
||||
# schema=[
|
||||
# ('tid', str),
|
||||
# ('fqme', str),
|
||||
# ('dt', str),
|
||||
# ('size', pl.Float64),
|
||||
# ('price', pl.Float64),
|
||||
# ('cost', pl.Float64),
|
||||
# ('expiry', str),
|
||||
# ('bs_mktid', str),
|
||||
# ],
|
||||
# ).sort('dt').select([
|
||||
).sort('dt').with_columns([
|
||||
# pl.col('fqme'),
|
||||
|
||||
# only for ordering the cols
|
||||
schema=[
|
||||
('fqme', str),
|
||||
('tid', str),
|
||||
('bs_mktid', str),
|
||||
('expiry', str),
|
||||
('etype', str),
|
||||
('dt', str),
|
||||
('size', pl.Float64),
|
||||
('price', pl.Float64),
|
||||
('cost', pl.Float64),
|
||||
],
|
||||
).sort( # chronological order
|
||||
'dt'
|
||||
).with_columns([
|
||||
pl.col('dt').str.to_datetime(),
|
||||
# pl.col('expiry').dt.datetime(),
|
||||
# pl.col('bs_mktid'),
|
||||
# pl.col('size'),
|
||||
# pl.col('price'),
|
||||
# pl.col('expiry').str.to_datetime(),
|
||||
# pl.col('expiry').dt.date(),
|
||||
])
|
||||
|
||||
# filter out to the columns matching values filter passed
|
||||
|
@ -423,20 +426,24 @@ def open_ledger_dfs(
|
|||
|
||||
# fdf = df.filter(pred)
|
||||
|
||||
# bs_mktid: str = fdf[0]['bs_mktid']
|
||||
# pos: Position = acnt.pps[bs_mktid]
|
||||
|
||||
# TODO: not sure if this is even possible but..
|
||||
# ppt = df.groupby('fqme').agg([
|
||||
# # TODO: ppu and bep !!
|
||||
# pl.cumsum('size').alias('cumsum'),
|
||||
# ])
|
||||
# break up into a frame per mkt / fqme
|
||||
dfs: dict[str, pl.DataFrame] = ldf.partition_by(
|
||||
'fqme',
|
||||
as_dict=True,
|
||||
)
|
||||
|
||||
# TODO: not sure if this is even possible but..
|
||||
# - it'd be more ideal to use `ppt = df.groupby('fqme').agg([`
|
||||
# - ppu and bep calcs!
|
||||
for key in dfs:
|
||||
df = dfs[key]
|
||||
|
||||
# TODO: pass back the current `Position` object loaded from
|
||||
# the account as well? Would provide incentive to do all
|
||||
# this ledger loading inside a new async open_account().
|
||||
# bs_mktid: str = df[0]['bs_mktid']
|
||||
# pos: Position = acnt.pps[bs_mktid]
|
||||
|
||||
dfs[key] = df.with_columns([
|
||||
pl.cumsum('size').alias('cumsize'),
|
||||
])
|
||||
|
|
|
@ -253,6 +253,7 @@ def disect(
|
|||
),
|
||||
):
|
||||
from piker.log import get_console_log
|
||||
from piker.toolz import open_crash_handler
|
||||
get_console_log(loglevel)
|
||||
|
||||
pair: tuple[str, str]
|
||||
|
@ -266,10 +267,14 @@ def disect(
|
|||
# actual ledger ref filled in with all txns
|
||||
ldgr: TransactionLedger
|
||||
|
||||
with open_ledger_dfs(
|
||||
brokername,
|
||||
account,
|
||||
) as (dfs, ldgr):
|
||||
pl.Config.set_tbl_cols(16)
|
||||
with (
|
||||
open_crash_handler(),
|
||||
open_ledger_dfs(
|
||||
brokername,
|
||||
account,
|
||||
) as (dfs, ldgr),
|
||||
):
|
||||
|
||||
# look up specific frame for fqme-selected asset
|
||||
df = dfs[fqme]
|
||||
|
|
Loading…
Reference in New Issue