test1

策略分享
标签: #<Tag:0x00007fcc0b5de2b8>

(xzr) #1
克隆策略
In [ ]:
# 1. 策略数据准备
def prepare(context):
    # 引进prepare数据准备函数是为了保持回测和模拟能够通用
    # 获取股票代码
    instruments = D.instruments(context.start_date,context.end_date)
    start_date = context.start_date
    # 确定结束时间
    end_date = context.end_date
    # 获取股票总市值数据,返回DataFrame数据格式
    market_cap_data = D.history_data(instruments,context.start_date,context.end_date,
              fields=['market_cap','amount'])

    # 获取每日按小市值排序 (从低到高)的前三十只股票  
    cond1 = (high_0/adjust_factor_0) < ta_ma(close_0/adjust_factor_0, timeperiod=10)&\
    (high_0/adjust_factor_0) < ta_ma(close_0/adjust_factor_0, timeperiod=20)&\
    (high_0/adjust_factor_0) < ta_ma(close_0/adjust_factor_0, timeperiod=30)&\
    (low_0/adjust_factor_0) == (open_0/adjust_factor_0)&\
    (high_0/adjust_factor_0) > (close_0/adjust_factor_0)&\
    (close_0/adjust_factor_0) > (close_1/adjust_factor_1)
    
    daily_buy_stock = market_cap_data.groupby('date').apply(lambda df:df[df['cond1']>0].sort_values('market_cap')[:30])
    context.daily_buy_stock = daily_buy_stock

# 2. 策略基本参数,initialize函数只运行一次
def initialize(context):
    # 手续费设置
    context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))
    # 调仓规则(每月的第一天调仓)
    context.set_commission(PerOrder(buy_cost=0.003, sell_cost=0.004, min_cost=5))
    
    context.trade_mode = '择时'

    if context.trade_mode == '轮动':
        context.buy_frequency = 1
        context.sell_frequency = 1
        context.rebalance_periods = 444 # 调仓周期
        context.max_stock_count = 30 # 最大持仓股票数量
        context.order_weight_method = 'equal_weight' # 买入方式
        context.is_sell_willbuy_stock = False  # 卖出欲买进股票 
    else:
        # 买入条件参数
        context.stock_select_frequency = 1 # 选股频率
        context.order_weight_method = 'equal_weight' # 买入方式
        context.buy_frequency = 555 # 买入频率
        context.can_duplication_buy = False  # 是否可重复买入
        context.max_stock_count = 30 # 最大持仓股票数量
        context.max_stock_weight = 1 # 个股最大持仓比重

        # 卖出条件参数
        context.sell_frequency = 10 # 卖出频率
        context.is_sell_willbuy_stock = False  # 卖出欲买进股票
        
    context.schedule_function(rebalance, date_rule=date_rules.week_start(days_offset=0))

# handle_data函数会每天运行一次
def handle_data(context,data):
    pass

# 3. 策略主体函数  换仓函数
def rebalance(context, data):
    # 当前的日期
    date = data.current_dt.strftime('%Y-%m-%d')

    # 根据日期获取调仓需要买入的股票的列表
    stock_to_buy = list(context.daily_buy_stock.ix[date].instrument)
    # 通过positions对象,使用列表生成式的方法获取目前持仓的股票列表
    stock_hold_now = [equity.symbol for equity in context.portfolio.positions]
    # 继续持有的股票:调仓时,如果买入的股票已经存在于目前的持仓里,那么应继续持有
    no_need_to_sell = [i for i in stock_hold_now if i in stock_to_buy]
    # 需要卖出的股票
    stock_to_sell = [i for i in stock_hold_now if i not in no_need_to_sell]

    # 卖出
    for stock in stock_to_sell:
        # 如果该股票停牌,则没法成交。因此需要用can_trade方法检查下该股票的状态
        # 如果返回真值,则可以正常下单,否则会出错
        # 因为stock是字符串格式,我们用symbol方法将其转化成平台可以接受的形式:Equity格式

        if data.can_trade(context.symbol(stock)):
            # order_target_percent是平台的一个下单接口,表明下单使得该股票的权重为0,
            #   即卖出全部股票,可参考回测文档
            context.order_target_percent(context.symbol(stock), 0)

    # 如果当天没有买入的股票,就返回
    if len(stock_to_buy) == 0:
        return

    # 等权重买入
    weight =  1 / len(stock_to_buy)

    # 买入
    for stock in stock_to_buy:
        if data.can_trade(context.symbol(stock)):
            # 下单使得某只股票的持仓权重达到weight,因为
            # weight大于0,因此是等权重买入
            context.order_target_percent(context.symbol(stock), weight)

# 4. 策略回测接口函数: https://bigquant.com/docs/module_trade.html
m=M.trade.v3(
    instruments=D.instruments(),
    start_date='2014-01-01', # 开始时间
    end_date='2016-01-01', # 结束时间
    # 必须传入initialize,只在第一天运行
    prepare=prepare, # 数据准备函数
    initialize=initialize, # 初始化函数
    #  必须传入handle_data,每个交易日都会运行
    handle_data=handle_data,
    # 买入以开盘价成交
    order_price_field_buy='open',
    # 卖出也以开盘价成交
    order_price_field_sell='close',
    # 策略本金
    capital_base=1000000,
    # 比较基准:沪深300
    benchmark='000300.INDX',
)