优化了PE计算部分逻辑,PE计算可自定义采样周期,序列增量更新加速计算
```
def pe_init(context):
days = get_trade_days('2015-01-01', context.previous_date)
datelist = days[::5]
df_list = []
g.pe_stocks = get_index_stocks(g.sector, date=datelist[0])
for date in datelist:
if date.month == 6 or date.month == 12: # 每年6月 12月 沪深300调整,成分股变化
g.pe_stocks = get_index_stocks(g.sector, date=date)
q = query(valuation.code, valuation.pubDate, valuation.market_cap, valuation.pe_ratio).filter(
valuation.code.in_(g.pe_stocks))
df = get_fundamentals(q, date)
df_list.append(df)
df = pd.concat(df_list, ignore_index=True)
g.s_pe = df.groupby('pubDate').apply(lambda dx: sum(dx['market_cap']) / sum(dx['market_cap'] / dx['pe_ratio']))
def pe_check(context):
date=context.previous_date
if date.month == 6 or date.month == 12: # 每年6月 12月 沪深300调整,成分股变化
g.pe_stocks = get_index_stocks(g.sector, date=date)
q = query(valuation.code, valuation.pubDate,valuation.market_cap, valuation.pe_ratio).filter(valuation.code.in_(g.pe_stocks))
df = get_fundamentals(q, context.previous_date)
pe=sum(df['market_cap']) / sum(df['market_cap'] / df['pe_ratio'])
g.s_pe[str(context.previous_date)]=pe
g.flag = 0
pe_mean=g.s_pe.rolling(3).mean()
zws_50 = g.s_pe.median()
if pe_mean[-2] < pe_mean[-1] < zws_50:
log.info("Pe上行,操作股票:")
g.flag = 1
else:
log.info("Pe下行或超出中位数值,空仓:")
return g.flag
```
2020-07-27