Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def test_position_representation():
"""
Tests that the Position representation
correctly recreates the object.
"""
asset = Equity('Apple, Inc.', 'AAPL')
position = Position(
asset, quantity=153,
book_cost_pu=950.0,
current_price=950.0
)
exp_repr = (
"Position(asset=Equity(name='Apple, Inc.', symbol='AAPL', tax_exempt=True), "
"quantity=153, book_cost_pu=950.0, current_price=950.0)"
)
assert repr(position) == exp_repr
def test_position_long_short_negative_gain():
"""
Tests that the quantity and book cost are
correctly calculated for an initial long
position with an additional short transaction
in the same asset, where the short does not
completely eliminate the position and the
result is a loss.
"""
asset = Equity('Apple, Inc.', 'AAPL')
position = Position(
asset,
quantity=100,
book_cost_pu=960.0,
current_price=950.0
)
dt = pd.Timestamp('2015-05-06')
transaction = Transaction(
asset,
quantity=-50,
dt=dt,
price=950.0,
order_id=123,
commission=None
)
position.update(transaction)
def test_position_short_goes_to_half():
"""
Tests that the quantity and book cost are
correctly calculated for an initial short
position, where the share value goes to zero.
This should be a percentage gain of 100%.
"""
asset = Equity('Apple, Inc.', 'AAPL')
position = Position(
asset, quantity=-100, book_cost_pu=50.0,
current_price=50.0
)
dt = pd.Timestamp('2015-05-06')
position.current_price = 25.0
position.current_trade_date = dt
assert position.quantity == -100
assert position.book_cost_pu == 50.0
assert position.direction == -1.0
assert position.current_price == 25.0
assert position.market_value == -2500.0
assert position.unrealised_gain == 2500.0
assert position.unrealised_percentage_gain == 50.0
def test_position_long_close():
"""
Tests that the quantity and book cost are
correctly calculated for an initial long
position with an additional short transaction
in the same asset, where the short closes
the position.
"""
asset = Equity('Apple, Inc.', 'AAPL')
position = Position(
asset,
quantity=100,
book_cost_pu=950.0,
current_price=950.0
)
dt = pd.Timestamp('2015-05-06')
transaction = Transaction(
asset, quantity=-100, dt=dt, price=960.0,
order_id=123, commission=None
)
position.update(transaction)
assert position.quantity == 0
assert position.book_cost_pu == 0.0
assert position.direction == 1.0
def test_update_for_incorrect_asset():
"""
Tests that the 'update' method, when provided
with a transaction with an asset that does not
match the position's asset, raises an Exception.
"""
asset1 = Equity('Apple, Inc.', 'AAPL')
asset2 = Equity('Amazon, Inc.', 'AMZN')
position = Position(
asset1, quantity=100, book_cost_pu=950.0,
current_price=950.0
)
dt = pd.Timestamp('2015-05-06')
transaction = Transaction(
asset2, quantity=50, dt=dt, price=960.0,
order_id=123, commission=None
)
with pytest.raises(Exception):
position.update(transaction)
def test_position_short_long_excess_cover():
"""
Tests that the quantity and book cost are
correctly calculated for an initial short
position with an additional long transaction
in the same asset, where the long position
is in excess of the short position.
"""
asset = Equity('Apple, Inc.', 'AAPL')
position = Position(
asset, quantity=-100, book_cost_pu=700.0,
current_price=700.0
)
dt = pd.Timestamp('2015-05-06')
transaction = Transaction(
asset, quantity=175, dt=dt, price=873.0,
order_id=123, commission=None
)
position.update(transaction)
assert position.quantity == 75
assert position.book_cost_pu == 873.0
assert position.direction == 1.0
assert position.current_price == 873.0
assert position.market_value == 65475.0
assert position.unrealised_gain == 0.0
def test_update_book_cost_for_commission_for_no_commission():
"""
Tests that 'update_book_cost_for_commission' returns None
when zero or None commission is provided.
"""
asset = Equity('Apple, Inc.', 'AAPL')
position = Position(
asset, quantity=100, book_cost_pu=950.0,
current_price=950.0
)
assert position.update_book_cost_for_commission(asset, 0.0) is None
assert position.update_book_cost_for_commission(asset, None) is None
def test_position_short_goes_to_zero():
"""
Tests that the quantity and book cost are
correctly calculated for an initial short
position, where the share value goes to zero.
This should be a percentage gain of 100%.
"""
asset = Equity('Apple, Inc.', 'AAPL')
position = Position(
asset, quantity=-100, book_cost_pu=50.0,
current_price=50.0
)
dt = pd.Timestamp('2015-05-06')
position.current_price = 0.0
position.current_trade_date = dt
assert position.quantity == -100
assert position.book_cost_pu == 50.0
assert position.direction == -1.0
assert position.current_price == 0.0
assert position.market_value == 0.0
assert position.unrealised_gain == 5000.0
assert position.unrealised_percentage_gain == 100.0
def _check_set_position(self, asset):
"""
Checks if a position exists in the positions list
and if not creates a new key, and Position instance
for this particular asset.
"""
if asset in self.positions:
position = self.positions[asset]
else:
position = Position(asset)
self.positions[asset] = position
return position