Source code for tradeexecutor.backtest.backtest_valuation

import datetime
from typing import Tuple

from tradeexecutor.backtest.backtest_pricing import BacktestSimplePricingModel
from tradeexecutor.state.position import TradingPosition
from tradeexecutor.state.types import USDollarAmount
from tradeexecutor.state.identifier import TradingPairKind
from tradeexecutor.strategy.valuation import ValuationModel


[docs]class BacktestValuationModel(ValuationModel): """Re-value assets based on their on-chain backtest dataset price. Each asset is valued at its market sell price estimation. """
[docs] def __init__(self, pricing_model: BacktestSimplePricingModel): assert pricing_model, "pricing_model missing" self.pricing_model = pricing_model
[docs] def __call__(self, ts: datetime.datetime, position: TradingPosition) -> Tuple[datetime.datetime, USDollarAmount]: assert isinstance(ts, datetime.datetime) assert ts.second == 0, f"Timestamp sanity check failed, does not have even seconds: {ts}" pair = position.pair if position.is_long(): quantity = position.get_quantity() trade_price = self.pricing_model.get_sell_price(ts, pair, quantity) return ts, float(trade_price.price) else: # TODO: Use position net asset pricing for leveraged positions assert pair.kind == TradingPairKind.lending_protocol_short quantity = -position.get_quantity() trade_price = self.pricing_model.get_sell_price(ts, pair.underlying_spot_pair, quantity) return ts, float(trade_price.price)
[docs]def backtest_valuation_factory(pricing_model): return BacktestValuationModel(pricing_model)