每天签到打call

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

(Beatricean) #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}

)