版本 v1.0
指标计算:
中轨 = N时间段的简单移动平均线
上轨 = 中轨 + K × N时间段的标准差
下轨 = 中轨 − K × N时间段的标准差
一般情况下,设定N=20和K=2,这两个数值也是在布林带当中使用最多的。在日线图里,N=20其实就是“月均线”(MA20)。依照正态分布规则,约有95%的数值会分布在距离平均值有正负2个标准差的范围内
交易规则:价格突破上轨(%b大于等于1),买入开仓,价格突破下轨(%b小于等于0),卖出开仓
通过证券代码列表输入回测的起止日期
当价格突破中轨全仓买入,突破上轨空仓卖出。
通过 trade 模块中的初始化函数定义交易手续费和滑点;
通过 trade 模块中的主函数(handle函数)查看每日的买卖交易信号,按照买卖原则执行相应的买入/卖出/调仓操作。
可视化策略实现如下:
# 本代码由可视化策略环境自动生成 2022年3月27日 22:03
# 本代码单元只能在可视化模式下编辑。您也可以拷贝代码,粘贴到新建的代码单元或者策略,然后修改。
# 回测引擎:初始化函数,只执行一次
def m7_initialize_bigquant_run(context):
    # 加载预测数据
    context.ranker_prediction = context.options['data'].read_df()
    # 系统已经设置了默认的交易手续费和滑点,要修改手续费可使用如下函数
    context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))
    # 预测数据,通过options传入进来,使用 read_df 函数,加载到内存 (DataFrame)
    # 设置买入的股票数量,这里买入预测股票列表排名靠前的5只
#     stock_count = 5
#     # 每只的股票的权重,如下的权重分配会使得靠前的股票分配多一点的资金,[0.339160, 0.213986, 0.169580, ..]
#     context.stock_weights = T.norm([1 / math.log(i + 2) for i in range(0, stock_count)])
#     # 设置每只股票占用的最大资金比例
#     context.max_cash_per_instrument = 0.2
#     context.hold_days = 5
# 回测引擎:每日数据处理函数,每天执行一次
def m7_handle_data_bigquant_run(context, data):
    # 按日期过滤得到今日的预测数据
    ranker_prediction = context.ranker_prediction[
        context.ranker_prediction.date == data.current_dt.strftime('%Y-%m-%d')]
    
    sid = context.symbol(context.instruments[0])# 标的为字符串格式
    price = data.current(sid, 'price') # 最新价格
    
    cash = context.portfolio.cash  # 现金
    cur_position = context.portfolio.positions[sid].amount # 持仓
    
    
    upperbond = ranker_prediction['bbands_up'].values
    middlebond = ranker_prediction['bbands'].values
    lowerbond = ranker_prediction['bbands_low'].values
    close = ranker_prediction['close_0'].values
    
    print(upperbond)
    
#     print(price)
    
    
#     for i in range(0,len(middlebond)):
#         if close[i] > middlebond[i]:
#             context.order(sid, cash) # 买入
#             print('{}全仓买入{}股票'.format(data.current_dt.strftime('%Y-%m-%d'),sid.symbol))
#         elif close[i] > upperbond[i]:
#             context.order_target_percent(sid, 0) # 全部卖出
#             print('{}卖出{}股票'.format(data.current_dt.strftime('%Y-%m-%d'),sid.symbol))
#         else:
#             return
        
            
            
            
    
    
    
    
# 回测引擎:准备数据,只执行一次
def m7_prepare_bigquant_run(context):
    pass
# 回测引擎:每个单位时间开始前调用一次,即每日开盘前调用一次。
def m7_before_trading_start_bigquant_run(context, data):
    pass
m1 = M.instruments.v2(
    start_date='2021-01-17',
    end_date='2022-3-26',
    market='CN_STOCK_A',
    instrument_list='000001.SZA',
    max_count=0
)
m2 = M.input_features.v1(
    features="""# #号开始的表示注释,注释需单独一行
# 多个特征,每行一个,可以包含基础特征和衍生特征,特征须为本平台特征
bbands_up = ta_bbands_u(close_0, 20)
bbands = ta_bbands_m(close_0, 20)
bbands_low = ta_bbands_l(close_0, 20)
close_0
"""
)
m5 = M.general_feature_extractor.v7(
    instruments=m1.data,
    features=m2.data,
    start_date='',
    end_date='',
    before_start_days=90
)
m4 = M.derived_feature_extractor.v3(
    input_data=m5.data,
    features=m2.data,
    date_col='date',
    instrument_col='instrument',
    drop_na=False,
    remove_extra_columns=False,
    user_functions={}
)
m3 = M.dropnan.v2(
    input_data=m4.data
)
m7 = M.trade.v4(
    instruments=m1.data,
    options_data=m3.data,
    start_date='',
    end_date='',
    initialize=m7_initialize_bigquant_run,
    handle_data=m7_handle_data_bigquant_run,
    prepare=m7_prepare_bigquant_run,
    before_trading_start=m7_before_trading_start_bigquant_run,
    volume_limit=0.025,
    order_price_field_buy='open',
    order_price_field_sell='close',
    capital_base=1000000,
    auto_cancel_non_tradable_orders=True,
    data_frequency='daily',
    price_type='真实价格',
    product_type='股票',
    plot_charts=True,
    backtest_only=False,
    benchmark='000300.HIX'
)
[2022-03-27 21:58:34.160905] INFO: moduleinvoker: instruments.v2 开始运行..
[2022-03-27 21:58:34.412008] INFO: moduleinvoker: instruments.v2 运行完成[0.251701s].
[2022-03-27 21:58:34.418109] INFO: moduleinvoker: input_features.v1 开始运行..
[2022-03-27 21:58:34.432200] INFO: moduleinvoker: 命中缓存
[2022-03-27 21:58:34.433811] INFO: moduleinvoker: input_features.v1 运行完成[0.015721s].
[2022-03-27 21:58:34.456352] INFO: moduleinvoker: general_feature_extractor.v7 开始运行..
[2022-03-27 21:58:37.181964] INFO: 基础特征抽取: 年份 2020, 特征行数=54
[2022-03-27 22:01:50.407511] INFO: 基础特征抽取: 年份 2021, 特征行数=243
[2022-03-27 22:01:51.215103] INFO: 基础特征抽取: 年份 2022, 特征行数=54
[2022-03-27 22:01:51.261551] INFO: 基础特征抽取: 总行数: 351
[2022-03-27 22:01:51.269641] INFO: moduleinvoker: general_feature_extractor.v7 运行完成[196.813284s].
[2022-03-27 22:01:51.281407] INFO: moduleinvoker: derived_feature_extractor.v3 开始运行..
[2022-03-27 22:01:51.474021] INFO: derived_feature_extractor: 提取完成 bbands_up = ta_bbands_u(close_0, 20), 0.048s
[2022-03-27 22:01:51.482764] INFO: derived_feature_extractor: 提取完成 bbands = ta_bbands_m(close_0, 20), 0.007s
[2022-03-27 22:01:51.490837] INFO: derived_feature_extractor: 提取完成 bbands_low = ta_bbands_l(close_0, 20), 0.007s
[2022-03-27 22:01:51.753849] INFO: derived_feature_extractor: /y_2020, 54
[2022-03-27 22:01:51.809544] INFO: derived_feature_extractor: /y_2021, 243
[2022-03-27 22:01:51.968295] INFO: derived_feature_extractor: /y_2022, 54
[2022-03-27 22:01:52.050727] INFO: moduleinvoker: derived_feature_extractor.v3 运行完成[0.769311s].
[2022-03-27 22:01:52.061292] INFO: moduleinvoker: dropnan.v2 开始运行..
[2022-03-27 22:01:52.147908] INFO: dropnan: /y_2020, 35/54
[2022-03-27 22:01:52.187126] INFO: dropnan: /y_2021, 243/243
[2022-03-27 22:01:52.221273] INFO: dropnan: /y_2022, 54/54
[2022-03-27 22:01:52.270954] INFO: dropnan: 行数: 332/351
[2022-03-27 22:01:52.276317] INFO: moduleinvoker: dropnan.v2 运行完成[0.215023s].
[2022-03-27 22:01:52.335431] INFO: moduleinvoker: backtest.v8 开始运行..
[2022-03-27 22:01:52.342361] INFO: backtest: biglearning backtest:V8.6.2
[2022-03-27 22:01:52.343826] INFO: backtest: product_type:stock by specified
[2022-03-27 22:01:52.459524] INFO: moduleinvoker: cached.v2 开始运行..
[2022-03-27 22:01:52.467785] INFO: moduleinvoker: 命中缓存
[2022-03-27 22:01:52.470730] INFO: moduleinvoker: cached.v2 运行完成[0.011206s].
[2022-03-27 22:01:54.372421] INFO: algo: TradingAlgorithm V1.8.7
[2022-03-27 22:01:54.797878] INFO: algo: trading transform...
[2022-03-27 22:01:56.392380] INFO: Performance: Simulated 287 trading days out of 287.
[2022-03-27 22:01:56.394207] INFO: Performance: first open: 2021-01-18 09:30:00+00:00
[2022-03-27 22:01:56.395401] INFO: Performance: last close: 2022-03-25 15:00:00+00:00
[2022-03-27 22:01:57.858589] INFO: moduleinvoker: backtest.v8 运行完成[5.523155s].
[2022-03-27 22:01:57.860735] INFO: moduleinvoker: trade.v4 运行完成[5.574668s].