版本 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].