Local changes: Updated model training, removed debug instrumentation, and configuration improvements
This commit is contained in:
85
tests/unit/backtesting/test_slippage.py
Normal file
85
tests/unit/backtesting/test_slippage.py
Normal file
@@ -0,0 +1,85 @@
|
||||
"""Tests for slippage model."""
|
||||
|
||||
import pytest
|
||||
from decimal import Decimal
|
||||
from src.backtesting.slippage import SlippageModel, FeeModel
|
||||
|
||||
|
||||
class TestSlippageModel:
|
||||
"""Tests for SlippageModel."""
|
||||
|
||||
@pytest.fixture
|
||||
def slippage_model(self):
|
||||
"""Create slippage model."""
|
||||
return SlippageModel(slippage_rate=0.001)
|
||||
|
||||
def test_calculate_fill_price_market_buy(self, slippage_model):
|
||||
"""Test fill price calculation for market buy."""
|
||||
order_price = Decimal('50000.0')
|
||||
market_price = Decimal('50000.0')
|
||||
|
||||
fill_price = slippage_model.calculate_fill_price(
|
||||
order_price, "buy", "market", market_price
|
||||
)
|
||||
|
||||
assert fill_price > market_price # Buy orders pay more
|
||||
|
||||
def test_calculate_fill_price_market_sell(self, slippage_model):
|
||||
"""Test fill price calculation for market sell."""
|
||||
order_price = Decimal('50000.0')
|
||||
market_price = Decimal('50000.0')
|
||||
|
||||
fill_price = slippage_model.calculate_fill_price(
|
||||
order_price, "sell", "market", market_price
|
||||
)
|
||||
|
||||
assert fill_price < market_price # Sell orders receive less
|
||||
|
||||
def test_calculate_fill_price_limit(self, slippage_model):
|
||||
"""Test fill price for limit orders."""
|
||||
order_price = Decimal('49000.0')
|
||||
market_price = Decimal('50000.0')
|
||||
|
||||
fill_price = slippage_model.calculate_fill_price(
|
||||
order_price, "buy", "limit", market_price
|
||||
)
|
||||
|
||||
assert fill_price == order_price # Limit orders fill at order price
|
||||
|
||||
|
||||
class TestFeeModel:
|
||||
"""Tests for FeeModel."""
|
||||
|
||||
@pytest.fixture
|
||||
def fee_model(self):
|
||||
"""Create fee model."""
|
||||
return FeeModel(maker_fee=0.001, taker_fee=0.002)
|
||||
|
||||
def test_calculate_fee_maker(self, fee_model):
|
||||
"""Test maker fee calculation."""
|
||||
fee = fee_model.calculate_fee(
|
||||
quantity=Decimal('0.01'),
|
||||
price=Decimal('50000.0'),
|
||||
is_maker=True
|
||||
)
|
||||
|
||||
assert fee > 0
|
||||
# Fee should be 0.1% of trade value
|
||||
expected = Decimal('0.01') * Decimal('50000.0') * Decimal('0.001')
|
||||
assert abs(float(fee - expected)) < 0.01
|
||||
|
||||
def test_calculate_fee_taker(self, fee_model):
|
||||
"""Test taker fee calculation."""
|
||||
fee = fee_model.calculate_fee(
|
||||
quantity=Decimal('0.01'),
|
||||
price=Decimal('50000.0'),
|
||||
is_maker=False
|
||||
)
|
||||
|
||||
assert fee > 0
|
||||
# Taker fee should be higher than maker
|
||||
maker_fee = fee_model.calculate_fee(
|
||||
Decimal('0.01'), Decimal('50000.0'), is_maker=True
|
||||
)
|
||||
assert fee > maker_fee
|
||||
|
||||
Reference in New Issue
Block a user