From 7d2616835962ffb1dfde58fb9031b61c924cb6af Mon Sep 17 00:00:00 2001 From: Eddie Hebert Date: Mon, 10 Jun 2013 15:36:58 -0400 Subject: [PATCH] MAINT: Reduce number of parameters for create_transaction. create_transaction accepted both sid and order, which in all cases was derived from the current event, so remove `sid` and `order`, replacing them with event If there is a scenario where sid and order need to be set independently of each other, then the underlying Transaction object can be called directly. Looking towards making writing custom slippage models slightly easier by removing the redundancy. --- tests/test_perf_tracking.py | 40 ++++++++++++++++++------------------- zipline/finance/slippage.py | 14 +++++-------- 2 files changed, 24 insertions(+), 30 deletions(-) diff --git a/tests/test_perf_tracking.py b/tests/test_perf_tracking.py index e2ae3a4d..659e9677 100644 --- a/tests/test_perf_tracking.py +++ b/tests/test_perf_tracking.py @@ -41,8 +41,8 @@ oneday = datetime.timedelta(days=1) tradingday = datetime.timedelta(hours=6, minutes=30) -def create_txn(sid, price, amount, dt): - return create_transaction(sid, amount, price, dt, "fakeuid") +def create_txn(event, price, amount): + return create_transaction(event, amount, price, "fakeuid") def benchmark_events_in_range(sim_params): @@ -130,7 +130,7 @@ class TestDividendPerformance(unittest.TestCase): events[2].dt ) - txn = create_txn(1, 10.0, 100, events[0].dt) + txn = create_txn(events[0], 10.0, 100) events.insert(0, txn) events.insert(1, dividend) results = calculate_results(self, events) @@ -169,7 +169,7 @@ class TestDividendPerformance(unittest.TestCase): ) events.insert(1, dividend) - txn = create_txn(1, 10.0, 100, events[3].dt) + txn = create_txn(events[3], 10.0, 100) events.insert(4, txn) results = calculate_results(self, events) @@ -203,9 +203,9 @@ class TestDividendPerformance(unittest.TestCase): events[3].dt ) - buy_txn = create_txn(1, 10.0, 100, events[0].dt) + buy_txn = create_txn(events[0], 10.0, 100) events.insert(1, buy_txn) - sell_txn = create_txn(1, 10.0, -100, events[3].dt) + sell_txn = create_txn(events[3], 10.0, -100) events.insert(4, sell_txn) events.insert(0, dividend) results = calculate_results(self, events) @@ -240,9 +240,9 @@ class TestDividendPerformance(unittest.TestCase): events[5].dt ) - buy_txn = create_txn(1, 10.0, 100, events[1].dt) + buy_txn = create_txn(events[1], 10.0, 100) events.insert(1, buy_txn) - sell_txn = create_txn(1, 10.0, -100, events[3].dt) + sell_txn = create_txn(events[3], 10.0, -100) events.insert(3, sell_txn) events.insert(1, dividend) results = calculate_results(self, events) @@ -281,7 +281,7 @@ class TestDividendPerformance(unittest.TestCase): pay_date ) - buy_txn = create_txn(1, 10.0, 100, events[1].dt) + buy_txn = create_txn(events[1], 10.0, 100) events.insert(2, buy_txn) events.insert(1, dividend) results = calculate_results(self, events) @@ -321,7 +321,7 @@ class TestDividendPerformance(unittest.TestCase): events[3].dt ) - txn = create_txn(1, 10.0, -100, events[1].dt) + txn = create_txn(events[1], 10.0, -100) events.insert(1, txn) events.insert(0, dividend) results = calculate_results(self, events) @@ -411,7 +411,7 @@ class TestPositionPerformance(unittest.TestCase): self.sim_params ) - txn = create_txn(1, 10.0, 100, self.dt + onesec) + txn = create_txn(trades[1], 10.0, 100) pp = perf.PerformancePeriod(1000.0) pp.execute_transaction(txn) @@ -482,7 +482,7 @@ single short-sale transaction""" trades_1 = trades[:-2] - txn = create_txn(1, 10.0, -100, self.dt + onesec) + txn = create_txn(trades[1], 10.0, -100) pp = perf.PerformancePeriod(1000.0) pp.execute_transaction(txn) @@ -671,13 +671,12 @@ trade after cover""" ) short_txn = create_txn( - 1, + trades[1], 10.0, -100, - self.dt + onesec ) - cover_txn = create_txn(1, 7.0, 100, self.dt + onesec * 6) + cover_txn = create_txn(trades[6], 7.0, 100) pp = perf.PerformancePeriod(1000.0) pp.execute_transaction(short_txn) @@ -785,18 +784,17 @@ shares in position" 400 ) - saleTxn = create_txn( - 1, - 10.0, - -100, - self.dt + onesec * 4) - down_tick = factory.create_trade( 1, 10.0, 100, trades[-1].dt + onesec) + saleTxn = create_txn( + down_tick, + 10.0, + -100) + pp.rollover() pp.execute_transaction(saleTxn) diff --git a/zipline/finance/slippage.py b/zipline/finance/slippage.py index b93b64f6..f8ed0f13 100644 --- a/zipline/finance/slippage.py +++ b/zipline/finance/slippage.py @@ -14,7 +14,6 @@ # limitations under the License. import abc -import pytz import math from copy import copy @@ -100,12 +99,12 @@ class Transaction(object): return py -def create_transaction(sid, amount, price, dt, order_id): +def create_transaction(event, amount, price, order_id): txn = { - 'sid': sid, + 'sid': event.sid, 'amount': int(amount), - 'dt': dt, + 'dt': event.dt, 'price': price, 'order_id': order_id } @@ -146,7 +145,6 @@ class VolumeShareSlippage(SlippageModel): def simulate(self, event, current_orders): - dt = event.dt simulated_impact = 0.0 max_volume = self.volume_limit * event.volume total_volume = 0 @@ -190,12 +188,11 @@ class VolumeShareSlippage(SlippageModel): if order.direction * cur_amount > 0: txn = create_transaction( - event.sid, + event, cur_amount, # In the future, we may want to change the next line # for limit pricing event.price + simulated_impact, - dt.replace(tzinfo=pytz.utc), order.id ) @@ -230,10 +227,9 @@ class FixedSlippage(SlippageModel): return txns txn = create_transaction( - event.sid, + event, order.amount, event.price + (self.spread / 2.0 * order.direction), - event.dt.replace(tzinfo=pytz.utc), order.id )