修正因子计算代码;修正#13号因子回测代码

This commit is contained in:
Harvey-Sun
2017-03-03 18:06:36 +08:00
parent 0dd9070683
commit 45d55224e8
2 changed files with 190 additions and 102 deletions
+4 -2
View File
@@ -15,6 +15,7 @@ Fee_Rate = 0.001
program_path = 'C:/cStrategy/'
buy_number = 200
period = 20
s_or_b = False # true表示选因子较小的股票,false表示选因子较大的股票
def initial(sdk):
@@ -34,6 +35,7 @@ def init_per_day(sdk):
volume = pd.DataFrame(sdk.getFieldData('LZ_GPA_QUOTE_TVOLUME')[-5:], columns=stock_list)
adj_f = pd.DataFrame(sdk.getFieldData('LZ_GPA_CMFTR_CUM_FACTOR')[-5:], columns=stock_list)
stop = pd.DataFrame(sdk.getFieldData('LZ_GPA_SLCIND_STOP_FLAG')[-6:], columns=stock_list)
volume.replace(0, np.nan, inplace=True)
adj_close = close * adj_f
adj_volume = volume / adj_f
# 计算昨天的factor
@@ -41,8 +43,8 @@ def init_per_day(sdk):
volume_rank = adj_volume.rank(axis=1, pct=True)
factor = -1 * ((close_rank - close_rank.mean()) * (volume_rank - volume_rank.mean())).sum(skipna=False).rank(pct=True)
factor[stop.notnull().any()] = np.nan # 剔除停牌的股票
factor.sort_values(ascending=True, inplace=True)
stock_pool = factor.index[:buy_number] # 选出因子较小的股票
factor.sort_values(ascending=s_or_b, inplace=True)
stock_pool = factor.index[:buy_number] # 选出排序靠前的股票
position = sdk.getPositions()
position_dict = dict([i.code, i.optPosition] for i in position)
stock_to_buy = set(stock_pool) - set(position_dict.keys())
+186 -100
View File
@@ -59,7 +59,7 @@ def rolling_rank(data, window):
return temp.T
def rolling_new(data, window):
def rolling_null(data, window):
temp = pd.DataFrame(index=data.columns)
for i in data.index:
one = data[:i][-window:].isnull().any(axis=0)
@@ -84,13 +84,14 @@ def ind_neutral(data, ind):
return temp.T
def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False, save=False):
high = data['high']
low = data['low']
close = data['close']
OPEN = data['OPEN']
value = data['value']
volume = data['volume']
volume.replace(0, np.nan, inplace=True)
cap = data['cap']
stop = data['stop']
st = data['st']
@@ -99,126 +100,147 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
asset_debt = data['asset_debt']
price_adj_f = data['price_adj_f']
volume.replace(0, np.nan, inplace=True)
# 将新股(上市小于63天)的所有数据设为na
if no_new:
high[rolling_null(close, 63)] = np.nan
low[rolling_null(close, 63)] = np.nan
close[rolling_null(close, 63)] = np.nan
OPEN[rolling_null(close, 63)] = np.nan
value[rolling_null(close, 63)] = np.nan
volume[rolling_null(close, 63)] = np.nan
cap[rolling_null(close, 63)] = np.nan
adj_OPEN = OPEN * price_adj_f
adj_close = close * price_adj_f
adj_high = high * price_adj_f
adj_low = low * price_adj_f
adj_volume = volume / price_adj_f
returns = adj_close.pct_change()
vwap = value / adj_volume
print '开始计算'
if factor_id == '001':
returns = adj_close.pct_change()
returns[returns < 0] = returns.rolling(window=20).std()
returns[returns < 0] = returns.rolling(window=20).std(skipna=False)
ts_argmax = np.square(returns).rolling(window=5).apply(np.argmax) + 1
ts_argmax[rolling_null(close, 5)] = np.nan
ts_argmax[rolling_stop(stop, 20)] = np.nan
factor = ts_argmax.rank(axis=1, pct=True) - 0.5
factor[rolling_stop(stop, 20)] = np.nan
elif factor_id == '002':
temp1 = np.log(adj_volume).diff(2)
temp1_rank = temp1.rank(axis=1, pct=True)
temp2 = (close - OPEN) / OPEN
temp2_rank = temp2.rank(axis=1, pct=True)
factor = pd.DataFrame()
for t in temp1_rank.index:
day_factor = -1 * pearson(temp1_rank[:t][-6:], temp2_rank[:t][-6:])
factor[t] = day_factor
factor = factor.T
factor = -1 * temp1_rank.rolling(window=6).corr(temp2_rank)
factor[rolling_null(close, 6)] = np.nan
factor[rolling_stop(stop, 6)] = np.nan
elif factor_id == '003':
open_rank = OPEN.rank(axis=1, pct=True)
volume_rank = volume.replace(0, np.nan).rank(axis=1, pct=True)
factor = pd.DataFrame()
for t in open_rank.index:
day_factor = -1 * pearson(open_rank[:t][-10:], volume_rank[:t][-10:])
factor[t] = day_factor
factor = factor.T
factor[stop.notnull()] = np.nan
volume_rank = volume.rank(axis=1, pct=True)
factor = -1 * open_rank.rolling(window=10).corr(volume_rank)
factor[rolling_null(close, 10)] = np.nan
factor[rolling_stop(stop, 10)] = np.nan
elif factor_id == '004':
low_rank = adj_low.rank(axis=1, pct=True)
factor = -1 * rolling_rank(low_rank, 9)
factor[rolling_null(close, 9)] = np.nan
factor[rolling_stop(stop, 9)] = np.nan
elif factor_id == '005':
vwap = value / adj_volume
be_half = (adj_OPEN - vwap.rolling(window=10).mean()).rank(axis=1, pct=True)
af_half = (adj_close - vwap).rank(axis=1, pct=True)
factor = -1 * be_half * af_half
factor[rolling_null(close, 10)] = np.nan
factor[rolling_stop(stop, 10)] = np.nan
elif factor_id == '006':
factor = pd.DataFrame()
adj_volume = adj_volume.replace(0, np.nan)
for t in OPEN.index:
day_factor = -1 * pearson(adj_OPEN[:t][-10:], adj_volume[:t][-10:])
factor[t] = day_factor
factor = factor.T
factor = -1 * adj_OPEN.rolling(window=10).corr(adj_volume)
factor[rolling_null(close, 10)] = np.nan
factor[rolling_stop(stop, 10)] = np.nan
elif factor_id == '007':
factor = -1 * rolling_rank(np.abs(adj_close.diff(7)), 60) * np.sign(adj_close.diff(7))
factor[adj_volume.rolling(window=20).mean() > volume] = -1
factor[rolling_null(close, 60)] = np.nan
factor[rolling_stop(stop, 20)] = np.nan
elif factor_id == '008':
temp = OPEN.rolling(window=5).sum() * returns.rolling(window=5).sum()
factor = -1 * (temp - temp.diff(10)).rank(axis=1, pct=True)
# temp - temp.diff(10) 不就是10日前的temp吗? SB啊!
factor[stop.notnull()] = np.nan
factor[rolling_null(close, 15)] = np.nan
factor[rolling_stop(stop, 15)] = np.nan
elif factor_id == '009':
cond_1 = adj_close.diff().rolling(window=5).min() > 0
cond_2 = adj_close.diff().rolling(window=5).max() < 0
factor = -1 * adj_close.diff()
factor[cond_1 | cond_2] = adj_close.diff()
factor[rolling_null(close, 6)] = np.nan
factor[rolling_stop(stop, 6)] = np.nan
elif factor_id == '010':
cond_1 = adj_close.diff().rolling(window=4).min() > 0
cond_2 = adj_close.diff().rolling(window=4).max() < 0
factor = -1 * adj_close.diff()
factor[cond_1 | cond_2] = adj_close.diff()
factor = factor.rank(axis=1, pct=True)
factor[rolling_null(close, 5)] = np.nan
factor[rolling_stop(stop, 5)] = np.nan
elif factor_id == '011':
vwap = value / adj_volume
temp1 = (vwap - adj_close).rolling(window=3).max().rank(aixs=1, pct=True)
temp2 = (vwap - adj_close).rolling(window=3).min().rank(axis=1, pct=True)
temp3 = adj_volume.diff(3).rank(axis=1, pct=True)
factor = (temp1 + temp2) * temp3
factor[rolling_null(close, 3)] = np.nan
factor[rolling_stop(stop, 3)] = np.nan
elif factor_id == '012':
factor = -1 * np.sign(adj_volume.diff()) * adj_close.diff()
factor[stop.notnull()] = np.nan
factor[rolling_null(close, 2)] = np.nan
factor[rolling_stop(stop, 2)] = np.nan
elif factor_id == '013':
close_rank = adj_close.rank(axis=1, pct=True)
volume_rank = adj_volume.rank(axis=1, pct=True)
factor = -1 * (close_rank.rolling(window=5).cov(volume_rank)).rank(axis=1, pct=True)
factor[rolling_null(close, 5)] = np.nan
factor[rolling_stop(stop, 5)] = np.nan
elif factor_id == '014':
temp1 = adj_OPEN.rolling(window=10).corr(adj_volume)
temp2 = returns.diff(3).rank(axis=1, pct=True)
factor = -1 * temp2 * temp1
factor[rolling_null(close, 10)] = np.nan
factor[rolling_stop(stop, 10)] = np.nan
elif factor_id == '015':
high_rank = adj_high.rank(axis=1, pct=True)
volume_rank = adj_volume.rank(axis=1, pct=True)
temp1 = high_rank.rolling(window=3).corr(volume_rank)
factor = -1 * temp1.rank(axis=1, pct=True).rolling(window=3).sum()
factor[rolling_stop(stop, 3)] = np.nan
factor[rolling_null(close, 6)] = np.nan
factor[rolling_stop(stop, 6)] = np.nan
elif factor_id == '016':
high_rank = adj_high.rank(axis=1, pct=True)
volume_rank = adj_volume.rank(axis=1, pct=True)
factor = -1 * high_rank.rolling(window=5).cov(volume_rank)
factor[rolling_null(close, 5)] = np.nan
factor[rolling_stop(stop, 5)] = np.nan
elif factor_id == '017':
temp1 = rolling_rank(adj_close, 10).rank(axis=1, pct=True)
temp2 = adj_close.diff(1).diff(1).rank(axis=1, pct=True)
temp3 = rolling_rank(adj_volume / adj_volume.rolling(window=20).mean(), 5).rank(axis=1, pct=True)
factor = -1 * temp1 * temp2 * temp3
factor[rolling_stop(stop, 20)] = np.nan
factor[rolling_null(close, 25)] = np.nan
factor[rolling_stop(stop, 25)] = np.nan
elif factor_id == '018':
temp1 = adj_close.rolling(window=10).corr(adj_OPEN).replace([-np.inf, np.inf], np.nan)
temp2 = np.abs(adj_close - adj_OPEN).rolling(window=5).std()
factor = -1 * (temp2 + temp1 + adj_close - adj_OPEN).rank(axis=1, pct=True)
factor[rolling_null(close, 10)] = np.nan
factor[rolling_stop(stop, 10)] = np.nan
elif factor_id == '019':
factor = -1 * np.sign(adj_close.diff(7)) * (1 + returns.rolling(window=250).sum())
factor[rolling_null(close, 250)] = np.nan
factor[rolling_stop(stop, 8)] = np.nan
elif factor_id == '020':
temp1 = (adj_OPEN - adj_high.diff(1)).rank(axis=1, pct=True)
temp2 = (adj_OPEN - adj_close.diff(1)).rank(axis=1, pct=True)
temp3 = (adj_OPEN - adj_low.diff(1)).rank(axis=1, pct=True)
factor = -1 * temp1 * temp2 * temp3
factor[rolling_null(close, 2)] = np.nan
factor[rolling_stop(stop, 2)] = np.nan
elif factor_id == '021':
cond_1 = adj_close.rolling(window=8).mean() + adj_close.rolling(window=8).std() < adj_close.rolling(window=2).mean()
@@ -230,47 +252,56 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
factor[cond_2] = 1
factor[np.logical_and(np.logical_not(np.logical_or(cond_1, cond_2)), cond_3)] = 1
factor[np.logical_and(np.logical_not(np.logical_or(cond_1, cond_2)), cond_4)] = -1
factor[rolling_null(close, 20)] = np.nan
factor[rolling_stop(stop, 20)] = np.nan
elif factor_id == '022':
part_1 = adj_high.rolling(window=5).corr(adj_volume).diff(5)
part_2 = adj_close.rolling(window=20).std().rank(axis=1, pct=True)
factor = -1 * part_1 * part_2
factor[rolling_null(close, 20)] = np.nan
factor[rolling_stop(stop, 20)] = np.nan
elif factor_id == '023':
factor = pd.DataFrame(np.nan, index=adj_high.index, columns=adj_high.columns)
factor[adj_high > adj_high.rolling(window=20).mean()] = -1 * adj_high.diff(2)
factor[adj_high <= adj_high.rolling(window=20).mean()] = 0
factor[rolling_null(close, 20)] = np.nan
factor[rolling_stop(stop, 20)] = np.nan
elif factor_id == '024':
cond_1 = adj_close.rolling(window=100).mean().diff(100) / adj_close.shift(100) <= 0.05
factor = -1 * adj_close.diff(3)
factor[cond_1] = -1 * (adj_close - adj_close.rolling(window=100).min())
factor[rolling_null(close, 100)] = np.nan
factor[rolling_stop(stop, 3)] = np.nan
elif factor_id == '025':
part_1 = -1 * returns * adj_volume.rolling(window=20).mean()
part_2 = (value / adj_volume) * (adj_high - adj_close)
part_2 = vwap * (adj_high - adj_close)
factor = (part_1 * part_2).rank(axis=1, pct=True)
factor[rolling_null(close, 20)] = np.nan
factor[rolling_stop(stop, 20)] = np.nan
elif factor_id == '026':
volume_rank = rolling_rank(adj_volume, 5)
high_rank = rolling_rank(adj_high, 5)
factor = -1 * volume_rank.rolling(window=5).corr(high_rank).rolling(window=3).max()
factor[rolling_null(close, 5)] = np.nan
factor[rolling_stop(stop, 5)] = np.nan
elif factor_id == '027':
factor = pd.DataFrame(np.nan, index=volume.index, columns=volume.columns)
volume_rank = adj_volume.rank(axis=1, pct=True)
vwap_rank = (value / adj_volume).rank(axis=1, pct=True)
vwap_rank = vwap.rank(axis=1, pct=True)
corr_ = volume_rank.rolling(window=6).corr(vwap_rank)
corr_rank = corr_.rolling(window=2).mean().rank(axis=1, pct=True)
cond_1 = corr_rank > 0.5
cond_2 = corr_rank <= 0.5
factor[cond_1] = -1
factor[cond_2] = 1
factor[rolling_null(close, 6)] = np.nan
factor[rolling_stop(stop, 6)] = np.nan
elif factor_id == '028':
part_1 = adj_volume.rolling(window=20).mean().rolling(window=5).corr(adj_low)
part_2 = (adj_high + adj_low) / 2 - adj_close
factor = part_1 + part_2
factor = (factor.T / factor.sum(axis=1)).T
factor[rolling_null(close, 20)] = np.nan
factor[rolling_stop(stop, 20)] = np.nan
elif factor_id == '029':
temp1 = rolling_rank(-1 * returns.shift(6), 5)
@@ -278,6 +309,7 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
temp2 = np.log(close_rank.rolling(window=2).min())
temp3 = (temp2.T / temp2.sum(axis=1)).T.rank(axis=1, pct=True)
factor = temp3.rolling(window=5).min() + temp1
factor[rolling_null(close, 6)] = np.nan
factor[rolling_stop(stop, 6)] = np.nan
elif factor_id == '030':
sign_1 = np.sign(adj_close.diff())
@@ -285,6 +317,7 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
sign_3 = np.sign(adj_close.diff().shift(2))
sign_rank = (sign_1 + sign_2 + sign_3)
factor = (1 - sign_rank) * adj_volume.rolling(window=5).sum() / adj_volume.rolling(window=20).sum()
factor[rolling_null(close, 20)] = np.nan
factor[rolling_stop(stop, 20)] = np.nan
elif factor_id == '031':
close_rank_1 = adj_close.diff(10).rank(axis=1, pct=True)
@@ -293,14 +326,15 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
corr_ = adj_volume.rolling(window=20).mean().rolling(window=12).corr(adj_low)
corr_sign = np.sign((corr_.T / corr_.sum(axis=1)).T)
factor = decay_linear_rank + close_rank_2 + corr_sign
factor[rolling_null(close, 20)] = np.nan
factor[rolling_stop(stop, 20)] = np.nan
elif factor_id == '032':
temp1 = adj_close.rolling(window=7).mean() - adj_close
part_1 = (temp1.T / temp1.sum(axis=1)).T
vwap = value / adj_volume
temp2 = vwap.rolling(window=230).corr(adj_close.shift(5))
part_2 = (temp2.T / temp2.sum(axis=1)).T
factor = part_1 + 20 * part_2
factor[rolling_null(close, 230)] = np.nan
factor[rolling_stop(stop, 7)] = np.nan
elif factor_id == '033':
factor = (OPEN / close - 1).rank(axis=1, pct=True)
@@ -309,29 +343,34 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
temp1 = returns.rolling(window=2).std() / returns.rolling(window=5).std()
close_rank = adj_close.diff().rank(axis=1, pct=True)
factor = (1 - temp1.rank(axis=1, pct=True) + 1 - close_rank).rank(axis=1, pct=True)
factor[rolling_null(close, 5)] = np.nan
factor[rolling_stop(stop, 5)] = np.nan
elif factor_id == '035':
volume_rank = rolling_rank(adj_volume, 32)
xx_rank = rolling_rank(adj_close + adj_high - adj_low, 16)
returns_rank = rolling_rank(returns, 32)
factor = volume_rank * (1 - xx_rank) * (1 - returns_rank)
factor[rolling_null(close, 32)] = np.nan
factor[rolling_stop(stop, 32)] = np.nan
elif factor_id == '036':
part_1 = (adj_close - adj_OPEN).rolling(window=15).corr(adj_volume.shift(1)).rank(axis=1, pct=True)
part_2 = (adj_OPEN - adj_close).rank(axis=1, pct=True)
part_3 = rolling_rank(-1 * returns.shift(6), 5).rank(axis=1, pct=True)
part_4 = (value / adj_volume).rolling(window=6).corr(adj_volume.rolling(window=20).mean()).rank(axis=1, pct=True)
part_4 = vwap.rolling(window=6).corr(adj_volume.rolling(window=20).mean()).rank(axis=1, pct=True)
part_5 = ((adj_close.rolling(window=200).mean() - adj_OPEN) * (adj_close - adj_OPEN)).rank(axis=1, pct=True)
factor = 2.21 * part_1 + 0.7 * part_2 + 0.73 * part_3 + part_4 + 0.6 * part_5
factor[rolling_null(close, 200)] = np.nan
factor[rolling_stop(stop, 20)] = np.nan
elif factor_id == '037':
corr_ = (adj_OPEN - adj_close).shift().rolling(window=200).corr(adj_close)
factor = corr_.rank(axis=1, pct=True) + (adj_OPEN - adj_close).rank(axis=1, pct=True)
factor[rolling_null(close, 200)] = np.nan
factor[stop.notnull()] = np.nan
elif factor_id == '038':
part_1 = rolling_rank(adj_close, 10).rank(axis=1, pct=True)
part_2 = (close / OPEN).rank(axis=1, pct=True)
factor = -1 * part_1 * part_2
factor[rolling_null(close, 10)] = np.nan
factor[rolling_stop(stop, 10)] = np.nan
elif factor_id == '039':
temp1 = adj_volume / adj_volume.rolling(window=20).mean()
@@ -339,24 +378,27 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
part_1 = (adj_close.diff(7) * (1 - decay_linear_rank)).rank(axis=1, pct=True)
part_2 = returns.rolling(window=250).sum().rank(axis=1, pct=True)
factor = -1 * part_1 * (1 + part_2)
factor[rolling_null(close, 20)] = np.nan
factor[rolling_stop(stop, 20)] = np.nan
elif factor_id == '040':
factor = -1 * adj_high.rolling(window=10).std().rank(axis=1, pct=True) * adj_high.rolling(window=10).corr(adj_volume)
factor[rolling_null(close, 10)] = np.nan
factor[rolling_stop(stop, 10)] = np.nan
elif factor_id == '041':
factor = ((high * low) ** 0.5 - (value / volume) * 10)
factor = ((adj_high * adj_low) ** 0.5 - vwap * 10)
factor[stop.notnull()] = np.nan
elif factor_id == '042':
vwap = value / volume
factor = (vwap - close).rank(axis=1, pct=True) / (vwap + close).rank(axis=1, pct=True)
factor = (vwap - adj_close).rank(axis=1, pct=True) / (vwap + adj_close).rank(axis=1, pct=True)
factor[stop.notnull()] = np.nan
elif factor_id == '043':
part_1 = rolling_rank(adj_volume / adj_volume.rolling(window=20).mean(), 20)
part_2 = rolling_rank(-1 * adj_close.diff(7), 8)
factor = part_1 * part_2
factor[rolling_null(close, 20)] = np.nan
factor[rolling_stop(stop, 20)] = np.nan
elif factor_id == '044':
factor = -1 * adj_high.rolling(window=5).corr(adj_volume.rank(axis=1, pct=True))
factor[rolling_null(close, 5)] = np.nan
factor[rolling_stop(stop, 5)] = np.nan
elif factor_id == '045':
part_1 = adj_close.shift(5).rolling(window=20).mean().rank(axis=1, pct=True)
@@ -365,6 +407,7 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
temp2 = adj_close.rolling(window=20).sum()
part_3 = temp1.rolling(window=2).corr(temp2).rank(axis=1, pct=True)
factor = -1 * part_1 * part_2 * part_3
factor[rolling_null(close, 20)] = np.nan
factor[rolling_stop(stop, 20)] = np.nan
elif factor_id == '046':
factor = -1 * adj_close.diff(1)
@@ -374,13 +417,14 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
cond_2 = temp1 - temp2 < 0
factor[cond_2] = 1
factor[cond_1] = -1
factor[rolling_null(close, 20)] = np.nan
factor[rolling_stop(stop, 20)] = np.nan
elif factor_id == '047':
part_1 = (1 / adj_close).rank(axis=1, pct=True) * adj_volume / adj_volume.rolling(window=20).mean()
part_2 = adj_high * (adj_high - adj_close).rank(axis=1, pct=True) / adj_high.rolling(window=5).mean()
vwap = value / adj_volume
part_3 = vwap.diff(5).rank(axis=1, pct=True)
factor = part_1 * part_2 * part_3
factor[rolling_null(close, 20)] = np.nan
factor[rolling_stop(stop, 20)] = np.nan
elif factor_id == '048':
temp1 = adj_close.diff().rolling(window=250).corr(adj_close.shift().diff())
@@ -388,18 +432,21 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
part_1 = ind_neutral(temp2, ind)
part_2 = ((adj_close.diff() / adj_close.shift()) ** 2).rolling(window=250).sum()
factor = part_1 / part_2
factor[stop.notnull()] = np.nan
factor[rolling_null(close, 250)] = np.nan
factor[rolling_stop(stop, 2)] = np.nan
elif factor_id == '049':
factor = -1 * adj_close.diff()
temp1 = (adj_close.shift(20) - adj_close.shift(10)) / 10
temp2 = (adj_close.shift(10) - adj_close) / 10
factor[temp1 - temp2 < 0.1] = 1
factor[rolling_null(close, 20)] = np.nan
factor[rolling_stop(stop, 20)] = np.nan
elif factor_id == '050':
volume_rank = adj_volume.rank(axis=1, pct=True)
vwap_rank = (value / adj_volume).rank(axis=1, pct=True)
vwap_rank = vwap.rank(axis=1, pct=True)
corr_ = volume_rank.rolling(window=5).corr(vwap_rank)
factor = -1 * rolling_rank(corr_.rank(axis=1, pct=True), 5)
factor[rolling_null(close, 5)] = np.nan
factor[rolling_stop(stop, 5)] = np.nan
elif factor_id == '051':
factor = -1 * adj_close.diff()
@@ -407,15 +454,18 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
temp2 = (adj_close.shift(10) - adj_close) / 10
cond = temp1 - temp2 < -0.05
factor[cond] = 1
factor[rolling_null(close, 10)] = np.nan
factor[rolling_stop(stop, 10)] = np.nan
elif factor_id == '052':
part_1 = -1 * adj_low.rolling(window=5).min().diff(5)
part_2 = (returns.rolling(window=240).sum() - returns.rolling(window=20).sum()) / 220
factor = part_1 * part_2.rank(axis=1, pct=True) * rolling_rank(adj_volume, 5)
factor[rolling_null(close, 5)] = np.nan
factor[rolling_stop(stop, 5)] = np.nan
elif factor_id == '053':
temp = ((close - low) - (high - close)) / (close - low)
factor = -1 * temp.diff(9)
factor[rolling_null(close, 9)] = np.nan
factor[rolling_stop(stop, 9)] = np.nan
elif factor_id == '054':
factor = -1 * (low - close) * (OPEN ** 5) / ((low - high) * (close ** 5))
@@ -428,32 +478,36 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
fraction_rank = fraction.rank(axis=1, pct=True)
volume_rank = volume.replace(0, np.nan).rank(axis=1, pct=True)
factor = -1 * fraction_rank.rolling(window=6).corr(volume_rank)
factor[rolling_null(close, 12)] = np.nan
factor[rolling_stop(stop, 12)] = np.nan
elif factor_id == '056':
temp1 = returns.rolling(window=10).sum()
temp2 = returns.rolling(window=2).sum().rolling(window=3).sum()
part_1 = (temp1 / temp2).rank(axis=1, pct=True)
part_2 = (returns * cap).rank(axis=1, pct=True)
factor = -1 * part_1 * part_2
factor[rolling_stop(stop, 10)] = np.nan
factor[rolling_null(close, 12)] = np.nan
factor[rolling_stop(stop, 12)] = np.nan
elif factor_id == '057':
part_1 = adj_close - value / adj_volume
part_1 = adj_close - vwap
temp = adj_close.rolling(window=30).apply(np.argmax).rank(axis=1, pct=True)
part_2 = linear_decay(temp, 2)
factor = -1 * part_1 / part_2
factor[rolling_null(close, 30)] = np.nan
factor[rolling_stop(stop, 30)] = np.nan
elif factor_id == '058':
vwap = value / adj_volume
temp1 = ind_neutral(vwap, ind)
temp2 = temp1.rolling(window=3).corr(adj_volume)
temp3 = linear_decay(temp2, 7)
factor = -1 * rolling_rank(temp3, 5)
factor[rolling_null(close, 7)] = np.nan
factor[rolling_stop(stop, 7)] = np.nan
elif factor_id == '059':
vwap = value / adj_volume
temp1 = vwap * 0.728317 + vwap * (1 - 0.728317)
temp2 = ind_neutral(temp1, ind)
temp3 = temp2.rolling(window=4).corr(adj_volume)
factor = -1 * rolling_rank(linear_decay(temp3, 16), 8)
factor[rolling_null(close, 16)] = np.nan
factor[rolling_stop(stop, 16)] = np.nan
elif factor_id == '060':
temp1 = adj_volume * ((adj_close - adj_low) - (adj_high - adj_close)) / (adj_high - adj_low)
@@ -462,40 +516,43 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
temp3 = adj_close.rolling(window=10).apply(np.argmax).rank(axis=1, pct=True)
part_2 = (temp3.T / temp3.sum(axis=1)).T
factor = -1 * (2 * part_1 - part_2)
factor[rolling_null(close, 10)] = np.nan
factor[rolling_stop(stop, 10)] = np.nan
elif factor_id == '061':
vwap = value / adj_volume
adv180 = adj_volume.rolling(window=180).mean()
part_1 = (vwap - vwap.rolling(window=16).min()).rank(axis=1, pct=True)
part_2 = vwap.rolling(window=17).corr(adv180).rank(axis=1, pct=True)
factor = part_1
factor[part_1 < part_2] = 1
factor[part_1 >= part_2] = 0
factor[rolling_null(close, 180)] = np.nan
factor[rolling_stop(stop, 16)] = np.nan
elif factor_id == '062':
vwap = value / adj_volume
adv20 = adj_volume.rolling(window=20).mean()
part_1 = vwap.rolling(window=9).corr(adv20.rolling(window=22).sum()).rank(axis=1, pct=True)
temp1 = 2 * adj_OPEN.rank(axis=1, pct=True)
temp2 = ((adj_high + adj_low) / 2).rank(axis=1, pct=True) + adj_high.rank(axis=1, pct=True)
temp3 = temp1
temp3[temp1 < temp2] = 1
temp3[temp1 <= temp2] = 0
temp3[temp1 >= temp2] = 0
part_2 = temp3.rank(axis=1, pct=True)
factor = part_1
factor[part_1 < part_2] = 1
factor[part_1 >= part_2] = 0
factor = -1 * factor
factor[rolling_null(close, 22)] = np.nan
factor[rolling_stop(stop, 22)] = np.nan
elif factor_id == '063':
temp1 = ind_neutral(adj_close, ind).diff(2)
part_1 = linear_decay(temp1, 8).rank(axis=1, pct=True)
temp2 = (value / adj_volume) * 0.318108 + adj_OPEN * (1 - 0.318108)
temp2 = vwap * 0.318108 + adj_OPEN * (1 - 0.318108)
temp3 = adj_volume.rolling(window=180).mean().rolling(window=37).sum()
temp4 = temp2.rolling(window=13).corr(temp3)
part_2 = linear_decay(temp4, 12).rank(axis=1, pct=True)
factor = -1 * (part_1 - part_2)
factor[rolling_null(close, 180)] = np.nan
factor[rolling_stop(stop, 13)] = np.nan
elif factor_id == '064':
vwap = value / adj_volume
adv120 = adj_volume.rolling(window=120).mean()
temp1 = (adj_OPEN * 0.178404 + adj_low * (1 - 0.178404)).rolling(window=12).sum()
temp2 = adv120.rolling(window=12).sum()
@@ -506,8 +563,9 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
factor[part_1 < part_2] = 1
factor[part_1 >= part_2] = 0
factor = -1 * factor
factor[rolling_null(close, 120)] = np.nan
factor[rolling_stop(stop, 16)] = np.nan
elif factor_id == '065':
vwap = value / adj_volume
adv60 = adj_volume.rolling(window=60).mean()
temp1 = adj_OPEN * 0.00817205 + vwap * (1 - 0.00817205)
temp2 = adv60.rolling(window=8).sum()
@@ -517,52 +575,56 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
factor[part_1 < part_2] = 1
factor[part_1 >= part_2] = 0
factor = -1 * factor
factor[rolling_null(close, 60)] = np.nan
factor[rolling_stop(stop, 13)] = np.nan
elif factor_id == '066':
vwap = value / adj_volume
part_1 = linear_decay(vwap.diff(3), 7).rank(axis=1, pct=True)
temp1 = (adj_low - vwap) / (adj_OPEN - (high + low) / 2)
temp2 = linear_decay(temp1, 11)
part_2 = rolling_rank(temp2, 6)
factor = -1 * (part_1 + part_2)
factor[rolling_null(close, 11)] = np.nan
factor[rolling_stop(stop, 11)] = np.nan
elif factor_id == '067':
part_1 = (adj_high - adj_high.rolling(window=2).min()).rank(axis=1, pct=True)
temp1 = ind_neutral(value / adj_volume, ind)
temp1 = ind_neutral(vwap, ind)
temp2 = ind_neutral(adj_volume.rolling(window=20).mean(), ind)
part_2 = temp1.rolling(window=6).corr(temp2).rank(axis=1, pct=True)
factor = -1 * (part_1 ** part_2)
factor[rolling_null(close, 20)] = np.nan
factor[rolling_stop(stop, 20)] = np.nan
elif factor_id == '068':
adv15 = adj_volume.rolling(window=15).mean()
high_rank = adj_high.rank(axis=1, pct=True)
adv15_rank = adv15.rank(axis=1, pct=True)
part_1 = rolling_rank(high_rank.rolling(window=8).corr(adv15_rank), 13)
temp = adj_close * 0.518371 + adj_low * (1 - 0.518371)
part_2 = temp.diff(1).rank(axis=1, pct=True)
factor = part_1
factor[part_1 < part_2] = 1
factor[part_1 >= part_2] = 0
factor = part_1.sort(axis=1)
factor[part_1.sort(axis=1) < part_2.sort(axis=1)] = 1
factor[part_1.sort(axis=1) >= part_2.sort(axis=1)] = 0
factor = -1 * factor
factor[rolling_null(close, 15)] = np.nan
factor[rolling_stop(stop, 15)] = np.nan
elif factor_id == '069':
vwap = value / adj_volume
temp1 = ind_neutral(vwap, ind).diff(2)
part_1 = temp1.rolling(window=4).max().rank(axis=1, pct=True)
temp2 = adj_close * 0.490655 + vwap * (1 - 0.490655)
temp3 = adj_volume.rolling(window=20).mean()
part_2 = rolling_rank(temp2.rolling(window=4).corr(temp3), 9)
factor = -1 * (part_1 ** part_2)
factor[rolling_null(close, 20)] = np.nan
factor[rolling_stop(stop, 20)] = np.nan
elif factor_id == '070':
part_1 = (value / adj_volume).diff(1).rank(axis=1, pct=True)
part_1 = vwap.diff(1).rank(axis=1, pct=True)
temp1 = ind_neutral(adj_close, ind)
temp2 = adj_volume.rolling(window=50).mean()
part_2 = rolling_rank(temp1.rolling(window=17).corr(temp2), 17)
factor = -1 * (part_1 ** part_2)
factor[rolling_null(close, 50)] = np.nan
factor[rolling_stop(stop, 17)] = np.nan
elif factor_id == '071':
adv180 = adj_volume.rolling(window=180).mean()
vwap = value / adj_volume
adv180_rank = rolling_rank(adv180, 12)
close_rank = rolling_rank(adj_close, 3)
corr_ = close_rank.rolling(window=18).corr(adv180_rank)
@@ -571,29 +633,28 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
part_2 = rolling_rank(linear_decay(temp, 16), 4)
factor = part_1
factor[part_1 < part_2] = part_2
factor[rolling_null(close, 180)] = np.nan
factor[rolling_stop(stop, 18)] = np.nan
elif factor_id == '072':
adv40 = adj_volume.rolling(window=40).mean()
vwap = value / adj_volume
corr_1 = ((adj_high + adj_low) / 2).rolling(window=8).corr(adv40)
part_1 = linear_decay(corr_1, 10).rank(axis=1, pct=True)
corr_2 = (rolling_rank(vwap, 3).rolling(window=6).corr(rolling_rank(volume, 18)))
part_2 = linear_decay(corr_2, 2).rank(axis=1, pct=True)
factor = part_1 / part_2
factor[rolling_null(close, 40)] = np.nan
factor[rolling_stop(stop, 18)] = np.nan
elif factor_id == '073':
vwap = value / adj_volume
part_1 = linear_decay(vwap.diff(4), 2).rank(axis=1, pct=True)
temp1 = adj_OPEN * 0.147155 + adj_low * (1 - 0.147155)
part_2 = rolling_rank(linear_decay(-1 * temp1.diff(2) / temp1, 3), 16)
.diff(2)
temp2 = adj_OPEN * 0.147155 + adj_low * (1 - 0.147155)
factor = part_1
factor[part_1 < part_2] = part_2
factor = -1 * factor
factor[rolling_null(close, 16)] = np.nan
factor[rolling_stop(stop, 16)] = np.nan
elif factor_id == '074':
vwap = value / adj_volume
adv30 = adj_volume.rolling(window=30).mean()
sum_adv30 = adv30.rolling(window=37).sum()
corr_1 = adj_close.rolling(window=15).corr(sum_adv30)
@@ -606,8 +667,9 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
factor[part_1 < part_2] = 1
factor[part_1 >= part_2] = 0
factor = -1 * factor
factor[rolling_null(close, 67)] = np.nan
factor[rolling_stop(stop, 30)] = np.nan
elif factor_id == '075':
vwap = value / adj_volume
part_1 = vwap.rolling(window=4).corr(adj_volume).rank(axis=1, pct=True)
low_rank = adj_low.rank(axis=1, pct=True)
adv50_rank = adj_volume.rolling(window=50).mean().rank(axis=1, pct=True)
@@ -615,8 +677,9 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
factor = part_1
factor[part_1 < part_2] = 1
factor[part_1 >= part_2] = 0
factor[rolling_null(close, 50)] = np.nan
factor[rolling_stop(stop, 12)] = np.nan
elif factor_id == '076':
vwap = value / adj_volume
adv81 = adj_volume.rolling(window=81).mean()
part_1 = linear_decay(vwap.diff(1), 11).rank(axis=1, pct=True)
low_ind = ind_neutral(adj_low, ind)
@@ -625,9 +688,9 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
factor = part_1
factor[part_1 < part_2] = part_2
factor = -1 * factor
factor[rolling_stop(stop, 20)] = np.nan
factor[rolling_null(close, 81)] = np.nan
factor[rolling_stop(stop, 19)] = np.nan
elif factor_id == '077':
vwap = value / adj_volume
adv40 = adj_volume.rolling(window=40).mean()
temp1 = (adj_high + adj_low) / 2 + adj_high - (vwap +adj_high)
part_1 = linear_decay(temp1, 20).rank(axis=1, pct=True)
@@ -636,19 +699,19 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
part_2 = linear_decay(corr_, 5).rank(axis=1, pct=True)
factor = part_1
factor[part_1 > part_2] = part_2
factor[rolling_null(close, 43)] = np.nan
factor[rolling_stop(stop, 20)] = np.nan
elif factor_id == '078':
vwap = value / adj_volume
temp1 = (adj_low * 0.352233 + vwap * (1 - 0.352233)).rolling(window=19).sum()
temp2 = adj_volume.rolling(window=40).mean().rolling(window=19).sum()
part_1 = temp1.rolling(window=6).corr(temp1).rank(axis=1, pct=True)
part_1 = temp1.rolling(window=6).corr(temp2).rank(axis=1, pct=True)
vwap_rank = vwap.rank(axis=1, pct=True)
volume_rank = volume.rank(axis=1, pct=True)
part_2 = vwap_rank.rolling(window=5).corr(volume_rank).rank(axis=1, pct=True)
factor = part_1 ** part_2
factor[rolling_stop(stop, 20)] = np.nan
factor[rolling_null(close, 59)] = np.nan
factor[rolling_stop(stop, 5)] = np.nan
elif factor_id == '079':
vwap = value / adj_volume
adv150 = adj_volume.rolling(window=150).mean()
temp = adj_close * 0.60733 + adj_OPEN * (1 - 0.60733)
part_1 = ind_neutral(temp, ind).diff(1).rank(axis=1, pct=True)
@@ -658,27 +721,31 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
factor = part_1
factor[part_1 < part_2] = 1
factor[part_1 >= part_2] = 0
factor[rolling_null(close, 150)] = np.nan
factor[rolling_stop(stop, 9)] = np.nan
elif factor_id == '080':
temp1 = ind_neutral(adj_OPEN * 0.868128 + adj_high * (1 - 0.868128), ind)
part_1 = np.sign(temp1.diff(4)).rank(axis=1, pct=True)
adv10 = adj_volume.rolling(window=10).mean()
part_2 = rolling_rank(adj_high.rolling(window=5).corr(adv10), 5)
factor = -1 * (part_1 ** part_2)
factor[rolling_null(close, 10)] = np.nan
factor[rolling_stop(stop, 10)] = np.nan
elif factor_id == '081':
vwap = value / adj_volume
adv10 = adj_volume.rolling(window=10).mean()
sum_adv10 = adv10.rolling(window=49).sum()
corr_ = vwap.rolling(window=8).corr(sum_adv10)
corr_rank = corr_.rank(axis=1, pct=True)
part_1 = np.log(corr_rank.rolling(window=14).product()).rank(axis=1, pct=True)
vwap_rank = vwap_ind.rank(axis=1, pct=True)
part_1 = np.log(corr_rank.rolling(window=14).apply(np.prod)).rank(axis=1, pct=True)
vwap_rank = vwap.rank(axis=1, pct=True)
volume_rank = volume.rank(axis=1, pct=True)
part_2 = vwap_rank.rolling(window=5).corr(volume_rank).rank(axis=1, pct=True)
factor = part_1
factor[part_1 < part_2] = 1
factor[part_1 >= part_2] = 0
factor = -1 * factor
factor[rolling_null(close, 59)] = np.nan
factor[rolling_stop(stop, 14)] = np.nan
elif factor_id == '082':
part_1 = linear_decay(adj_OPEN.diff(), 14).rank(axis=1, pct=True)
volume_ind = ind_neutral(adj_volume, ind)
@@ -687,18 +754,20 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
factor = part_1
factor[part_1 > part_2] = part_2
factor = -1 * factor
factor[rolling_null(close, 17)] = np.nan
factor[rolling_stop(stop, 17)] = np.nan
elif factor_id == '083':
temp1 = (adj_high - adj_low) / adj_close.rolling(window=5).mean()
part_1 = temp1.shift(2).rank(axis=1, pct=True) * adj_volume.rank(axis=1, pct=True)
part_2 = temp1 / (value / adj_volume - adj_close)
part_2 = temp1 / (vwap - adj_close)
factor = part_1 / part_2
factor[rolling_null(close, 5)] = np.nan
factor[rolling_stop(stop, 5)] = np.nan
elif factor_id == '084':
vwap = value / adj_volume
part_1 = rolling_rank(vwap - vwap.rolling(window=15).max(), 20)
part_2 = adj_close.diff(4)
factor = part_1 ** part_2
factor[rolling_null(close, 35)] = np.nan
factor[rolling_stop(stop, 20)] = np.nan
elif factor_id == '085':
temp1 = adj_high * 0.876703 + adj_close * (1 - 0.876703)
@@ -709,19 +778,21 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
volume_rank = rolling_rank(volume, 10)
corr_2 = hl_rank.rolling(window=7).corr(volume_rank)
part_2 = corr_2.rank(axis=1, pct=True)
factor = part_1 ** part_2
factor[rolling_null(close, 30)] = np.nan
factor[rolling_stop(stop, 30)] = np.nan
elif factor_id == '086':
vwap = value / adj_volume
adv20 = adj_volume.rolling(window=20).mean()
sum_adv20 = adv10.rolling(window=14).sum()
sum_adv20 = adv20.rolling(window=14).sum()
part_1 = rolling_rank(adj_close.rolling(window=6).corr(sum_adv20), 20)
part_2 = (adj_close - vwap).rank(axis=1, pct=True)
factor = part_1
factor[part_1 < part_2] = 1
factor[part_1 >= part_2] =0
factor = -1 * factor
factor[rolling_null(close, 60)] = np.nan
factor[rolling_stop(stop, 20)] = np.nan
elif factor_id == '087':
vwap = value / adj_volume
adv81 = adj_volume.rolling(window=81).mean()
temp1 = adj_close * 0.369701 + vwap * (1 - 0.369701)
part_1 = linear_decay(temp1.diff(1), 2).rank(axis=1, pct=True)
@@ -731,27 +802,29 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
factor = part_1
factor[part_1 < part_2] = part_2
factor = -1 * factor
factor[rolling(stop, 13)] = np.nan
factor[rolling_null(close, 108)] = np.nan
factor[rolling_stop(stop, 14)] = np.nan
elif factor_id == '088':
temp1 = (adj_OPEN.rank(axis=1, pct=True) + adj_low.rank(axis=1, pct=True) -
adj_high.rank(axis=1, pct=True) - adj_close.rank(axis=1, cpt=True))
adj_high.rank(axis=1, pct=True) - adj_close.rank(axis=1, pct=True))
part_1 = linear_decay(temp1, 8).rank(axis=1, pct=True)
close_rank = rolling_rank(adj_close, 8)
adv60 = adj_volume.rolling(window=60).mean()
adv60_rank = rolling_rank(adv60_rank, 20)
adv60_rank = rolling_rank(adv60, 20)
corr_ = close_rank.rolling(window=8).corr(adv60_rank)
part_2 = rolling_rank(linear_decay(corr_, 6), 2)
factor = part_1
factor[part_1 > part_2] = part_2
factor[rolling_null(close, 88)] = np.nan
factor[rolling_stop(stop, 20)] = np.nan
elif factor_id == '089':
vwap = value / adj_volume
adv10 = adj_volume.rolling(window=10).mean()
corr_ = adj_low.rolling(window=6).corr(adv10)
part_1 = rolling_rank(linear_decay(corr_, 5), 3)
vwap_ind = ind_neutral(vwap, ind)
part_2 = rolling_rank(linear_decay(vwap_ind.diff(3), 10), 15)
factor = part_1 - part_2
factor[rolling_null(close, 28)] = np.nan
factor[rolling_stop(stop, 10)] = np.nan
elif factor_id == '090':
part_1 = (adj_close - adj_close.rolling(window=4).max()).rank(axis=1, pct=True)
@@ -759,6 +832,7 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
corr_ = adv_ind.rolling(window=5).corr(adj_low)
part_2 = rolling_rank(corr_, 3)
factor = -1 * (part_1 ** part_2)
factor[rolling_null(close, 48)] = np.nan
factor[rolling_stop(stop, 5)] = np.nan
elif factor_id == '091':
close_ind = ind_neutral(adj_close, ind)
@@ -767,7 +841,8 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
corr_2 = (value / adj_volume).rolling(window=4).corr(adj_volume.rolling(window=30).mean())
part_2 = linear_decay(corr_2, 2).rank(axis=1, pct=True)
factor = -1 * (part_1 - part_2)
factor[rolling_stop(stop, 30)] = np.nan
factor[rolling_null(close, 32)] = np.nan
factor[rolling_stop(stop, 32)] = np.nan
elif factor_id == '092':
temp1 = (adj_high + adj_low) / 2 + adj_close
temp2 = adj_low + adj_OPEN
@@ -781,22 +856,26 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
part_2 = rolling_rank(linear_decay(corr_, 6), 6)
factor = part_1
factor[part_1 > part_2] = part_2
factor[rolling_null(close, 43)] = np.nan
factor[rolling_stop(stop, 18)] = np.nan
elif factor_id == '093':
vwap = value / adj_volume
ind_vwap = ind_neutral(vwap, ind)
corr_ = ind_vwap.rolling(window=17).corr(adj_volume.rolling(window=81).mean())
part_1 = rolling_rank(linear_decay(corr_, 19), 7)
temp1 = (adj_close * 0.52434 + vwap * (1 - 0.524434)).diff(2)
part_2 = linear_decay(temp1, 16).rank(axis=1, pct=True)
factor = part_1 / part_2
factor[rolling_null(close, 43)] = np.nan
factor[rolling_stop(stop, 19)] = np.nan
elif factor_id == '094':
vwap = value / adj_volume
part_1 = (vwap - vwap.rolling(window=11).min()).rank(axis=1, pct=True)
vwap_rank = rolling_rank(vwap, 19)
adv_rank = rolling_rank(adj_volume.rolling(window=60).mean(), 4)
corr_ = vwap_rank.rolling(window=18).corr(adv_rank)
part_2 = rolling_rank(corr_, 2)
factor = -1 * (part_1 ** part_2)
factor[rolling_null(close, 82)] = np.nan
factor[rolling_stop(stop, 20)] = np.nan
elif factor_id == '095':
adv40 = adj_volume.rolling(window=40).mean()
part_1 = (adj_OPEN - adj_OPEN.rolling(window=12).min()).rank(axis=1, pct=True)
@@ -807,8 +886,10 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
factor = part_1
factor[part_1 < part_2] = 1
factor[part_1 >= part_2] = 0
factor[rolling_null(close, 71)] = np.nan
factor[rolling_stop(stop, 19)] = np.nan
elif factor_id == '096':
vwap_rank = (value / adj_volume).rank(axis=1, pct=True)
vwap_rank = vwap.rank(axis=1, pct=True)
volume_rank = adj_volume.rank(axis=1, pct=True)
corr_1 = vwap_rank.rolling(window=3).corr(volume_rank)
part_1 = rolling_rank(linear_decay(corr_1, 4), 8)
@@ -819,8 +900,9 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
part_2 = rolling_rank(linear_decay(corr_2.rolling(window=12).apply(np.argmax), 14), 13)
part_1[part_1 < part_2] = part_2
factor = -1 * part_1
factor[rolling_null(close, 80)] = np.nan
factor[rolling_stop(stop, 12)] = np.nan
elif factor_id == '097':
vwap = value / adj_volume
temp = adj_low * 0.721001 + vwap * (1 - 0.721001)
indneu_diff = ind_neutral(temp, ind).diff(3)
part_1 = linear_decay(indneu_diff, 20).rank(axis=1, pct=True)
@@ -830,9 +912,10 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
corr_rank = rolling_rank(corr_, 18)
part_2 = rolling_rank(linear_decay(corr_rank, 15), 6)
factor = -1 * (part_1 - part_2)
factor[rolling_null(close, 103)] = np.nan
factor[rolling_stop(stop, 20)] = np.nan
elif factor_id == '098':
temp1 = (value / adj_volume).rolling(window=4).corr(adj_volume.rolling(window=5).mean())
temp1 = vwap.rolling(window=4).corr(adj_volume.rolling(window=5).mean())
part_1 = linear_decay(temp1, 7).rank(axis=1, pct=True)
open_rank = adj_OPEN.rank(axis=1, pct=True)
adv_rank = adj_volume.rolling(window=15).mean().rank(axis=1, pct=True)
@@ -840,6 +923,7 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
ts_argmin = corr_.rolling(window=8).apply(np.argmin)
part_2 = linear_decay(rolling_rank(ts_argmin, 6), 8).rank(axis=1, pct=True)
factor = part_1 - part_2
factor[rolling_null(close, 42)] = np.nan
factor[rolling_stop(stop, 20)] = np.nan
elif factor_id == '099':
adv60 = adj_volume.rolling(window=60).mean()
@@ -851,6 +935,8 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
factor[part_1 < part_2] = 1
factor[part_1 >= part_2] =0
factor = -1 * factor
factor[rolling_null(close, 87)] = np.nan
factor[rolling_stop(stop, 19)] = np.nan
elif factor_id == '100':
temp1 = adj_volume * ((adj_close - adj_low) - (adj_high - adj_close)) / (adj_high - adj_low)
temp2 = ind_neutral(temp1.rank(axis=1, pct=True), ind)
@@ -861,6 +947,7 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
temp4 = ind_neutral(corr_ - close_rank, ind)
part_2 = (temp4.T / temp4.sum(axis=1)).T
factor = -1 * (1.5 * part_1 - part_2) * (adj_volume / adj_volume.rolling(window=20).mean())
factor[rolling_null(close, 30)] = np.nan
factor[rolling_stop(stop, 30)] = np.nan
elif factor_id == '101':
factor = (close - OPEN) / ((high - low) + 0.001)
@@ -891,11 +978,10 @@ def factor_cal(data, factor_id, no_zdt=False, no_st=False, no_new=False):
# 将st股票的因子值设为na
if no_st:
factor[st.notnull()] = np.nan
# 将st股票(上市小于63天)的因子设为na
if no_new:
factor[rolling_new(close, 63)] = np.nan
print '计算完成\n保存因子'
save_factor(factor, factor_id, no_zdt)
print '计算完成'
if save:
print '保存因子'
save_factor(factor, factor_id, no_zdt)
return factor
@@ -1053,7 +1139,7 @@ data = {'high': high,
'price_adj_f': price_adj_f}
factor = factor_cal(data, '051', no_zdt=False, no_st=False, no_new=False)
factor = factor_cal(data, '004', no_zdt=False, no_st=False, no_new=False)
factor_006 = factor_cal(data, '006', no_zdt=False)
factors = pd.concat([factor.stack(), factor_006.stack()], axis=1)
days = factors.index.levels[0]
@@ -1068,10 +1154,10 @@ temp_ = factor_.stack()
temp_.plot(kind='hist', bins=20)
temp_[temp_>0.1]
summary = factor_summary(factor_['2013-01-01':].dropna(axis=0, how='all'))
summary = factor_summary(factor['2013-01-01':].dropna(axis=0, how='all'))
summary.ix[:, ['mean', 'std', '10%', '90%']].plot(figsize=(10, 10))
ic_series = ic(factor_, 'close-close', 20, data, by_day=True)
ic_series = ic(factor, 'close-close', 20, data, by_day=True)
title = '60 days moving average of IC (absolute value)'
np.abs(ic_series).rolling(window=60).mean().plot(figsize=(14, 7), title=title)
@@ -1082,11 +1168,11 @@ temp.index.name = factor_name
temp.to_csv('F:\Strategies\World_Quant_Alphas\#%s\%s.csv' %
('101', factor_name))
stt = factor_['2013-01-07':].dropna(axis=0, how='all')
stt = factor['2013-01-07':].dropna(axis=0, how='all')
stt = np.abs(stt.T - stt.mean(axis=1)).T
stt.mean(axis=1).mean()
a = group_analysis(stt, data, 'close-close', period=20, bins=10, cut_mode='quantile')
a = group_analysis(stt, data, 'close-close', period=50, bins=10, cut_mode='quantile')
a['group_return'].mean().plot(kind='bar')
a['group_mean'].mean().plot()
(a['group_return'] + 1).cumprod().plot(figsize=(14, 7))