指数内小市值股票买入

用户头像mx_*716bsb
2023-08-03 发布

指数内小市值股票买入策略

  1. 每周第一个交易日调仓
  2. 剔除停牌股票
  3. 选取符合要求的股票进行等额投资
  4. 不设置止损止盈条件
## 初始化函数,设定要操作的股票、基准等等
def init(context):
    run_daily(handle_bar, 'every_bar')
    # 设定沪深300作为基准
    set_benchmark('000300.SH')
    # 设定成交量比例
    set_volume_limit(0.25, 0.5)
    # 股票类交易手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
    set_commission(PerShare(type='stock', cost=0.0003, min_trade_cost=5.0))
    # 持仓数量
    g.stocknum = 3
    # 交易日计时器
    g.days = 0 
    # 调仓频率
    g.refresh_rate = 5
  
def handle_bar(context, bar_dict):
    if g.days % g.refresh_rate == 0:
        # 获取持仓列表
        sell_list = list(get_index_stocks('000300.SH'))
        print(sell_list)
        # 如果有持仓,则卖出
        if len(sell_list) > 0:
            for stock in sell_list:
                # 按照目标金额下单
                order_target_value(stock, 20000)

        # 分配资金
        if len(context.portfolio.positions) < g.stocknum:
            Num = g.stocknum - len(context.portfolio.positions)
            Cash = context.portfolio.available_cash / Num
        else:
            Cash = 0

        # 选股,并传入context对象
        stock_list = check_stocks(context)

        # 买入股票
        for stock in stock_list:
            if len(context.portfolio.stock_account.positions) < g.stocknum:
                order_value(stock, Cash) 

        # 天计数加一
        g.days = 1
    
    else:
        g.days += 1
    
## 选出小市值股票
def check_stocks(context):
    # 设定查询条件
    q = query(valuation.symbol).filter(valuation.market_cap.between(20,30)).order_by(valuation.market_cap.asc())

    # 选出低市值的股票,构成buylist
    df = get_fundamentals(q)
    buylist = df['valuation_symbol']

    # 过滤停牌股票
    buylist_filtered = filter_paused_stock(buylist)

    return buylist_filtered[:g.stocknum]

# 过滤停牌股票
def filter_paused_stock(stock_list):
    active_stocks = [stock for stock in stock_list if not is_paused(stock)]
    return active_stocks
收益&风险
源码

评论