Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
# Conflicts:
#	campaign/deeplearn/training.py
#	me/helper/research_env.py
  • Loading branch information
kanghua309 committed Dec 3, 2017
1 parent 1eaa799 commit 0fb8299
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 33 deletions.
33 changes: 19 additions & 14 deletions campaign/checkmode/factors.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@


start = '2015-8-5' # 必须在国内交易日
end = '2015-9-30' # 必须在国内交易日
end = '2015-9-28' # 必须在国内交易日

c,_ = get_sector_class()
ONEHOTCLASS = tuple(c)
Expand All @@ -53,31 +53,35 @@ def compute(self, today, assets, out, close,volume):

def make_pipeline(asset_finder):
universe = make_china_equity_universe(
target_size=2000,
#mask=default_china_equity_universe_mask([]),
target_size=300,
#mask=default_china_equity_universe_mask(['000001']),
mask=None,
max_group_weight=0.01,
smoothing_func=lambda f: f.downsample('month_start'),

smoothing_func=lambda f: f.downsample('week_start'),
asset_finder = asset_finder,
)

#private_universe = private_universe_mask(['000001','000002','000005'],asset_finder=asset_finder)


#private_universe = private_universe_mask(['000001'],asset_finder=asset_finder)
private_universe = universe
print ("---universe:",private_universe)
#print private_universe_mask(['000001','000002','000005'],asset_finder=asset_finder)
######################################################################################################
returns = Returns(inputs=[USEquityPricing.close], window_length=5) # 预测一周数据
######################################################################################################
ep = 1/Fundamental(asset_finder).pe
bp = 1/Fundamental(asset_finder).pb
bvps = Fundamental(asset_finder).bvps
market = Fundamental(asset_finder).outstanding
ep = 1/Fundamental(mask = private_universe,asset_finder=asset_finder).pe
bp = 1/Fundamental(mask = private_universe,asset_finder=asset_finder).pb
bvps = Fundamental(mask = private_universe,asset_finder=asset_finder).bvps
market = Fundamental(mask = private_universe,asset_finder=asset_finder).outstanding


rev20 = Returns(inputs=[USEquityPricing.close], window_length=20,mask = private_universe)
vol20 = AverageDollarVolume(window_length=20,mask = private_universe)

illiq = ILLIQ(window_length=20,mask = private_universe)
rsi = RSI(window_length=20,mask = private_universe)
mom = Momentum()
illiq = ILLIQ(window_length=22,mask = private_universe)
rsi = RSI(window_length=22,mask = private_universe)
mom = Momentum(window_length=252,mask = private_universe)

sector = get_sector(asset_finder=asset_finder,mask=private_universe)
ONEHOTCLASS,sector_indict_keys = get_sector_by_onehot(asset_finder=asset_finder,mask=private_universe)
Expand Down Expand Up @@ -112,13 +116,14 @@ def make_pipeline(asset_finder):



pd.set_option('display.width', 800)
pd.set_option('display.width', 8000)
research = Research()
#print(research.get_engine()._finder)
my_pipe = make_pipeline(research.get_engine()._finder)
result = research.run_pipeline(my_pipe,
Date(tz='utc', as_timestamp=True).parser(start),
Date(tz='utc', as_timestamp=True).parser(end))

print result
print type(result)
print result.reset_index()
Expand Down
10 changes: 7 additions & 3 deletions me/pipeline/classifiers/tushare/sector.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,6 @@ def get_sector(sector_dict=None,mask = None,asset_finder = None):
sector_dict,_ = get_sector_class()
#print("++enter getSector++",len(sector_dict))
basic=load_tushare_df("basic")
#print(asset_finder)
def _sid(sid):
return asset_finder.retrieve_asset(sid)
class Sector(CustomClassifier): #CustomClassifier 是int , factor 是float
Expand Down Expand Up @@ -114,7 +113,9 @@ def findSector(self,assets):
def compute(self, today, assets, out, *inputs):
rs = self.findSector(assets)
out[:] = rs
return Sector(mask=mask)
if mask != None:
return Sector(mask=mask)
return Sector()

def get_sector_by_onehot(sector_dict=None,mask = None,asset_finder = None):
if sector_dict is None:
Expand Down Expand Up @@ -183,7 +184,10 @@ def compute(self,today, assets, out):
i += 1
idx += 1
#print out
return OneHotSector(mask=mask),sector_indict_keys
if mask != None:
return OneHotSector(mask=mask),sector_indict_keys
else:
return OneHotSector(),sector_indict_keys



Expand Down
5 changes: 3 additions & 2 deletions me/pipeline/factors/tsfactor.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ def compute(self, today, assets, out, close):
return MarketCap()
'''
# can be used outside algo scope - give your asset_finder
def Fundamental(asset_finder = None):
def Fundamental(mask = None,asset_finder = None):
def _sid(sid):
return asset_finder.retrieve_asset(sid)
columns = ['pe', # 市盈率
Expand Down Expand Up @@ -101,7 +101,8 @@ def compute(self, today, assets, out,close):
out.gpr[:] = df.gpr
out.npr[:] = df.npr
out.holders[:] = df.holders

if mask != None:
return Fundamental(mask = mask)
return Fundamental()

'''
Expand Down
35 changes: 21 additions & 14 deletions me/pipeline/filters/universe.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
ADV_ADJ_DOWNLIMIT = 1.0e+8


def universe_filter(smoothing_func = None):
def universe_filter(smoothing_func = None,asset_finder=None):
"""
Create a Pipeline producing Filters implementing common acceptance criteria.
Returns
Expand All @@ -36,9 +36,9 @@ def universe_filter(smoothing_func = None):
Filter to control tradeablility
"""
factors = {
'MarketCap': Fundamental().outstanding,
'MarketCap': Fundamental(asset_finder=asset_finder).outstanding,
'ADV_adj' : ADV_adj(),
'Sector' : get_sector(),
'Sector' : get_sector(asset_finder=asset_finder),
}


Expand Down Expand Up @@ -69,7 +69,7 @@ def universe_filter(smoothing_func = None):

return filters

def sector_filter(tradeable_count,sector_exposure_limit,smoothing_func = None):
def sector_filter(tradeable_count,sector_exposure_limit,smoothing_func = None,asset_finder=None):

"""
Mask for Pipeline in create_tradeable. Limits each sector so as not to be over-exposed
Expand All @@ -88,7 +88,7 @@ def sector_filter(tradeable_count,sector_exposure_limit,smoothing_func = None):

industry_class,_ = get_sector_class()
#print("g_inds",g_inds)
sector_factor = get_sector(industry_class)
sector_factor = get_sector(industry_class,asset_finder=asset_finder)
# set thresholds
sector_size = len(industry_class)
if sector_exposure_limit < ((1. / sector_size)):
Expand Down Expand Up @@ -178,7 +178,7 @@ def sector_filter(tradeable_count,sector_exposure_limit,smoothing_func = None):
return filters


def default_china_equity_universe_mask(unmask):
def default_china_equity_universe_mask(unmask,asset_finder=None):
#a_stocks = []
info = load_tushare_df("basic")
sme = load_tushare_df("sme")
Expand All @@ -192,13 +192,18 @@ def default_china_equity_universe_mask(unmask):
pass
#Returns a factor indicating membership (=1) in the given iterable of securities
#print("==enter IsInSymbolsList==")
def _sid(sid):
return asset_finder.retrieve_asset(sid)
class IsInDefaultChinaUniverse(CustomFilter):
inputs = [];
window_length = 1
def compute(self, today, asset_ids, out, *inputs):
#print asset_ids
#print maskset
assets = [sid(id).symbol for id in asset_ids]
if asset_finder != None:
assets = [_sid(id).symbol for id in asset_ids]
else:
assets = [sid(id).symbol for id in asset_ids]
#print "--------------"
#print pd.Series(assets)
out[:] = pd.Series(assets).isin(maskdf.index)
Expand All @@ -207,7 +212,7 @@ def compute(self, today, asset_ids, out, *inputs):

def private_universe_mask(mask,asset_finder = None):
mask = mask
def sid(sid):
def _sid(sid):
return asset_finder.retrieve_asset(sid)
class IsInPrivateUniverse(CustomFilter):
inputs = [];
Expand All @@ -218,7 +223,10 @@ def compute(self, today, asset_ids, out, *inputs):
# for id in asset_ids:
# print id
# print type(sid(id))
assets = [sid(id).symbol for id in asset_ids]
if asset_finder != None:
assets = [_sid(id).symbol for id in asset_ids]
else:
assets = [sid(id).symbol for id in asset_ids]
#print "--------------"
#print pd.Series(assets)
out[:] = pd.Series(assets).isin(mask)
Expand All @@ -232,13 +240,12 @@ def make_china_equity_universe(
mask,
#groupby,
max_group_weight,
smoothing_func):
ufilters = universe_filter(smoothing_func)
sfilters = sector_filter(target_size,max_group_weight,smoothing_func)

smoothing_func,
asset_finder = None):
ufilters = universe_filter(smoothing_func,asset_finder)
sfilters = sector_filter(target_size,max_group_weight,smoothing_func,asset_finder)
if mask != None:
return (ufilters & sfilters) & mask # &? TODO

return (ufilters & sfilters)


9 changes: 9 additions & 0 deletions simulate_research_env_example/run_algo_example.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
from zipline.utils.calendars import get_calendar
from zipline.utils.factory import create_simulation_parameters
from zipline.utils.cli import Date, Timestamp
from me.pipeline.filters.universe import make_china_equity_universe, default_china_equity_universe_mask, \
private_universe_mask
from zipline.api import (
attach_pipeline,
date_rules,
Expand All @@ -38,6 +40,13 @@

N = 10
def make_pipeline():
# universe = make_china_equity_universe(
# target_size = 100,
# mask = default_china_equity_universe_mask(['000001']),
# max_group_weight= 0.01,
# smoothing_func = lambda f: f.downsample('week_start'),
# )

dollar_volume = AverageDollarVolume(window_length=1)
high_dollar_volume = dollar_volume.percentile_between(N, 100)
recent_returns = Returns(window_length=N, mask=high_dollar_volume)
Expand Down

0 comments on commit 0fb8299

Please sign in to comment.