银行轮动策略

视频笔记

银行轮动策略
如何每周做一次股票轮动筛查?
如何每周跑一次交易策略?
如何设置每周交易或检查的具体交易日和交易时间?
如何获取某指数下的所有成份股代码名称?
如何从全体股票中筛选该指数成份股,并获取PB信息?
如何判断最小市净率的股票是否在持仓中?

银行股轮动策略代码

''' 源于joinquant, 做了一点改动 始终持有沪深300银行指数成分股中市净率最低的股份制银行,每周检查一次, 如果发现有新的股份制银行市净率低于原有的股票,则予以换仓。 '''

## 初始化函数,设定要操作的股票、基准等等
def initialize(context):
    # 设定沪深300银行指数作为基准
    set_benchmark('399951.XSHE')
    # True为开启动态复权模式,使用真实价格交易
    set_option('use_real_price', True) 
    # 设定成交量比例
    set_option('order_volume_ratio', 1)
    # 股票类交易手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
    set_order_cost(OrderCost(open_tax=0, close_tax=0.001, \
                             open_commission=0.0003, close_commission=0.0003,\
                             close_today_commission=0, min_commission=5), type='stock')
    # 运行函数, 按周运行,在每周第一个交易日运行
    run_weekly(chenk_stocks, weekday=1, time='before_open') #选股
    run_weekly(trade, weekday=1, time='open') #交易

## 得到沪深300银行指数成分股,找到市净率最低的股票
def chenk_stocks(context):
    # 得到沪深300银行指数成分股,默认今天
    g.stocks = get_index_stocks('399951.XSHE')
    # print(g.stocks.__len__())
    # 查询股票的市净率,并按照市净率升序排序
    if len(g.stocks) > 0:
        g.df = get_fundamentals(
            query(
                valuation.code,
                valuation.pb_ratio
            ).filter(
                valuation.code.in_(g.stocks)
            ).order_by(
                valuation.pb_ratio.asc()
            )
        )
        # print(g.df.head(5))
        # print(g.df.tail(5))
        # return
        # 找出最低市净率的一只股票
        g.code = g.df['code'][0]

## 交易
def trade(context):
    if len(g.stocks) > 0:
        code = g.code
        # 如持仓股票不是最低市净率的股票,则卖出
        for stock in context.portfolio.positions.keys():
            if stock != code:
                order_target(stock,0)
        
        # 持仓该股票
        if len(context.portfolio.positions) > 0:
            return
        else:
            order_value(code, context.portfolio.cash)
    

    原文作者:深度碎片
    原文地址: https://zhuanlan.zhihu.com/p/30535742
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞