初来乍到,分享我的第一个策略,欢迎交流!

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

(Beatricean) #1
克隆策略
In [1]:
# 1. 策略基本参数

# 证券池:这里使用所有股票
instruments = D.instruments()
# 起始日期
start_date = '2016-01-01'
# 结束日期
end_date = '2017-02-28'
# 初始资金
capital_base = 100000
# 策略比较参考标准,以沪深300为例
benchmark = '000300.INDX'
# 调仓周期(多少个交易日调仓)
rebalance_period = 22
# 每轮调仓买入的股票数量
stock_num = 30


# 2. 选择股票:为了得到更好的性能,在这里做批量计算
# 本样例策略逻辑:选取调仓当天,交易额最小的30只股票买入
# 加载数据:https://bigquant.com/docs/data_history_data.html
history_data = D.history_data(instruments, start_date, end_date, fields=['amount'])
# 过滤掉停牌股票:amount为0的数据
selected_data = history_data[history_data.amount > 0]
# 按天做聚合(groupby),对于每一天的数据,做(apply)按交易额升序排列(sort_values),并选取前30只([:stock_num])
selected_data = selected_data.groupby('date').apply(lambda df: df.sort_values('amount')[:stock_num])


# 3. 策略主体函数
# 初始化虚拟账户状态,只在第一个交易日运行
def initialize(context):
    # 设置手续费,买入时万3,卖出是千分之1.3,不足5元以5元计
    context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))

# 策略交易逻辑,每个交易日运行一次
def handle_data(context,data):
    today = data.current_dt.strftime('%Y-%m-%d') # 交易日期
    # context.trading_day_index:交易日序号,第一个交易日为0
    if context.trading_day_index % context.options['rebalance_period'] != 0:
        return

    # 调仓:卖出所有持有股票
    for equity in context.portfolio.positions:
        # 停牌的股票,将不能卖出,将在下一个调仓期处理
        if data.can_trade(equity):
            context.order_target_percent(equity, 0)

    # 调仓:买入新的股票
    instruments_to_buy = context.options['selected_data'].ix[today].instrument
    if len(instruments_to_buy) == 0:
        return
    # 等量分配资金买入股票
    weight = 1.0 / len(instruments_to_buy)
    for instrument in instruments_to_buy:
        if data.can_trade(context.symbol(instrument)):
            context.order_target_percent(context.symbol(instrument), weight)

# 4. 策略回测:https://bigquant.com/docs/module_trade.html
m = M.trade.v2(
    instruments=instruments,
    start_date=start_date,
    end_date=end_date,
    initialize=initialize,
    handle_data=handle_data,
    # 买入订单以开盘价成交
    order_price_field_buy='open',
    # 卖出订单以开盘价成交
    order_price_field_sell='open',
    capital_base=capital_base,
    benchmark=benchmark,
    # 传入数据给回测模块,所有回测函数里用到的数据都要从这里传入,并通过 context.options 使用,否则可能会遇到缓存问题
    options={'selected_data': selected_data, 'rebalance_period': rebalance_period}
)
[2017-12-13 11:25:08.290634] INFO: bigquant: backtest.v7 开始运行..
[2017-12-13 11:25:41.128702] INFO: Performance: Simulated 280 trading days out of 280.
[2017-12-13 11:25:41.130184] INFO: Performance: first open: 2016-01-04 14:30:00+00:00
[2017-12-13 11:25:41.131413] INFO: Performance: last close: 2017-02-28 20:00:00+00:00
  • 收益率19.07%
  • 年化收益率17.01%
  • 基准收益率-7.46%
  • 阿尔法0.19
  • 贝塔0.55
  • 夏普比率0.76
  • 收益波动率17.15%
  • 信息比率1.49
  • 最大回撤11.65%
[2017-12-13 11:25:42.566244] INFO: bigquant: backtest.v7 运行完成[34.275668s].