Skip to content

Commit

Permalink
check monotonicity of index (#70)
Browse files Browse the repository at this point in the history
Co-authored-by: Thomas Schmelzer <[email protected]>
  • Loading branch information
tschm and Thomas Schmelzer authored May 9, 2023
1 parent e616996 commit fc8dd4d
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 3 deletions.
10 changes: 8 additions & 2 deletions cvx/simulator/portfolio.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,14 @@ def update(self, position, model=None, **kwargs):

def build_portfolio(prices, stocks=None, initial_cash=1e6, trading_cost_model=None):
assert isinstance(prices, pd.DataFrame)
assert prices.index.is_monotonic_increasing
assert prices.index.is_unique

if stocks is None:
stocks = pd.DataFrame(index=prices.index, columns=prices.columns, data=0.0, dtype=float)
else:
assert stocks.index.is_monotonic_increasing
assert stocks.index.is_unique

assert set(stocks.index).issubset(set(prices.index))
assert set(stocks.columns).issubset(set(prices.columns))
Expand Down Expand Up @@ -159,7 +164,7 @@ def __mul__(self, scalar):
"""
Multiplies positions by a scalar
"""
return _EquityPortfolio(prices=self.prices, stocks=self.stocks * scalar)
return _EquityPortfolio(prices=self.prices, stocks=self.stocks * scalar, initial_cash=self.initial_cash * scalar, model=self.trading_cost_model)

def __add__(self, port_new):
"""
Expand Down Expand Up @@ -187,4 +192,5 @@ def __add__(self, port_new):
pd.testing.assert_frame_equal(prices_left, prices_right)

return build_portfolio(prices=prices_right, stocks=positions,
initial_cash=self.initial_cash + port_new.initial_cash)
initial_cash=self.initial_cash + port_new.initial_cash,
trading_cost_model=self.trading_cost_model)
41 changes: 40 additions & 1 deletion tests/test_portfolio.py
Original file line number Diff line number Diff line change
Expand Up @@ -199,4 +199,43 @@ def test_set_cashpositions(prices):

assert portfolio.nav.values[-1] == pytest.approx(49773.093729)

#portfolio[now] = portfolio[before]
#portfolio[now] = portfolio[before]

def test_duplicates():
"""
duplicate in index
"""
prices = pd.DataFrame(index=[1, 1], columns=["A"])
with pytest.raises(AssertionError):
build_portfolio(prices=prices)

prices = pd.DataFrame(index=[1], columns=["A"])
position = pd.DataFrame(index=[1, 1], columns=["A"])

with pytest.raises(AssertionError):
build_portfolio(prices=prices, stocks=position)


def test_monotonic():
"""
index not increasing
"""
prices = pd.DataFrame(index=[2, 1], columns=["A"])
with pytest.raises(AssertionError):
build_portfolio(prices=prices)

def test_portfolio(prices):
"""
build portfolio from price
"""
portfolio = build_portfolio(prices=prices)
pd.testing.assert_frame_equal(portfolio.prices, prices.ffill())

for t in portfolio.index:
# set the position
portfolio[t] = pd.Series(index=prices.keys(), data=1000.0)

pd.testing.assert_frame_equal(
portfolio.stocks,
pd.DataFrame(index=prices.index, columns=prices.keys(), data=1000.0),
)

0 comments on commit fc8dd4d

Please sign in to comment.