Skip to content

Commit 4bb1193

Browse files
authored
Merge pull request #4 from bsdz/asset_field_extensions
Asset field extensions + strategy runner refactor
2 parents f528476 + e3de8ea commit 4bb1193

27 files changed

+12186
-11936
lines changed

.flake8

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[flake8]
2+
max-line-length = 88
3+
extend-ignore = E203, E704, E741, F401

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ celerybeat.pid
104104
# Environments
105105
.env
106106
.venv
107+
.venv.*
107108
env/
108109
venv/
109110
ENV/

README.md

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ Below is an example usage (the performance of the example strategy won't be good
2525
```python
2626
import pandas as pd
2727

28-
from yabte.backtest import Strategy, StrategyRunner, Order, Book
29-
from yabte.utilities.plot.plotly.strategy_runner import plot_strategy_runner
30-
from yabte.utilities.strategy_helpers import crossover
28+
from yabte.backtest import Book, SimpleOrder, Strategy, StrategyRunner
3129
from yabte.tests._helpers import generate_nasdaq_dataset
30+
from yabte.utilities.plot.plotly.strategy_runner import plot_strategy_runner_result
31+
from yabte.utilities.strategy_helpers import crossover
3232

3333

3434
class SMAXO(Strategy):
@@ -64,9 +64,9 @@ class SMAXO(Strategy):
6464
data = df.loc[ix_2d, ("CloseSMAShort", "CloseSMALong")].dropna()
6565
if len(data) == 2:
6666
if crossover(data.CloseSMAShort, data.CloseSMALong):
67-
self.orders.append(Order(asset_name=symbol, size=-100))
67+
self.orders.append(SimpleOrder(asset_name=symbol, size=-100))
6868
elif crossover(data.CloseSMALong, data.CloseSMAShort):
69-
self.orders.append(Order(asset_name=symbol, size=100))
69+
self.orders.append(SimpleOrder(asset_name=symbol, size=100))
7070

7171

7272
# load some data
@@ -79,18 +79,17 @@ book = Book(name="Main", cash="100000")
7979
sr = StrategyRunner(
8080
data=df_combined,
8181
assets=assets,
82-
strat_classes=[SMAXO],
82+
strategies=[SMAXO()],
8383
books=[book],
8484
)
85-
sr.run()
85+
srr = sr.run()
8686

8787
# see the trades or book history
88-
th = sr.transaction_history
89-
bch = sr.book_history.loc[:, (slice(None), "cash")]
88+
th = srr.transaction_history
89+
bch = srr.book_history.loc[:, (slice(None), "cash")]
9090

9191
# plot the trades against book value
92-
plot_strategy_runner(sr);
93-
92+
plot_strategy_runner_result(srr, sr)
9493
```
9594

9695
![Output from code](https://raw.githubusercontent.com/bsdz/yabte/main/readme_image.png)

docs/index.rst

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ A typical strategy looks as follows:
2828

2929
.. code-block:: python
3030
31-
from yabte.backtest import Strategy, StrategyRunner, Order, Book, Asset
31+
from yabte.backtest import Strategy, StrategyRunner, SimpleOrder, Book, OHLCAsset
3232
from yabte.utilities.strategy_helpers import crossover
3333
3434
# All strategies inherit from the Strategy base class.
@@ -80,19 +80,19 @@ A typical strategy looks as follows:
8080
# executed the next day. There are different types
8181
# of order, e.g. positional and basket and some orders
8282
# support hooks for running arbitrary checks for limits etc.
83-
self.orders.append(Order(asset_name=symbol, size=-100))
83+
self.orders.append(SimpleOrder(asset_name=symbol, size=-100))
8484
elif crossover(data.CloseSMALong, data.CloseSMAShort):
85-
self.orders.append(Order(asset_name=symbol, size=100))
85+
self.orders.append(SimpleOrder(asset_name=symbol, size=100))
8686
8787
8888
To run our strategy, we use a StrategyRunner:
8989

9090
.. code-block:: python
9191
92-
# The Asset class is any pricable object with accompanying High, Low, Close,
93-
# Open & Volume field data. One can subclass Asset to support different field
92+
# The OHLCAsset class is any pricable object with accompanying High, Low, Close,
93+
# Open & Volume field data. One can subclass OHLCAsset to support different field
9494
# types, e.g. Volatility.
95-
assets = [Asset(name="GOOG", denom="USD"), Asset(name="MSFT", denom="USD")]
95+
assets = [OHLCAsset(name="GOOG", denom="USD"), OHLCAsset(name="MSFT", denom="USD")]
9696
9797
sr = StrategyRunner(
9898
# Data is provided as a pandas dataframe with two level

docs/yabte.backtest.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ Strategy
99
:members:
1010
:member-order: bysource
1111

12-
Order
12+
SimpleOrder
1313
-----
1414
.. autoclass:: yabte.backtest.order.OrderStatus
1515
:members:
@@ -39,7 +39,7 @@ Book
3939
:members:
4040
:member-order: bysource
4141

42-
Asset
42+
OHLCAsset
4343
-----
4444

4545
.. automodule:: yabte.backtest.asset

notebooks/Delta_Hedging.ipynb

Lines changed: 696 additions & 647 deletions
Large diffs are not rendered by default.

notebooks/Portfolio_Optimization.ipynb

Lines changed: 48 additions & 35 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)