ENH: Adds ExchangeCalendar, TradingSchedule, and implementations

Conflicts:
	tests/data/test_minute_bars.py
	tests/data/test_us_equity_pricing.py
	tests/finance/test_slippage.py
	tests/pipeline/test_engine.py
	tests/pipeline/test_us_equity_pricing_loader.py
	tests/serialization_cases.py
	tests/test_algorithm.py
	tests/test_assets.py
	tests/test_bar_data.py
	tests/test_benchmark.py
	tests/test_exception_handling.py
	tests/test_fetcher.py
	tests/test_finance.py
	tests/test_history.py
	tests/test_perf_tracking.py
	tests/test_security_list.py
	tests/utils/test_events.py
	zipline/algorithm.py
	zipline/data/data_portal.py
	zipline/data/us_equity_loader.py
	zipline/errors.py
	zipline/finance/trading.py
	zipline/testing/core.py
	zipline/utils/events.py
This commit is contained in:
jfkirk
2016-06-08 13:34:18 -04:00
committed by Jean Bredeche
parent c9b5979f45
commit c8304e8601
46 changed files with 9709 additions and 1137 deletions
+68 -41
View File
@@ -59,6 +59,7 @@ from zipline.testing.fixtures import (
WithTradingEnvironment,
ZiplineTestCase,
)
from zipline.utils.calendars import default_nyse_schedule
logger = logging.getLogger('Test Perf Tracking')
@@ -175,7 +176,9 @@ def calculate_results(sim_params,
splits = splits or {}
commissions = commissions or {}
perf_tracker = perf.PerformanceTracker(sim_params, env)
perf_tracker = perf.PerformanceTracker(sim_params,
default_nyse_schedule,
env)
results = []
@@ -240,7 +243,9 @@ def setup_env_data(env, sim_params, sids, futures_sids=[]):
for sid in sids:
data[sid] = {
"start_date": sim_params.trading_days[0],
"end_date": env.next_trading_day(sim_params.trading_days[-1])
"end_date": default_nyse_schedule.next_execution_day(
sim_params.trading_days[-1]
)
}
env.write_data(equities_data=data)
@@ -249,7 +254,9 @@ def setup_env_data(env, sim_params, sids, futures_sids=[]):
for future_sid in futures_sids:
futures_data[future_sid] = {
"start_date": sim_params.trading_days[0],
"end_date": env.next_trading_day(sim_params.trading_days[-1]),
"end_date": default_nyse_schedule.next_execution_day(
sim_params.trading_days[-1]
),
"multiplier": 100
}
@@ -271,7 +278,9 @@ class TestSplitPerformance(WithSimParams, WithTmpDir, ZiplineTestCase):
def test_multiple_splits(self):
# if multiple positions all have splits at the same time, verify that
# the total leftover cash is correct
perf_tracker = perf.PerformanceTracker(self.sim_params, self.env)
perf_tracker = perf.PerformanceTracker(self.sim_params,
default_nyse_schedule,
self.env)
asset1 = self.asset_finder.retrieve_asset(1)
asset2 = self.asset_finder.retrieve_asset(2)
@@ -300,13 +309,14 @@ class TestSplitPerformance(WithSimParams, WithTmpDir, ZiplineTestCase):
[100, 100],
oneday,
self.sim_params,
env=self.env
trading_schedule=default_nyse_schedule,
)
# set up a long position in sid 1
# 100 shares at $20 apiece = $2000 position
data_portal = create_data_portal_from_trade_history(
self.env,
default_nyse_schedule,
self.tmpdir,
self.sim_params,
{1: events},
@@ -411,7 +421,7 @@ class TestDividendPerformance(WithSimParams,
after = factory.get_next_trading_dt(
before,
timedelta(days=1),
self.env,
default_nyse_schedule,
)
self.assertEqual(after.hour, 13)
@@ -423,7 +433,7 @@ class TestDividendPerformance(WithSimParams,
[100, 100, 100, 100, 100, 100],
oneday,
self.sim_params,
env=self.env
trading_schedule=default_nyse_schedule,
)
dbpath = self.instance_tmpdir.getpath('adjustments.sqlite')
@@ -431,7 +441,7 @@ class TestDividendPerformance(WithSimParams,
writer = SQLiteAdjustmentWriter(
dbpath,
MockDailyBarReader(),
self.env.trading_days,
default_nyse_schedule.all_execution_days,
)
splits = mergers = create_empty_splits_mergers_frame()
dividends = pd.DataFrame({
@@ -446,6 +456,7 @@ class TestDividendPerformance(WithSimParams,
adjustment_reader = SQLiteAdjustmentReader(dbpath)
data_portal = create_data_portal_from_trade_history(
self.env,
default_nyse_schedule,
self.instance_tmpdir,
self.sim_params,
{1: events},
@@ -488,7 +499,7 @@ class TestDividendPerformance(WithSimParams,
[100, 100, 100, 100, 100, 100],
oneday,
self.sim_params,
env=self.env
trading_schedule=default_nyse_schedule,
)
dbpath = self.instance_tmpdir.getpath('adjustments.sqlite')
@@ -496,7 +507,7 @@ class TestDividendPerformance(WithSimParams,
writer = SQLiteAdjustmentWriter(
dbpath,
MockDailyBarReader(),
self.env.trading_days,
default_nyse_schedule.all_execution_days,
)
splits = mergers = create_empty_splits_mergers_frame()
dividends = pd.DataFrame({
@@ -522,6 +533,7 @@ class TestDividendPerformance(WithSimParams,
data_portal = create_data_portal_from_trade_history(
self.env,
default_nyse_schedule,
self.instance_tmpdir,
self.sim_params,
events,
@@ -562,7 +574,7 @@ class TestDividendPerformance(WithSimParams,
[100, 100, 100, 100, 100, 100],
oneday,
self.sim_params,
env=self.env
trading_schedule=default_nyse_schedule,
)
dbpath = self.instance_tmpdir.getpath('adjustments.sqlite')
@@ -570,7 +582,7 @@ class TestDividendPerformance(WithSimParams,
writer = SQLiteAdjustmentWriter(
dbpath,
MockDailyBarReader(),
self.env.trading_days,
default_nyse_schedule.all_execution_days,
)
splits = mergers = create_empty_splits_mergers_frame()
dividends = pd.DataFrame({
@@ -586,6 +598,7 @@ class TestDividendPerformance(WithSimParams,
data_portal = create_data_portal_from_trade_history(
self.env,
default_nyse_schedule,
self.instance_tmpdir,
self.sim_params,
{1: events},
@@ -623,7 +636,7 @@ class TestDividendPerformance(WithSimParams,
[100, 100, 100, 100, 100, 100],
oneday,
self.sim_params,
env=self.env
trading_schedule=default_nyse_schedule,
)
dbpath = self.instance_tmpdir.getpath('adjustments.sqlite')
@@ -631,7 +644,7 @@ class TestDividendPerformance(WithSimParams,
writer = SQLiteAdjustmentWriter(
dbpath,
MockDailyBarReader(),
self.env.trading_days,
default_nyse_schedule.all_execution_days,
)
splits = mergers = create_empty_splits_mergers_frame()
dividends = pd.DataFrame({
@@ -647,6 +660,7 @@ class TestDividendPerformance(WithSimParams,
data_portal = create_data_portal_from_trade_history(
self.env,
default_nyse_schedule,
self.instance_tmpdir,
self.sim_params,
{1: events},
@@ -685,14 +699,14 @@ class TestDividendPerformance(WithSimParams,
[100, 100, 100, 100, 100, 100],
oneday,
self.sim_params,
env=self.env
trading_schedule=default_nyse_schedule,
)
dbpath = self.instance_tmpdir.getpath('adjustments.sqlite')
writer = SQLiteAdjustmentWriter(
dbpath,
MockDailyBarReader(),
self.env.trading_days,
default_nyse_schedule.all_execution_days,
)
splits = mergers = create_empty_splits_mergers_frame()
@@ -709,6 +723,7 @@ class TestDividendPerformance(WithSimParams,
data_portal = create_data_portal_from_trade_history(
self.env,
default_nyse_schedule,
self.instance_tmpdir,
self.sim_params,
{1: events},
@@ -745,20 +760,21 @@ class TestDividendPerformance(WithSimParams,
[100, 100, 100, 100, 100, 100],
oneday,
self.sim_params,
env=self.env
trading_schedule=default_nyse_schedule,
)
pay_date = self.sim_params.first_open
# find pay date that is much later.
for i in range(30):
pay_date = factory.get_next_trading_dt(pay_date, oneday, self.env)
pay_date = factory.get_next_trading_dt(pay_date, oneday,
default_nyse_schedule)
dbpath = self.instance_tmpdir.getpath('adjustments.sqlite')
writer = SQLiteAdjustmentWriter(
dbpath,
MockDailyBarReader(),
self.env.trading_days,
default_nyse_schedule.all_execution_days,
)
splits = mergers = create_empty_splits_mergers_frame()
dividends = pd.DataFrame({
@@ -774,6 +790,7 @@ class TestDividendPerformance(WithSimParams,
data_portal = create_data_portal_from_trade_history(
self.env,
default_nyse_schedule,
self.instance_tmpdir,
self.sim_params,
{1: events},
@@ -811,7 +828,7 @@ class TestDividendPerformance(WithSimParams,
[100, 100, 100, 100, 100, 100],
oneday,
self.sim_params,
env=self.env
trading_schedule=default_nyse_schedule,
)
dbpath = self.instance_tmpdir.getpath('adjustments.sqlite')
@@ -819,7 +836,7 @@ class TestDividendPerformance(WithSimParams,
writer = SQLiteAdjustmentWriter(
dbpath,
MockDailyBarReader(),
self.env.trading_days,
default_nyse_schedule.all_execution_days,
)
splits = mergers = create_empty_splits_mergers_frame()
dividends = pd.DataFrame({
@@ -835,6 +852,7 @@ class TestDividendPerformance(WithSimParams,
data_portal = create_data_portal_from_trade_history(
self.env,
default_nyse_schedule,
self.instance_tmpdir,
self.sim_params,
{1: events},
@@ -869,7 +887,7 @@ class TestDividendPerformance(WithSimParams,
[100, 100, 100, 100, 100, 100],
oneday,
self.sim_params,
env=self.env
trading_schedule=default_nyse_schedule,
)
dbpath = self.instance_tmpdir.getpath('adjustments.sqlite')
@@ -877,7 +895,7 @@ class TestDividendPerformance(WithSimParams,
writer = SQLiteAdjustmentWriter(
dbpath,
MockDailyBarReader(),
self.env.trading_days,
default_nyse_schedule.all_execution_days,
)
splits = mergers = create_empty_splits_mergers_frame()
dividends = pd.DataFrame({
@@ -893,6 +911,7 @@ class TestDividendPerformance(WithSimParams,
data_portal = create_data_portal_from_trade_history(
self.env,
default_nyse_schedule,
self.instance_tmpdir,
self.sim_params,
{1: events},
@@ -925,7 +944,7 @@ class TestDividendPerformance(WithSimParams,
[100, 100, 100, 100, 100],
oneday,
self.sim_params,
env=self.env
trading_schedule=default_nyse_schedule,
)
dbpath = self.instance_tmpdir.getpath('adjustments.sqlite')
@@ -933,7 +952,7 @@ class TestDividendPerformance(WithSimParams,
writer = SQLiteAdjustmentWriter(
dbpath,
MockDailyBarReader(),
self.env.trading_days,
default_nyse_schedule.all_execution_days,
)
splits = mergers = create_empty_splits_mergers_frame()
dividends = pd.DataFrame({
@@ -942,8 +961,9 @@ class TestDividendPerformance(WithSimParams,
'declared_date': np.array([events[-3].dt], dtype='datetime64[ns]'),
'ex_date': np.array([events[-2].dt], dtype='datetime64[ns]'),
'record_date': np.array([events[0].dt], dtype='datetime64[ns]'),
'pay_date': np.array([self.env.next_trading_day(events[-1].dt)],
dtype='datetime64[ns]'),
'pay_date': np.array(
[default_nyse_schedule.next_execution_day(events[-1].dt)],
dtype='datetime64[ns]'),
})
writer.write(splits, mergers, dividends)
adjustment_reader = SQLiteAdjustmentReader(dbpath)
@@ -957,10 +977,11 @@ class TestDividendPerformance(WithSimParams,
)
sim_params.period_end = events[-1].dt
sim_params.update_internal_from_env(self.env)
sim_params.update_internal_from_trading_schedule(default_nyse_schedule)
data_portal = create_data_portal_from_trade_history(
self.env,
default_nyse_schedule,
self.instance_tmpdir,
sim_params,
{1: events},
@@ -1049,7 +1070,7 @@ class TestPositionPerformance(WithInstanceTmpDir, ZiplineTestCase):
[100, 100, 100, 100],
oneday,
self.sim_params,
env=self.env
trading_schedule=default_nyse_schedule,
)
trades_2 = factory.create_trade_history(
@@ -1058,11 +1079,12 @@ class TestPositionPerformance(WithInstanceTmpDir, ZiplineTestCase):
[100, 100, 100, 100],
oneday,
self.sim_params,
env=self.env
trading_schedule=default_nyse_schedule,
)
data_portal = create_data_portal_from_trade_history(
self.env,
default_nyse_schedule,
self.instance_tmpdir,
self.sim_params,
{1: trades_1, 2: trades_2}
@@ -1154,11 +1176,12 @@ class TestPositionPerformance(WithInstanceTmpDir, ZiplineTestCase):
[100, 100, 100, 100],
oneday,
self.sim_params,
env=self.env
trading_schedule=default_nyse_schedule,
)
data_portal = create_data_portal_from_trade_history(
self.env,
default_nyse_schedule,
self.instance_tmpdir,
self.sim_params,
{1: trades})
@@ -1245,11 +1268,12 @@ class TestPositionPerformance(WithInstanceTmpDir, ZiplineTestCase):
[100, 100, 100, 100],
oneday,
self.sim_params,
env=self.env
trading_schedule=default_nyse_schedule,
)
data_portal = create_data_portal_from_trade_history(
self.env,
default_nyse_schedule,
self.instance_tmpdir,
self.sim_params,
{1: trades})
@@ -1360,13 +1384,14 @@ single short-sale transaction"""
[100, 100, 100, 100, 100, 100],
oneday,
self.sim_params,
env=self.env
trading_schedule=default_nyse_schedule,
)
trades_1 = trades[:-2]
data_portal = create_data_portal_from_trade_history(
self.env,
default_nyse_schedule,
self.instance_tmpdir,
self.sim_params,
{1: trades})
@@ -1593,11 +1618,12 @@ cost of sole txn in test"
[100, 100, 100, 100],
oneday,
sim_params,
env=self.env
trading_schedule=default_nyse_schedule,
)
data_portal = create_data_portal_from_trade_history(
self.env,
default_nyse_schedule,
self.instance_tmpdir,
self.sim_params,
{3: trades}
@@ -1712,11 +1738,12 @@ single short-sale transaction"""
[100, 100, 100, 100, 100, 100],
oneday,
self.sim_params,
env=self.env
trading_schedule=default_nyse_schedule,
)
data_portal = create_data_portal_from_trade_history(
self.env,
default_nyse_schedule,
self.instance_tmpdir,
self.sim_params,
{3: trades}
@@ -1956,11 +1983,12 @@ trade after cover"""
[100, 100, 100, 100, 100, 100, 100, 100, 100, 100],
oneday,
self.sim_params,
env=self.env
trading_schedule=default_nyse_schedule,
)
data_portal = create_data_portal_from_trade_history(
self.env,
default_nyse_schedule,
self.instance_tmpdir,
self.sim_params,
{1: trades})
@@ -2042,13 +2070,14 @@ shares in position"
[100, 100, 100, 100, 100],
oneday,
self.sim_params,
self.env
default_nyse_schedule,
)
trades = factory.create_trade_history(*history_args)
transactions = factory.create_txn_history(*history_args)[:4]
data_portal = create_data_portal_from_trade_history(
self.env,
default_nyse_schedule,
self.instance_tmpdir,
self.sim_params,
{1: trades})
@@ -2167,7 +2196,7 @@ shares in position"
[200, -100, -100, 100, -300, 100, 500, 400],
oneday,
self.sim_params,
self.env
default_nyse_schedule,
)
cost_bases = [10, 10, 0, 8, 9, 9, 13, 13.5]
@@ -2318,9 +2347,7 @@ class TestPositionTracker(WithTradingEnvironment,
Originally this bug was due to np.dot([], []) returning
np.bool_(False)
"""
sim_params = factory.create_simulation_parameters(
num_days=4, env=self.env
)
sim_params = factory.create_simulation_parameters(num_days=4)
pt = perf.PositionTracker(self.env.asset_finder,
sim_params.data_frequency)