市盈率策略初探
2017-05-06 本文已影响104人
哈劳斯军士
据说刘士余同志是个好同志,引领A股走向价值投资,那么我看看看价值投资到底行不行。
又听说市盈率因子在上半年还是很猛的,那就先来个市盈率试个水。
偷懒就用tushare的均线数据了,鉴于get_stocks_basics()的市盈率数据乱七八糟,我现在有点不太相信这玩意了。
'''
Created on: 5th,May,2017
@Author: 哈老四_好的ID是成功一半
低pe代表着价值洼地,但同时也意味着动量不足,
我们再来个多头排列趋势筛选。
'''
import tushare as ts
def stock_pool(context, bar_dict):
#筛选出pe在1到20间的股票
fundamental_df = get_fundamentals( #返回一个DataFrame
query(
fundamentals.eod_derivative_indicator.pe_ratio
).filter(
fundamentals.eod_derivative_indicator.pe_ratio > 5
).filter(
fundamentals.eod_derivative_indicator.pe_ratio < 20
).order_by(
fundamentals.eod_derivative_indicator.pe_ratio.asc()
).limit(50)
).T #转置,否则返回的是个横表
RAW_LIST = []
BANK_LIST = industry('J66') # 银行股列表
for i in fundamental_df.index: # 踢掉st\停盘的\银行股
if (is_suspended(i) == 0) and (is_st_stock(i) == 0) and (i not in BANK_LIST):
RAW_LIST.append(i)
else:
pass
# context.rawlist = RAW_LIST
# logger.info(context.rawlist)
#由于tushare集成了MA5,MA10,MA20,先用辣鸡数据试一下,日后如果有需求再用rollingmean()算
#创建一个列表,储存多头排列的股票
MULT_LIST = []
current_date = str(context.now)[0:10] #获取当前日期戳
for i in RAW_LIST:
code = i[0:6]
try:
hisdata = ts.get_hist_data(code,end=current_date) # 获取历史数据
traday = len(hisdata.index)
if traday > 30: # 交易一个月以上的股票
if (hisdata.iloc[0, 7] > hisdata.iloc[0, 8]) and (hisdata.iloc[0, 8] > hisdata.iloc[0, 9]):#
MULT_LIST.append(i)
else:
pass
else: #最近才上市的股票
pass
except:
pass
context.mult_list = MULT_LIST
logger.info(context.mult_list)
# 对于每一个股票按照平均现金买入:
context.stocks = RAW_LIST
update_universe(context.stocks)
stocksNumber = len(context.stocks)
if stocksNumber == 0:
return
else:
pass
context.average_percent = 0.99 / stocksNumber
logger.info("Calculated average percent for each stock is: %f" % context.average_percent)
# 先查一下选出来的股票是否在已有的portfolio里面:
# 这样做并不是最好的,只是代码比较简单
# 先清仓然后再买入这一个月新的符合条件的股票
logger.info("Clearing all the current positions.")
for holding_stock in context.portfolio.positions.keys():
if context.portfolio.positions[holding_stock].quantity != 0:
order_target_percent(holding_stock, 0)
logger.info("Building new positions for portfolio.")
for stock in context.stocks:
order_target_percent(stock, context.average_percent)
logger.info("Buying: " + str(context.average_percent) + " % for stock: " + str(stock))
def init(context):
scheduler.run_weekly(stock_pool, weekday=1)
def handle_bar(context, bar_dict):
pass
跑出来的曲线依旧惨不忍睹,其实我简单调了调参,基本都是这鸟样,所以不放上来了。
仔细看一下持仓列表,虽然持了格力电器上汽集团这样的好同志,发现还是持了一些例如中石化这样的渣渣,可见单纯的市盈率选股不带择时还是不行。
2017-05-08:
该代码好像还有数据问题。
刚刚开始做的时候有未来函数,跑出来的年化40多回撤只有2.5,差点打电话给我妈,可见未来函数的威力。