mirror of
https://github.com/wassname/catalyst.git
synced 2026-06-27 20:36:38 +08:00
MAINT: Rename ALL the things.
zipline.modelling.* -> zipline.pipeline.* zipline.data.ffc.loaders -> zipline.pipeline.loaders tests/modelling -> tests/pipeline
This commit is contained in:
@@ -34,13 +34,13 @@ bottleneck==1.0.0
|
||||
|
||||
contextlib2==0.4.0
|
||||
|
||||
# Graph algorithms used by zipline.modelling
|
||||
# Graph algorithms used by zipline.pipeline
|
||||
networkx==1.9.1
|
||||
|
||||
# NumericalExpression modelling terms.
|
||||
# NumericalExpression pipeline terms.
|
||||
numexpr==2.4.3
|
||||
|
||||
# On disk storage format for modelling data.
|
||||
# On disk storage format for pipeline data.
|
||||
bcolz==0.10.0
|
||||
|
||||
# Command line interface helper
|
||||
|
||||
@@ -64,12 +64,12 @@ ext_modules = LazyCythonizingList([
|
||||
('zipline.lib.adjustment', ['zipline/lib/adjustment.pyx']),
|
||||
('zipline.lib.rank', ['zipline/lib/rank.pyx']),
|
||||
(
|
||||
'zipline.data.ffc.loaders._equities',
|
||||
['zipline/data/ffc/loaders/_equities.pyx'],
|
||||
'zipline.pipeline.loaders._equities',
|
||||
['zipline/pipeline/loaders/_equities.pyx'],
|
||||
),
|
||||
(
|
||||
'zipline.data.ffc.loaders._adjustments',
|
||||
['zipline/data/ffc/loaders/_adjustments.pyx'],
|
||||
'zipline.pipeline.loaders._adjustments',
|
||||
['zipline/pipeline/loaders/_adjustments.pyx'],
|
||||
),
|
||||
])
|
||||
|
||||
|
||||
@@ -9,8 +9,8 @@ from pandas import date_range, Int64Index, DataFrame
|
||||
from six import iteritems
|
||||
|
||||
from zipline.finance.trading import TradingEnvironment
|
||||
from zipline.modelling.engine import SimpleFFCEngine
|
||||
from zipline.modelling.term import AssetExists
|
||||
from zipline.pipeline.engine import SimpleFFCEngine
|
||||
from zipline.pipeline.term import AssetExists
|
||||
from zipline.utils.pandas_utils import explode
|
||||
from zipline.utils.test_utils import make_simple_asset_info, ExplodingObject
|
||||
from zipline.utils.tradingcalendar import trading_day
|
||||
@@ -24,29 +24,26 @@ from pandas import (
|
||||
from pandas.util.testing import assert_frame_equal
|
||||
from testfixtures import TempDirectory
|
||||
|
||||
from zipline.data.equities import USEquityPricing
|
||||
from zipline.data.ffc.synthetic import (
|
||||
from zipline.pipeline.loaders.synthetic import (
|
||||
ConstantLoader,
|
||||
MultiColumnLoader,
|
||||
NullAdjustmentReader,
|
||||
SyntheticDailyBarWriter,
|
||||
)
|
||||
from zipline.data.ffc.frame import (
|
||||
DataFrameFFCLoader,
|
||||
MULTIPLY,
|
||||
)
|
||||
from zipline.data.ffc.loaders.us_equity_pricing import (
|
||||
from zipline.finance.trading import TradingEnvironment
|
||||
from zipline.pipeline import Pipeline
|
||||
from zipline.pipeline.data import USEquityPricing
|
||||
from zipline.pipeline.loaders.frame import DataFrameFFCLoader, MULTIPLY
|
||||
from zipline.pipeline.loaders.equity_pricing_loader import (
|
||||
BcolzDailyBarReader,
|
||||
USEquityPricingLoader,
|
||||
)
|
||||
from zipline.finance.trading import TradingEnvironment
|
||||
from zipline.modelling.engine import SimpleFFCEngine
|
||||
from zipline.modelling.factor import CustomFactor
|
||||
from zipline.modelling.factor.technical import (
|
||||
from zipline.pipeline.engine import SimpleFFCEngine
|
||||
from zipline.pipeline.factor import CustomFactor
|
||||
from zipline.pipeline.factor.technical import (
|
||||
MaxDrawdown,
|
||||
SimpleMovingAverage,
|
||||
)
|
||||
from zipline.modelling.pipeline import Pipeline
|
||||
from zipline.utils.memoize import lazyval
|
||||
from zipline.utils.test_utils import (
|
||||
make_rotating_asset_info,
|
||||
@@ -3,9 +3,7 @@ Tests for Factor terms.
|
||||
"""
|
||||
from numpy import array, eye, nan, ones
|
||||
from zipline.errors import UnknownRankMethod
|
||||
from zipline.modelling.factor import Factor
|
||||
from zipline.modelling.filter import Filter
|
||||
from zipline.modelling.graph import TermGraph
|
||||
from zipline.pipeline import Factor, Filter, TermGraph
|
||||
from zipline.utils.test_utils import check_arrays
|
||||
|
||||
from .base import BaseFFCTestCase
|
||||
@@ -20,9 +20,7 @@ from numpy import (
|
||||
from numpy.random import randn, seed as random_seed
|
||||
|
||||
from zipline.errors import BadPercentileBounds
|
||||
from zipline.modelling.filter import Filter
|
||||
from zipline.modelling.factor import Factor
|
||||
from zipline.modelling.graph import TermGraph
|
||||
from zipline.pipeline import Filter, Factor, TermGraph
|
||||
from zipline.utils.test_utils import check_arrays
|
||||
|
||||
from .base import BaseFFCTestCase, with_default_shape
|
||||
@@ -1,5 +1,5 @@
|
||||
"""
|
||||
Tests for zipline.data.ffc.frame.DataFrameFFCLoader
|
||||
Tests for zipline.pipeline.loaders.frame.DataFrameFFCLoader.
|
||||
"""
|
||||
from unittest import TestCase
|
||||
|
||||
@@ -17,8 +17,8 @@ from zipline.lib.adjustment import (
|
||||
Float64Multiply,
|
||||
Float64Overwrite,
|
||||
)
|
||||
from zipline.data.equities import USEquityPricing
|
||||
from zipline.data.ffc.frame import (
|
||||
from zipline.pipeline.data import USEquityPricing
|
||||
from zipline.pipeline.loaders.frame import (
|
||||
ADD,
|
||||
DataFrameFFCLoader,
|
||||
MULTIPLY,
|
||||
@@ -205,7 +205,7 @@ class DataFrameFFCLoaderTestCase(TestCase):
|
||||
self.assertEqual(formatted_adjustments, expected_formatted_adjustments)
|
||||
|
||||
mask = self.mask[dates_slice, sids_slice]
|
||||
with patch('zipline.data.ffc.frame.adjusted_array') as m:
|
||||
with patch('zipline.pipeline.loaders.frame.adjusted_array') as m:
|
||||
loader.load_adjusted_array(
|
||||
columns=[USEquityPricing.close],
|
||||
dates=self.dates[dates_slice],
|
||||
+3
-2
@@ -24,11 +24,12 @@ from pandas import (
|
||||
Int64Index,
|
||||
)
|
||||
|
||||
from zipline.modelling.expression import (
|
||||
from zipline.pipeline import Factor
|
||||
from zipline.pipeline.expression import (
|
||||
NumericalExpression,
|
||||
NUMEXPR_MATH_FUNCS,
|
||||
)
|
||||
from zipline.modelling.factor import Factor
|
||||
|
||||
from zipline.utils.test_utils import check_arrays
|
||||
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
"""
|
||||
Tests for zipline.modelling.pipeline.Pipeline
|
||||
Tests for zipline.pipeline.Pipeline
|
||||
"""
|
||||
from unittest import TestCase
|
||||
|
||||
from zipline.data.equities import USEquityPricing
|
||||
from zipline.modelling.pipeline import Pipeline
|
||||
from zipline.modelling.factor import Factor
|
||||
from zipline.modelling.filter import Filter
|
||||
from zipline.pipeline import Factor, Filter, Pipeline
|
||||
from zipline.pipeline.data import USEquityPricing
|
||||
|
||||
|
||||
class SomeFactor(Factor):
|
||||
@@ -35,24 +35,23 @@ from zipline.api import (
|
||||
drain_pipeline,
|
||||
get_datetime,
|
||||
)
|
||||
from zipline.data.equities import USEquityPricing
|
||||
from zipline.data.ffc.frame import DataFrameFFCLoader, MULTIPLY
|
||||
from zipline.data.ffc.loaders.us_equity_pricing import (
|
||||
BcolzDailyBarReader,
|
||||
DailyBarWriterFromCSVs,
|
||||
SQLiteAdjustmentReader,
|
||||
SQLiteAdjustmentWriter,
|
||||
USEquityPricingLoader,
|
||||
)
|
||||
from zipline.errors import (
|
||||
AttachPipelineAfterInitialize,
|
||||
DrainPipelineDuringInitialize,
|
||||
NoSuchPipeline,
|
||||
)
|
||||
from zipline.finance import trading
|
||||
|
||||
from zipline.modelling.factor.technical import VWAP
|
||||
from zipline.modelling.pipeline import Pipeline
|
||||
from zipline.pipeline import Pipeline
|
||||
from zipline.pipeline.factor.technical import VWAP
|
||||
from zipline.pipeline.data import USEquityPricing
|
||||
from zipline.pipeline.loaders.frame import DataFrameFFCLoader, MULTIPLY
|
||||
from zipline.pipeline.loaders.equity_pricing_loader import (
|
||||
BcolzDailyBarReader,
|
||||
DailyBarWriterFromCSVs,
|
||||
SQLiteAdjustmentReader,
|
||||
SQLiteAdjustmentWriter,
|
||||
USEquityPricingLoader,
|
||||
)
|
||||
from zipline.utils.test_utils import (
|
||||
make_simple_asset_info,
|
||||
str_to_seconds,
|
||||
@@ -66,7 +65,7 @@ from zipline.utils.tradingcalendar import (
|
||||
TEST_RESOURCE_PATH = join(
|
||||
dirname(dirname(realpath(__file__))), # zipline_repo/tests
|
||||
'resources',
|
||||
'modelling_inputs',
|
||||
'pipeline_inputs',
|
||||
)
|
||||
|
||||
|
||||
@@ -10,19 +10,15 @@ from numpy import (
|
||||
uint8,
|
||||
)
|
||||
|
||||
from zipline.data.dataset import (
|
||||
Column,
|
||||
DataSet,
|
||||
)
|
||||
from zipline.errors import (
|
||||
InputTermNotAtomic,
|
||||
TermInputsNotSpecified,
|
||||
WindowLengthNotSpecified,
|
||||
)
|
||||
from zipline.modelling.expression import NUMEXPR_MATH_FUNCS
|
||||
from zipline.modelling.factor import Factor
|
||||
from zipline.modelling.graph import TermGraph
|
||||
from zipline.modelling.term import AssetExists, NotSpecified
|
||||
from zipline.pipeline import Factor, TermGraph
|
||||
from zipline.pipeline.data import Column, DataSet
|
||||
from zipline.pipeline.term import AssetExists, NotSpecified
|
||||
from zipline.pipeline.expression import NUMEXPR_MATH_FUNCS
|
||||
|
||||
|
||||
class SomeDataSet(DataSet):
|
||||
+4
-4
@@ -13,7 +13,7 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
"""
|
||||
Tests for zipline.data.ffc.loaders.us_equity_pricing
|
||||
Tests for USEquityPricingLoader and related classes.
|
||||
"""
|
||||
from unittest import TestCase
|
||||
|
||||
@@ -40,12 +40,11 @@ from pandas.util.testing import assert_index_equal
|
||||
from testfixtures import TempDirectory
|
||||
|
||||
from zipline.lib.adjustment import Float64Multiply
|
||||
from zipline.data.equities import USEquityPricing
|
||||
from zipline.data.ffc.synthetic import (
|
||||
from zipline.pipeline.loaders.synthetic import (
|
||||
NullAdjustmentReader,
|
||||
SyntheticDailyBarWriter,
|
||||
)
|
||||
from zipline.data.ffc.loaders.us_equity_pricing import (
|
||||
from zipline.pipeline.loaders.equity_pricing_loader import (
|
||||
BcolzDailyBarReader,
|
||||
SQLiteAdjustmentReader,
|
||||
SQLiteAdjustmentWriter,
|
||||
@@ -53,6 +52,7 @@ from zipline.data.ffc.loaders.us_equity_pricing import (
|
||||
)
|
||||
from zipline.errors import WindowLengthTooLong
|
||||
from zipline.finance.trading import TradingEnvironment
|
||||
from zipline.pipeline.data import USEquityPricing
|
||||
from zipline.utils.test_utils import (
|
||||
seconds_to_timestamp,
|
||||
str_to_seconds,
|
||||
@@ -4,7 +4,7 @@ import doctest
|
||||
from unittest import TestCase
|
||||
|
||||
from zipline.lib import adjustment
|
||||
from zipline.modelling import (
|
||||
from zipline.pipeline import (
|
||||
engine,
|
||||
expression,
|
||||
)
|
||||
|
||||
@@ -74,7 +74,7 @@ from zipline.assets import Asset, Future
|
||||
from zipline.assets.futures import FutureChain
|
||||
from zipline.gens.composites import date_sorted_sources
|
||||
from zipline.gens.tradesimulation import AlgorithmSimulator
|
||||
from zipline.modelling.engine import (
|
||||
from zipline.pipeline.engine import (
|
||||
NoOpFFCEngine,
|
||||
SimpleFFCEngine,
|
||||
)
|
||||
@@ -229,7 +229,7 @@ class TradingAlgorithm(object):
|
||||
# Pull in the environment's new AssetFinder for quick reference
|
||||
self.asset_finder = self.trading_environment.asset_finder
|
||||
|
||||
# Initialize Modeling API data.
|
||||
# Initialize Pipeline API data.
|
||||
self.init_engine(kwargs.pop('ffc_loader', None))
|
||||
self._pipelines = []
|
||||
# Create an always-expired cache so that we compute the first time data
|
||||
@@ -1333,7 +1333,7 @@ class TradingAlgorithm(object):
|
||||
self.register_trading_control(LongOnly())
|
||||
|
||||
##############
|
||||
# Modeling API
|
||||
# Pipeline API
|
||||
##############
|
||||
@api_method
|
||||
@require_not_initialized(AttachPipelineAfterInitialize())
|
||||
@@ -1369,7 +1369,7 @@ class TradingAlgorithm(object):
|
||||
|
||||
See Also
|
||||
--------
|
||||
:meth:`zipline.modelling.FFCEngine.run_pipeline`
|
||||
:meth:`zipline.pipeline.engine.FFCEngine.run_pipeline`
|
||||
"""
|
||||
# NOTE: We don't currently support multiple pipelines, but we plan to
|
||||
# in the future.
|
||||
@@ -1441,7 +1441,7 @@ class TradingAlgorithm(object):
|
||||
self.engine.run_pipeline(pipeline, start_date, end_date), end_date
|
||||
|
||||
##################
|
||||
# End Modeling API
|
||||
# End Pipeline API
|
||||
##################
|
||||
|
||||
def current_universe(self):
|
||||
|
||||
@@ -627,7 +627,7 @@ class AssetFinder(object):
|
||||
See Also
|
||||
--------
|
||||
numpy.putmask
|
||||
zipline.modelling.engine.SimpleFFCEngine._compute_root_mask
|
||||
zipline.pipeline.engine.SimpleFFCEngine._compute_root_mask
|
||||
"""
|
||||
# This is a less than ideal place to do this, because if someone adds
|
||||
# assets to the finder after we've touched lifetimes we won't have
|
||||
|
||||
@@ -1,276 +0,0 @@
|
||||
#
|
||||
# Copyright 2015 Quantopian, Inc.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
from cpython cimport (
|
||||
PyDict_Contains,
|
||||
PySet_Add,
|
||||
)
|
||||
|
||||
from numpy import (
|
||||
uint32,
|
||||
zeros,
|
||||
)
|
||||
from pandas import Timestamp
|
||||
|
||||
ctypedef object Timestamp_t
|
||||
ctypedef object DatetimeIndex_t
|
||||
ctypedef object Int64Index_t
|
||||
|
||||
from zipline.lib.adjustment import Float64Multiply
|
||||
|
||||
_SID_QUERY_TEMPLATE = """
|
||||
SELECT DISTINCT sid FROM {0}
|
||||
WHERE effective_date >= ? AND effective_date <= ?
|
||||
"""
|
||||
cdef dict SID_QUERIES = {
|
||||
tablename: _SID_QUERY_TEMPLATE.format(tablename)
|
||||
for tablename in ('splits', 'dividends', 'mergers')
|
||||
}
|
||||
|
||||
ADJ_QUERY_TEMPLATE = """
|
||||
SELECT sid, ratio, effective_date
|
||||
FROM {0}
|
||||
WHERE sid IN ({1}) AND effective_date >= {2} AND effective_date <= {3}
|
||||
"""
|
||||
|
||||
cdef int SQLITE_MAX_IN_STATEMENT = 999
|
||||
EPOCH = Timestamp(0, tz='UTC')
|
||||
|
||||
cdef set _get_sids_from_table(object db,
|
||||
str tablename,
|
||||
int start_date,
|
||||
int end_date):
|
||||
"""
|
||||
Get the unique sids for all adjustments between start_date and end_date
|
||||
from table `tablename`.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
db : sqlite3.connection
|
||||
tablename : str
|
||||
start_date : int (seconds since epoch)
|
||||
end_date : int (seconds since epoch)
|
||||
|
||||
Returns
|
||||
-------
|
||||
sids : set
|
||||
Set of sets
|
||||
"""
|
||||
|
||||
cdef object cursor = db.execute(
|
||||
SID_QUERIES[tablename],
|
||||
(start_date, end_date),
|
||||
)
|
||||
cdef set out = set()
|
||||
cdef tuple result
|
||||
for result in cursor.fetchall():
|
||||
PySet_Add(out, result[0])
|
||||
return out
|
||||
|
||||
|
||||
cdef set _get_split_sids(object db, int start_date, int end_date):
|
||||
return _get_sids_from_table(db, 'splits', start_date, end_date)
|
||||
|
||||
|
||||
cdef set _get_merger_sids(object db, int start_date, int end_date):
|
||||
return _get_sids_from_table(db, 'mergers', start_date, end_date)
|
||||
|
||||
|
||||
cdef set _get_dividend_sids(object db, int start_date, int end_date):
|
||||
return _get_sids_from_table(db, 'dividends', start_date, end_date)
|
||||
|
||||
|
||||
cdef _adjustments(object adjustments_db,
|
||||
set split_sids,
|
||||
set merger_sids,
|
||||
set dividends_sids,
|
||||
int start_date,
|
||||
int end_date,
|
||||
Int64Index_t assets):
|
||||
|
||||
c = adjustments_db.cursor()
|
||||
|
||||
splits_to_query = [str(a) for a in assets if a in split_sids]
|
||||
splits_results = []
|
||||
while splits_to_query:
|
||||
query_len = min(len(splits_to_query), SQLITE_MAX_IN_STATEMENT)
|
||||
query_assets = splits_to_query[:query_len]
|
||||
t= [str(a) for a in query_assets]
|
||||
statement = ADJ_QUERY_TEMPLATE.format('splits',
|
||||
",".join(['?' for _ in query_assets]), start_date, end_date)
|
||||
c.execute(statement, t)
|
||||
splits_to_query = splits_to_query[query_len:]
|
||||
splits_results.extend(c.fetchall())
|
||||
|
||||
mergers_to_query = [str(a) for a in assets if a in merger_sids]
|
||||
mergers_results = []
|
||||
while mergers_to_query:
|
||||
query_len = min(len(mergers_to_query), SQLITE_MAX_IN_STATEMENT)
|
||||
query_assets = mergers_to_query[:query_len]
|
||||
t= [str(a) for a in query_assets]
|
||||
statement = ADJ_QUERY_TEMPLATE.format('mergers',
|
||||
",".join(['?' for _ in query_assets]), start_date, end_date)
|
||||
c.execute(statement, t)
|
||||
mergers_to_query = mergers_to_query[query_len:]
|
||||
mergers_results.extend(c.fetchall())
|
||||
|
||||
dividends_to_query = [str(a) for a in assets if a in dividends_sids]
|
||||
dividends_results = []
|
||||
while dividends_to_query:
|
||||
query_len = min(len(dividends_to_query), SQLITE_MAX_IN_STATEMENT)
|
||||
query_assets = dividends_to_query[:query_len]
|
||||
t= [str(a) for a in query_assets]
|
||||
statement = ADJ_QUERY_TEMPLATE.format('dividends',
|
||||
",".join(['?' for _ in query_assets]), start_date, end_date)
|
||||
c.execute(statement, t)
|
||||
dividends_to_query = dividends_to_query[query_len:]
|
||||
dividends_results.extend(c.fetchall())
|
||||
|
||||
return splits_results, mergers_results, dividends_results
|
||||
|
||||
|
||||
cpdef load_adjustments_from_sqlite(object adjustments_db, # sqlite3.Connection
|
||||
list columns,
|
||||
DatetimeIndex_t dates,
|
||||
Int64Index_t assets):
|
||||
"""
|
||||
Load a dictionary of Adjustment objects from adjustments_db
|
||||
|
||||
Parameters
|
||||
----------
|
||||
adjustments_db : sqlite3.Connection
|
||||
Connection to a sqlite3 table in the format written by
|
||||
SQLiteAdjustmentWriter.
|
||||
columns : list[str]
|
||||
List of column names for which adjustments are needed.
|
||||
dates : pd.DatetimeIndex
|
||||
Dates for which adjustments are needed
|
||||
assets : pd.Int64Index
|
||||
Assets for which adjustments are needed.
|
||||
"""
|
||||
|
||||
cdef int start_date = int((dates[0] - EPOCH).total_seconds())
|
||||
cdef int end_date = int((dates[-1] - EPOCH).total_seconds())
|
||||
|
||||
cdef set split_sids = _get_split_sids(
|
||||
adjustments_db,
|
||||
start_date,
|
||||
end_date,
|
||||
)
|
||||
cdef set merger_sids = _get_merger_sids(
|
||||
adjustments_db,
|
||||
start_date,
|
||||
end_date,
|
||||
)
|
||||
cdef set dividend_sids = _get_dividend_sids(
|
||||
adjustments_db,
|
||||
start_date,
|
||||
end_date,
|
||||
)
|
||||
|
||||
cdef:
|
||||
list splits, mergers, dividends
|
||||
splits, mergers, dividends = _adjustments(
|
||||
adjustments_db,
|
||||
split_sids,
|
||||
merger_sids,
|
||||
dividend_sids,
|
||||
start_date,
|
||||
end_date,
|
||||
assets,
|
||||
)
|
||||
|
||||
cdef list results = [{} for column in columns]
|
||||
cdef dict asset_ixs = {} # Cache sid lookups here.
|
||||
cdef:
|
||||
int sid
|
||||
double ratio
|
||||
int eff_date
|
||||
int date_loc
|
||||
Py_ssize_t asset_ix
|
||||
int i
|
||||
dict col_adjustments
|
||||
|
||||
# splits affect prices and volumes, volumes is the inverse
|
||||
for sid, ratio, eff_date in splits:
|
||||
date_loc = dates.get_loc(
|
||||
Timestamp(eff_date, unit='s', tz='UTC'),
|
||||
# Get the first date **on or after** the effective date.
|
||||
method='bfill',
|
||||
)
|
||||
|
||||
if not PyDict_Contains(asset_ixs, sid):
|
||||
asset_ixs[sid] = assets.get_loc(sid)
|
||||
asset_ix = asset_ixs[sid]
|
||||
|
||||
price_adj = Float64Multiply(0, date_loc, asset_ix, ratio)
|
||||
for i, column in enumerate(columns):
|
||||
col_adjustments = results[i]
|
||||
if column != 'volume':
|
||||
try:
|
||||
col_adjustments[date_loc].append(price_adj)
|
||||
except KeyError:
|
||||
col_adjustments[date_loc] = [price_adj]
|
||||
else:
|
||||
volume_adj = Float64Multiply(
|
||||
0, date_loc, asset_ix, 1.0 / ratio
|
||||
)
|
||||
try:
|
||||
col_adjustments[date_loc].append(volume_adj)
|
||||
except KeyError:
|
||||
col_adjustments[date_loc] = [volume_adj]
|
||||
|
||||
# mergers affect prices only
|
||||
for sid, ratio, eff_date in mergers:
|
||||
date_loc = dates.get_loc(
|
||||
Timestamp(eff_date, unit='s', tz='UTC'),
|
||||
# Get the first date **on or after** the effective date.
|
||||
method='bfill',
|
||||
)
|
||||
|
||||
if not PyDict_Contains(asset_ixs, sid):
|
||||
asset_ixs[sid] = assets.get_loc(sid)
|
||||
asset_ix = asset_ixs[sid]
|
||||
|
||||
adj = Float64Multiply(0, date_loc, asset_ix, ratio)
|
||||
for i, column in enumerate(columns):
|
||||
col_adjustments = results[i]
|
||||
if column != 'volume':
|
||||
try:
|
||||
col_adjustments[date_loc].append(adj)
|
||||
except KeyError:
|
||||
col_adjustments[date_loc] = [adj]
|
||||
|
||||
# dividends affect prices only
|
||||
for sid, ratio, eff_date in dividends:
|
||||
date_loc = dates.get_loc(
|
||||
Timestamp(eff_date, unit='s', tz='UTC'),
|
||||
# Get the first date **on or after** the effective date.
|
||||
method='bfill',
|
||||
)
|
||||
|
||||
if not PyDict_Contains(asset_ixs, sid):
|
||||
asset_ixs[sid] = assets.get_loc(sid)
|
||||
asset_ix = asset_ixs[sid]
|
||||
|
||||
adj = Float64Multiply(0, last_row, asset_ix, ratio)
|
||||
for i, column in enumerate(columns):
|
||||
col_adjustments = results[i]
|
||||
if column != 'volume':
|
||||
try:
|
||||
col_adjustments[date_loc].append(adj)
|
||||
except KeyError:
|
||||
col_adjustments[date_loc] = [adj]
|
||||
|
||||
return results
|
||||
@@ -2,7 +2,7 @@
|
||||
classifier.py
|
||||
"""
|
||||
|
||||
from zipline.modelling.term import Term
|
||||
from zipline.pipeline.term import Term
|
||||
|
||||
|
||||
class Classifier(Term):
|
||||
@@ -0,0 +1,9 @@
|
||||
from .equity_pricing import USEquityPricing
|
||||
from .dataset import DataSet, Column, BoundColumn
|
||||
|
||||
__all__ = [
|
||||
'BoundColumn',
|
||||
'Column',
|
||||
'DataSet',
|
||||
'USEquityPricing',
|
||||
]
|
||||
@@ -6,8 +6,8 @@ from six import (
|
||||
with_metaclass,
|
||||
)
|
||||
|
||||
from zipline.modelling.term import Term
|
||||
from zipline.modelling.factor import Latest
|
||||
from zipline.pipeline.term import Term
|
||||
from zipline.pipeline.factor import Latest
|
||||
|
||||
|
||||
class Column(object):
|
||||
@@ -1,12 +1,6 @@
|
||||
from numpy import (
|
||||
float64,
|
||||
uint32,
|
||||
)
|
||||
from numpy import float64, uint32
|
||||
|
||||
from zipline.data.dataset import (
|
||||
Column,
|
||||
DataSet,
|
||||
)
|
||||
from .dataset import Column, DataSet
|
||||
|
||||
|
||||
class USEquityPricing(DataSet):
|
||||
@@ -39,7 +39,7 @@ class FFCEngine(with_metaclass(ABCMeta)):
|
||||
|
||||
Parameters
|
||||
----------
|
||||
pipeline : zipline.modelling.pipeline.Pipeline
|
||||
pipeline : zipline.pipeline.Pipeline
|
||||
The pipeline to run.
|
||||
start_date : pd.Timestamp
|
||||
Start date of the computed matrix.
|
||||
@@ -53,7 +53,7 @@ class FFCEngine(with_metaclass(ABCMeta)):
|
||||
|
||||
The columns `result` correspond wil be the computed results of
|
||||
`pipeline.columns`, which should be a dictionary mapping strings to
|
||||
instances of `zipline.modelling.term.Term`.
|
||||
instances of `zipline.pipeline.term.Term`.
|
||||
|
||||
For each date between `start_date` and `end_date`, `result` will
|
||||
contain a row for each asset that passed `pipeline.screen`. A
|
||||
@@ -111,7 +111,7 @@ class SimpleFFCEngine(object):
|
||||
|
||||
Parameters
|
||||
----------
|
||||
pipeline : zipline.modelling.pipeline.Pipeline
|
||||
pipeline : zipline.pipeline.Pipeline
|
||||
The pipeline to run.
|
||||
start_date : pd.Timestamp
|
||||
Start date of the computed matrix.
|
||||
@@ -142,7 +142,7 @@ class SimpleFFCEngine(object):
|
||||
|
||||
5. Stick the values computed in (4) into a DataFrame and return it.
|
||||
|
||||
Step 0 is performed by `zipline.modelling.graph.TermGraph`.
|
||||
Step 0 is performed by `zipline.pipeline.graph.TermGraph`.
|
||||
Step 1 is performed in `self._compute_root_mask`.
|
||||
Step 2 is performed in `self.compute_chunk`.
|
||||
Steps 3, 4, and 5 are performed in self._format_factor_matrix.
|
||||
@@ -280,7 +280,7 @@ class SimpleFFCEngine(object):
|
||||
|
||||
Parameters
|
||||
----------
|
||||
graph : zipline.modelling.graph.TermGraph
|
||||
graph : zipline.pipeline.graph.TermGraph
|
||||
dates : pd.DatetimeIndex
|
||||
Row labels for our root mask.
|
||||
assets : pd.Int64Index
|
||||
@@ -12,7 +12,7 @@ from numpy import (
|
||||
find_common_type,
|
||||
)
|
||||
|
||||
from zipline.modelling.term import Term, NotSpecified
|
||||
from zipline.pipeline.term import Term, NotSpecified
|
||||
|
||||
_VARIABLE_NAME_RE = re.compile("^(x_)([0-9]+)$")
|
||||
|
||||
@@ -16,14 +16,14 @@ from zipline.errors import (
|
||||
UnsupportedDataType,
|
||||
)
|
||||
from zipline.lib.rank import rankdata_2d_ordinal
|
||||
from zipline.modelling.term import (
|
||||
from zipline.pipeline.term import (
|
||||
CustomTermMixin,
|
||||
NotSpecified,
|
||||
RequiredWindowLengthMixin,
|
||||
SingleInputMixin,
|
||||
Term,
|
||||
)
|
||||
from zipline.modelling.expression import (
|
||||
from zipline.pipeline.expression import (
|
||||
BadBinaryOperator,
|
||||
COMPARISONS,
|
||||
is_comparison,
|
||||
@@ -33,7 +33,7 @@ from zipline.modelling.expression import (
|
||||
NUMEXPR_MATH_FUNCS,
|
||||
UNARY_OPS,
|
||||
)
|
||||
from zipline.modelling.filter import (
|
||||
from zipline.pipeline.filter import (
|
||||
NumExprFilter,
|
||||
PercentileFilter,
|
||||
)
|
||||
@@ -230,7 +230,7 @@ class Factor(Term):
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ranks : zipline.modelling.factor.Rank
|
||||
ranks : zipline.pipeline.factor.Rank
|
||||
A new factor that will compute the sorted indices of the data
|
||||
produced by `self`.
|
||||
method : str, {'ordinal', 'min', 'max', 'dense', 'average'}
|
||||
@@ -243,7 +243,7 @@ class Factor(Term):
|
||||
|
||||
Returns
|
||||
-------
|
||||
ranks : zipline.modelling.factor.Rank
|
||||
ranks : zipline.pipeline.factor.Rank
|
||||
|
||||
Notes
|
||||
-----
|
||||
@@ -258,7 +258,7 @@ class Factor(Term):
|
||||
--------
|
||||
scipy.stats.rankdata
|
||||
zipline.lib.rank
|
||||
zipline.modelling.factor.Rank
|
||||
zipline.pipeline.factor.Rank
|
||||
"""
|
||||
return Rank(self if ascending else -self, method=method, mask=mask)
|
||||
|
||||
@@ -273,7 +273,7 @@ class Factor(Term):
|
||||
|
||||
Returns
|
||||
-------
|
||||
filter : zipline.modelling.filter.Filter
|
||||
filter : zipline.pipeline.filter.Filter
|
||||
"""
|
||||
return self.rank(ascending=False, mask=mask) <= N
|
||||
|
||||
@@ -288,7 +288,7 @@ class Factor(Term):
|
||||
|
||||
Returns
|
||||
-------
|
||||
filter : zipline.modelling.filter.Filter
|
||||
filter : zipline.pipeline.filter.Filter
|
||||
"""
|
||||
return self.rank(ascending=True, mask=mask) <= N
|
||||
|
||||
@@ -308,12 +308,12 @@ class Factor(Term):
|
||||
|
||||
Returns
|
||||
-------
|
||||
out : zipline.modelling.filter.PercentileFilter
|
||||
out : zipline.pipeline.filter.PercentileFilter
|
||||
A new filter that will compute the specified percentile-range mask.
|
||||
|
||||
See Also
|
||||
--------
|
||||
zipline.modelling.filter.PercentileFilter
|
||||
zipline.pipeline.filter.PercentileFilter
|
||||
"""
|
||||
return PercentileFilter(
|
||||
self,
|
||||
@@ -350,7 +350,7 @@ class Rank(SingleInputMixin, Factor):
|
||||
|
||||
Parameters
|
||||
----------
|
||||
factor : zipline.modelling.factor.Factor
|
||||
factor : zipline.pipeline.factor.Factor
|
||||
The factor on which to compute ranks.
|
||||
method : str, {'average', 'min', 'max', 'dense', 'ordinal'}
|
||||
The method used to assign ranks to tied elements. See
|
||||
@@ -18,8 +18,8 @@ from numpy import (
|
||||
)
|
||||
from numexpr import evaluate
|
||||
|
||||
from zipline.data.equities import USEquityPricing
|
||||
from zipline.modelling.term import SingleInputMixin
|
||||
from zipline.pipeline.data import USEquityPricing
|
||||
from zipline.pipeline.term import SingleInputMixin
|
||||
from zipline.utils.control_flow import ignore_nanwarnings
|
||||
from .factor import CustomFactor
|
||||
|
||||
@@ -13,11 +13,11 @@ from operator import attrgetter
|
||||
from zipline.errors import (
|
||||
BadPercentileBounds,
|
||||
)
|
||||
from zipline.modelling.term import (
|
||||
from zipline.pipeline.term import (
|
||||
SingleInputMixin,
|
||||
Term,
|
||||
)
|
||||
from zipline.modelling.expression import (
|
||||
from zipline.pipeline.expression import (
|
||||
BadBinaryOperator,
|
||||
FILTER_BINOPS,
|
||||
method_name_for_op,
|
||||
@@ -119,7 +119,7 @@ class PercentileFilter(SingleInputMixin, Filter):
|
||||
|
||||
Parameters
|
||||
----------
|
||||
factor : zipline.modelling.factor.Factor
|
||||
factor : zipline.pipeline.factor.Factor
|
||||
The factor over which to compute percentile bounds.
|
||||
min_percentile : float [0.0, 1.0]
|
||||
The minimum percentile rank of an asset that will pass the filter.
|
||||
@@ -7,7 +7,7 @@ from networkx import (
|
||||
)
|
||||
from six import itervalues, iteritems
|
||||
from zipline.utils.memoize import lazyval
|
||||
from zipline.modelling.visualize import display_graph
|
||||
from zipline.pipeline.visualize import display_graph
|
||||
|
||||
|
||||
class CyclicDependency(Exception):
|
||||
@@ -98,9 +98,9 @@ class TermGraph(DiGraph):
|
||||
|
||||
See Also
|
||||
--------
|
||||
zipline.modelling.graph.TermGraph.offset
|
||||
zipline.modelling.engine.SimpleFFCEngine._inputs_for_term
|
||||
zipline.modelling.engine.SimpleFFCEngine._mask_for_term
|
||||
zipline.pipeline.graph.TermGraph.offset
|
||||
zipline.pipeline.engine.SimpleFFCEngine._inputs_for_term
|
||||
zipline.pipeline.engine.SimpleFFCEngine._mask_for_term
|
||||
"""
|
||||
out = {}
|
||||
for term in self:
|
||||
@@ -147,8 +147,8 @@ class TermGraph(DiGraph):
|
||||
|
||||
See Also
|
||||
--------
|
||||
zipline.modelling.graph.TermGraph.offset
|
||||
zipline.modelling.term.Term.extra_input_rows
|
||||
zipline.pipeline.graph.TermGraph.offset
|
||||
zipline.pipeline.term.Term.extra_input_rows
|
||||
"""
|
||||
return {
|
||||
term: attrs['extra_rows']
|
||||
@@ -12,7 +12,7 @@ from six import with_metaclass
|
||||
|
||||
class FFCLoader(with_metaclass(ABCMeta)):
|
||||
"""
|
||||
ABC for classes that can load data for use with zipline.modelling pipeline.
|
||||
ABC for classes that can load data for use with zipline.pipeline APIs.
|
||||
|
||||
TODO: DOCUMENT THIS MORE!
|
||||
"""
|
||||
+8
-11
@@ -19,6 +19,7 @@ from contextlib import contextmanager
|
||||
from errno import ENOENT
|
||||
from os import remove
|
||||
from os.path import exists
|
||||
import sqlite3
|
||||
|
||||
from bcolz import (
|
||||
carray,
|
||||
@@ -45,20 +46,16 @@ from six import (
|
||||
string_types,
|
||||
with_metaclass,
|
||||
)
|
||||
import sqlite3
|
||||
|
||||
|
||||
from zipline.data.ffc.base import FFCLoader
|
||||
from zipline.data.ffc.loaders._equities import (
|
||||
_compute_row_slices,
|
||||
_read_bcolz_data,
|
||||
)
|
||||
from zipline.data.ffc.loaders._adjustments import load_adjustments_from_sqlite
|
||||
from zipline.lib.adjusted_array import (
|
||||
adjusted_array,
|
||||
)
|
||||
from zipline.errors import NoFurtherDataError
|
||||
|
||||
from .base import FFCLoader
|
||||
from ._equities import _compute_row_slices, _read_bcolz_data
|
||||
from ._adjustments import load_adjustments_from_sqlite
|
||||
|
||||
OHLC = frozenset(['open', 'high', 'low', 'close'])
|
||||
US_EQUITY_PRICING_BCOLZ_COLUMNS = [
|
||||
'open', 'high', 'low', 'close', 'volume', 'day', 'id'
|
||||
@@ -624,7 +621,7 @@ def _shift_dates(dates, start_date, end_date, shift):
|
||||
if start_date < dates[0]:
|
||||
raise NoFurtherDataError(
|
||||
msg=(
|
||||
"Modeling Query requested data starting on {query_start}, "
|
||||
"Pipeline Query requested data starting on {query_start}, "
|
||||
"but first known date is {calendar_start}"
|
||||
).format(
|
||||
query_start=str(start_date),
|
||||
@@ -638,7 +635,7 @@ def _shift_dates(dates, start_date, end_date, shift):
|
||||
if start < shift:
|
||||
raise NoFurtherDataError(
|
||||
msg=(
|
||||
"Modeling Query requested data from {shift}"
|
||||
"Pipeline Query requested data from {shift}"
|
||||
" days before {query_start}, but first known date is only "
|
||||
"{start} days earlier."
|
||||
).format(shift=shift, query_start=start_date, start=start),
|
||||
@@ -650,7 +647,7 @@ def _shift_dates(dates, start_date, end_date, shift):
|
||||
if end_date > dates[-1]:
|
||||
raise NoFurtherDataError(
|
||||
msg=(
|
||||
"Modeling Query requesting data up to {query_end}, "
|
||||
"Pipeline Query requesting data up to {query_end}, "
|
||||
"but last known date is {calendar_end}"
|
||||
).format(
|
||||
query_end=end_date,
|
||||
@@ -17,7 +17,8 @@ from zipline.lib.adjustment import (
|
||||
Float64Multiply,
|
||||
Float64Overwrite,
|
||||
)
|
||||
from zipline.data.ffc.base import FFCLoader
|
||||
|
||||
from .base import FFCLoader
|
||||
|
||||
|
||||
ADD, MULTIPLY, OVERWRITE = range(3)
|
||||
@@ -45,7 +46,7 @@ class DataFrameFFCLoader(FFCLoader):
|
||||
|
||||
Parameters
|
||||
----------
|
||||
column : zipline.data.dataset.BoundColumn
|
||||
column : zipline.pipeline.data.BoundColumn
|
||||
The column whose data is loadable by this loader.
|
||||
baseline : pandas.DataFrame
|
||||
A DataFrame with index of type DatetimeIndex and columns of type
|
||||
@@ -58,7 +59,7 @@ class DataFrameFFCLoader(FFCLoader):
|
||||
A DataFrame with the following columns:
|
||||
sid : int
|
||||
value : any
|
||||
kind : int (zipline.data.ffc.frame.ADJUSTMENT_TYPES)
|
||||
kind : int (zipline.pipeline.loaders.frame.ADJUSTMENT_TYPES)
|
||||
start_date : datetime64 (can be NaT)
|
||||
end_date : datetime64 (must be set)
|
||||
apply_date : datetime64 (must be set)
|
||||
@@ -11,17 +11,13 @@ from numpy import (
|
||||
iinfo,
|
||||
uint32,
|
||||
)
|
||||
from pandas import (
|
||||
DataFrame,
|
||||
Timestamp,
|
||||
)
|
||||
from pandas import DataFrame, Timestamp
|
||||
from six import iteritems
|
||||
from sqlite3 import connect as sqlite3_connect
|
||||
|
||||
from six import iteritems
|
||||
|
||||
from zipline.data.ffc.base import FFCLoader
|
||||
from zipline.data.ffc.frame import DataFrameFFCLoader
|
||||
from zipline.data.ffc.loaders.us_equity_pricing import (
|
||||
from .base import FFCLoader
|
||||
from .frame import DataFrameFFCLoader
|
||||
from .equity_pricing_loader import (
|
||||
BcolzDailyBarWriter,
|
||||
SQLiteAdjustmentReader,
|
||||
SQLiteAdjustmentWriter,
|
||||
@@ -1,7 +1,8 @@
|
||||
from zipline.utils.preprocess import expect_types, optional
|
||||
from zipline.modelling.term import Term
|
||||
from zipline.modelling.filter import Filter
|
||||
from zipline.modelling.graph import TermGraph
|
||||
|
||||
from .term import Term
|
||||
from .filter import Filter
|
||||
from .graph import TermGraph
|
||||
|
||||
|
||||
class Pipeline(object):
|
||||
@@ -12,7 +13,7 @@ class Pipeline(object):
|
||||
Name for this pipeline.
|
||||
columns : dict, optional
|
||||
Initial columns.
|
||||
screen : zipline.modelling.term.Filter, optional
|
||||
screen : zipline.pipeline.term.Filter, optional
|
||||
Initial screen.
|
||||
|
||||
Methods
|
||||
@@ -71,7 +72,7 @@ class Pipeline(object):
|
||||
|
||||
Parameters
|
||||
----------
|
||||
column : zipline.modelling.Term
|
||||
column : zipline.pipeline.Term
|
||||
A Filter, Factor, or Classifier to add to the pipeline.
|
||||
name : str
|
||||
Name of the column to add.
|
||||
@@ -105,7 +106,7 @@ class Pipeline(object):
|
||||
|
||||
Returns
|
||||
-------
|
||||
removed : zipline.modelling.term.Term
|
||||
removed : zipline.pipeline.term.Term
|
||||
The removed term.
|
||||
"""
|
||||
return self.columns.pop(name)
|
||||
@@ -120,7 +121,7 @@ class Pipeline(object):
|
||||
|
||||
Parameter
|
||||
---------
|
||||
filter : zipline.modelling.filter.Filter
|
||||
filter : zipline.pipeline.filter.Filter
|
||||
The screen to apply.
|
||||
overwrite : bool
|
||||
Whether to overwrite any existing screen. If overwrite is False
|
||||
@@ -145,7 +146,7 @@ class Pipeline(object):
|
||||
----------
|
||||
screen_name : str
|
||||
Name to supply for self.screen.
|
||||
default_screen : zipline.modelling.term.Term
|
||||
default_screen : zipline.pipeline.term.Term
|
||||
Term to use as a screen if self.screen is None.
|
||||
"""
|
||||
columns = self.columns.copy()
|
||||
@@ -12,10 +12,9 @@ from subprocess import Popen, PIPE
|
||||
from networkx import topological_sort
|
||||
from six import iteritems
|
||||
|
||||
|
||||
from zipline.data.dataset import BoundColumn
|
||||
from zipline.modelling import Filter, Factor, Classifier, Term
|
||||
from zipline.modelling.term import AssetExists
|
||||
from zipline.pipeline.data import BoundColumn
|
||||
from zipline.pipeline import Filter, Factor, Classifier, Term
|
||||
from zipline.pipeline.term import AssetExists
|
||||
|
||||
|
||||
class NoIPython(Exception):
|
||||
@@ -82,7 +81,7 @@ def _render(g, out, format_, include_asset_exists=False):
|
||||
|
||||
Parameters
|
||||
----------
|
||||
g : zipline.modelling.graph.TermGraph
|
||||
g : zipline.pipeline.graph.TermGraph
|
||||
Graph to render.
|
||||
out : file-like object
|
||||
format_ : str {'png', 'svg'}
|
||||
Reference in New Issue
Block a user