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)