Skip to content

Commit 63fbede

Browse files
committed
- Update portfolio on specific events instead of dynamic update during portfolio fetch
- Add equity_slippage and future_slippage parameters to run_simulation and run_simulation_iter Signed-off-by: Nikola Losic <nikolalosic@protonmail.ch>
1 parent df67129 commit 63fbede

File tree

15 files changed

+220
-219
lines changed

15 files changed

+220
-219
lines changed

examples/run_simulation_daily.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,15 @@
1616
from ziplime.core.ingest_data import get_asset_service
1717
from ziplime.core.run_simulation import run_simulation
1818
from ziplime.finance.commission import PerShare, DEFAULT_PER_SHARE_COST, DEFAULT_MINIMUM_COST_PER_EQUITY_TRADE
19+
from ziplime.finance.slippage.fixed_basis_points_slippage import FixedBasisPointsSlippage
1920

2021
logger = structlog.get_logger(__name__)
2122

2223

2324
async def _run_simulation():
24-
start_date = datetime.datetime(year=2025, month=1, day=3, tzinfo=pytz.timezone("America/New_York"))
25+
start_date = datetime.datetime(year=2020, month=1, day=3, tzinfo=pytz.timezone("America/New_York"))
2526
end_date = datetime.datetime(year=2025, month=2, day=1, tzinfo=pytz.timezone("America/New_York"))
26-
27+
# Backtest completed in 3 seconds
2728
bundle_service = get_bundle_service()
2829

2930
asset_service = get_asset_service(
@@ -60,6 +61,7 @@ async def _run_simulation():
6061
min_trade_cost=DEFAULT_MINIMUM_COST_PER_EQUITY_TRADE,
6162

6263
)
64+
equity_slippage = FixedBasisPointsSlippage()
6365

6466
# run daily simulation
6567
result = await run_simulation(
@@ -77,9 +79,10 @@ async def _run_simulation():
7779
stop_on_error=True,
7880
asset_service=asset_service,
7981
equity_commission=equity_commission,
82+
equity_slippage=equity_slippage,
8083
max_leverage=1.0,
8184
same_bar_execution=True,
82-
price_used_in_order_execution="close"
85+
price_used_in_order_execution="close",
8386
)
8487

8588
if result.errors:

poetry.lock

Lines changed: 29 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ structlog = "^25.4.0"
3737
tabulate = "^0.9.0"
3838
python-dateutil = "^2.9.0.post0"
3939
yfinance = "^0.2.65"
40+
pandas-stubs = "~=2.3.3"
4041

4142
[tool.poetry.group.vectorbt]
4243
optional = true

ziplime/assets/domain/continuous_future.py

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -109,17 +109,6 @@ def __reduce__(self):
109109
self.roll_style,
110110
self.exchange))
111111

112-
def to_dict(self):
113-
"""Convert to a python dict."""
114-
return {
115-
'sid': self.sid,
116-
'root_symbol': self.root_symbol,
117-
'start_date': self.start_date,
118-
'end_date': self.end_date,
119-
'offset': self.offset,
120-
'roll_style': self.roll_style,
121-
'exchange': self.exchange,
122-
}
123112

124113
@classmethod
125114
def from_dict(cls, dict_):

ziplime/core/run_simulation.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import datetime
22
import structlog
33

4+
from ziplime.finance.slippage.equity_slippage_model import EquitySlippageModel
5+
from ziplime.finance.slippage.future_slippage_model import FutureSlippageModel
46
from ziplime.gens.domain.trading_clock import TradingClock
57
from ziplime.trading.trading_algorithm_execution_result import TradingAlgorithmExecutionResult
68
from ziplime.trading.trading_algorithm_execution_status import TradingAlgorithmExecutionStatus
@@ -46,6 +48,8 @@ async def run_simulation(
4648
benchmark_returns: pl.Series | None = None,
4749
equity_commission: EquityCommissionModel | None = None,
4850
future_commission: FutureCommissionModel | None = None,
51+
equity_slippage: EquitySlippageModel | None = None,
52+
future_slippage: FutureSlippageModel | None = None,
4953
clock: TradingClock | None = None,
5054
max_leverage: float = 1.0,
5155
same_bar_execution: bool = True,
@@ -106,7 +110,12 @@ async def run_simulation(
106110
exchange_fee=FUTURE_EXCHANGE_FEES_BY_SYMBOL,
107111
min_trade_cost=DEFAULT_MINIMUM_COST_PER_FUTURE_TRADE
108112
)
109-
113+
if equity_slippage is None:
114+
equity_slippage = FixedBasisPointsSlippage()
115+
if future_slippage is None:
116+
future_slippage = VolatilityVolumeShare(
117+
volume_limit=DEFAULT_FUTURE_VOLUME_SLIPPAGE_BAR_LIMIT,
118+
)
110119
if exchange is None:
111120
exchange = SimulationExchange(
112121
name=default_exchange_name,
@@ -160,6 +169,8 @@ async def run_simulation_iter(
160169
benchmark_returns: pl.Series | None = None,
161170
equity_commission: EquityCommissionModel | None = None,
162171
future_commission: FutureCommissionModel | None = None,
172+
equity_slippage: EquitySlippageModel | None = None,
173+
future_slippage: FutureSlippageModel | None = None,
163174
clock: TradingClock | None = None,
164175
max_leverage: float = 1.0,
165176
same_bar_execution: bool = True,
@@ -220,6 +231,12 @@ async def run_simulation_iter(
220231
exchange_fee=FUTURE_EXCHANGE_FEES_BY_SYMBOL,
221232
min_trade_cost=DEFAULT_MINIMUM_COST_PER_FUTURE_TRADE
222233
)
234+
if equity_slippage is None:
235+
equity_slippage = FixedBasisPointsSlippage()
236+
if future_slippage is None:
237+
future_slippage = VolatilityVolumeShare(
238+
volume_limit=DEFAULT_FUTURE_VOLUME_SLIPPAGE_BAR_LIMIT,
239+
)
223240

224241
if exchange is None:
225242
if same_bar_execution and price_used_in_order_execution != "close":
@@ -232,11 +249,9 @@ async def run_simulation_iter(
232249
country_code="US",
233250
trading_calendar=calendar,
234251
data_source=market_data_source,
235-
equity_slippage=FixedBasisPointsSlippage(),
252+
equity_slippage=equity_slippage,
236253
equity_commission=equity_commission,
237-
future_slippage=VolatilityVolumeShare(
238-
volume_limit=DEFAULT_FUTURE_VOLUME_SLIPPAGE_BAR_LIMIT,
239-
),
254+
future_slippage=future_slippage,
240255
future_commission=future_commission,
241256
cash_balance=total_cash,
242257
clock=clock,

ziplime/exchanges/simulation_exchange.py

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from ziplime.domain.portfolio import Portfolio
1818
from ziplime.domain.account import Account
1919
from ziplime.finance.commission import EquityCommissionModel, FutureCommissionModel, CommissionModel
20+
from ziplime.finance.domain.commission import Commission
2021
from ziplime.finance.domain.order import Order
2122
from ziplime.finance.slippage.slippage_model import SlippageModel
2223
from ziplime.exchanges.exchange import Exchange
@@ -72,25 +73,25 @@ async def submit_order(self, order: Order):
7273
order.id = uuid.uuid4().hex
7374
return order
7475

75-
def get_positions(self) -> dict[Asset, Position]:
76+
async def get_positions(self) -> dict[Asset, Position]:
7677
pass
7778

78-
def get_portfolio(self) -> Portfolio:
79+
async def get_portfolio(self) -> Portfolio:
7980
pass
8081

81-
def get_account(self) -> Account:
82+
async def get_account(self) -> Account:
8283
pass
8384

8485
def get_time_skew(self):
8586
pass
8687

87-
def order(self, asset, amount, style):
88+
async def order(self, asset, amount, style):
8889
pass
8990

9091
def is_alive(self):
9192
pass
9293

93-
def get_orders(self) -> dict[str, Order]:
94+
async def get_orders(self) -> dict[str, Order]:
9495
pass
9596

9697
async def get_transactions(self, orders: dict[Asset, dict[str, Order]],
@@ -142,20 +143,17 @@ async def get_transactions(self, orders: dict[Asset, dict[str, Order]],
142143

143144
if additional_commission > 0:
144145
commissions.append(
145-
{
146-
"asset": order.asset,
147-
"order": order,
148-
"cost": additional_commission,
149-
}
146+
Commission(
147+
asset=order.asset,
148+
order=order,
149+
amount=additional_commission,
150+
)
150151
)
151152

152153
order.filled += txn.amount
153154
order.commission += additional_commission
154-
155155
order.dt = txn.dt
156-
157156
transactions.append(txn)
158-
159157
if not order.open:
160158
closed_orders.append(order)
161159

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from dataclasses import dataclass
2+
3+
from ziplime.assets.entities.asset import Asset
4+
from ziplime.finance.domain.order import Order
5+
6+
7+
@dataclass
8+
class Commission:
9+
asset: Asset
10+
order: Order
11+
amount: float

0 commit comments

Comments
 (0)