市盈率策略初探

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,差点打电话给我妈,可见未来函数的威力。

上一篇下一篇

猜你喜欢

热点阅读