版本 v1.0
指标计算:
中轨 = N时间段的简单移动平均线
上轨 = 中轨 + K × N时间段的标准差
下轨 = 中轨 − K × N时间段的标准差
一般情况下,设定N=20和K=2,这两个数值也是在布林带当中使用最多的。在日线图里,N=20其实就是“月均线”(MA20)。依照正态分布规则,约有95%的数值会分布在距离平均值有正负2个标准差的范围内
交易规则:价格突破上轨(%b大于等于1),买入开仓,价格突破下轨(%b小于等于0),卖出开仓
通过证券代码列表输入回测的起止日期
当价格突破上轨,进场买入,建多仓,当价格突破下轨,进场卖出,建空仓。
通过 trade 模块中的初始化函数定义交易手续费和滑点;
通过 trade 模块中的主函数(handle函数)查看每日的买卖交易信号,按照买卖原则执行相应的买入/卖出/调仓操作。
可视化策略实现如下:
# 本代码由可视化策略环境自动生成 2022年7月4日 11:38
# 本代码单元只能在可视化模式下编辑。您也可以拷贝代码,粘贴到新建的代码单元或者策略,然后修改。
# 交易引擎:初始化函数,只执行一次
def m6_initialize_bigquant_run(context):
context.all_data = context.options["data"].read()
# 交易引擎:每个单位时间开盘前调用一次。
def m6_before_trading_start_bigquant_run(context, data):
pass
# 交易引擎:tick数据处理函数,每个tick执行一次
def m6_handle_tick_bigquant_run(context, data):
pass
# 交易引擎:bar数据处理函数,每个时间单位执行一次
def m6_handle_data_bigquant_run(context, data):
import pandas as pd
today = data.current_dt.strftime('%Y-%m-%d') # 当前交易日期
all_data = context.all_data[context.all_data.date == today]
all_data = pd.DataFrame(all_data)
if len(all_data) == 0:#过滤没有指标的数据
return
price = all_data['close'].iloc[0]
high_line = all_data['bbands_up'].iloc[0]
low_line = all_data['bbands_low'].iloc[0]
instrument = context.future_symbol(context.instruments[0]) # 交易标的
long_position = context.get_account_position(instrument, direction=Direction.LONG).avail_qty#多头持仓
short_position = context.get_account_position(instrument, direction=Direction.SHORT).avail_qty#空头持仓
curr_position = short_position + long_position#总持仓
if short_position > 0:
if price > high_line:
context.buy_close(instrument, short_position, price, order_type=OrderType.MARKET)
context.buy_open(instrument, 4, price, order_type=OrderType.MARKET)
print(today,'先平空再开多')
elif long_position > 0:
if price < low_line:
context.sell_close(instrument, long_position, price, order_type=OrderType.MARKET)
context.sell_open(instrument, 4, price, order_type=OrderType.MARKET)
print(today,'先平多再开空',curr_position)
elif curr_position==0:
if price > high_line:
context.buy_open(instrument, 4, price, order_type=OrderType.MARKET)
print('空仓开多')
elif price<low_line:
context.sell_open(instrument, 4, price, order_type=OrderType.MARKET)
print('空仓开空')
# 交易引擎:成交回报处理函数,每个成交发生时执行一次
def m6_handle_trade_bigquant_run(context, data):
pass
# 交易引擎:委托回报处理函数,每个委托变化时执行一次
def m6_handle_order_bigquant_run(context, data):
pass
# 交易引擎:盘后处理函数,每日盘后执行一次
def m6_after_trading_bigquant_run(context, data):
pass
m1 = M.instruments.v2(
start_date='2021-02-17',
end_date='2021-11-26',
market='CN_FUTURE',
instrument_list='JM2201.DCE',
max_count=0
)
m2 = M.input_features.v1(
features="""# #号开始的表示注释,注释需单独一行
# 多个特征,每行一个,可以包含基础特征和衍生特征,特征须为本平台特征
bbands_up = ta_bbands_u(close, 20)
bbands = ta_bbands_m(close, 20)
bbands_low = ta_bbands_l(close, 20)"""
)
m5 = M.use_datasource.v1(
instruments=m1.data,
features=m2.data,
datasource_id='bar1d_CN_FUTURE',
start_date='',
end_date=''
)
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
)
m6 = M.hftrade.v1(
instruments=m1.data,
options_data=m3.data,
start_date='2021-05-14',
end_date='2021-10-18',
initialize=m6_initialize_bigquant_run,
before_trading_start=m6_before_trading_start_bigquant_run,
handle_tick=m6_handle_tick_bigquant_run,
handle_data=m6_handle_data_bigquant_run,
handle_trade=m6_handle_trade_bigquant_run,
handle_order=m6_handle_order_bigquant_run,
after_trading=m6_after_trading_bigquant_run,
capital_base=1000000,
frequency='daily',
price_type='真实价格',
product_type='期货',
before_start_days='',
benchmark='000300.HIX',
plot_charts=True,
disable_cache=False,
show_debug_info=False,
backtest_only=False
)
[2021-12-03 11:32:57.424097] INFO: moduleinvoker: instruments.v2 开始运行..
[2021-12-03 11:32:57.437113] INFO: moduleinvoker: 命中缓存
[2021-12-03 11:32:57.438748] INFO: moduleinvoker: instruments.v2 运行完成[0.014656s].
[2021-12-03 11:32:57.455766] INFO: moduleinvoker: input_features.v1 开始运行..
[2021-12-03 11:32:57.472920] INFO: moduleinvoker: 命中缓存
[2021-12-03 11:32:57.476049] INFO: moduleinvoker: input_features.v1 运行完成[0.020262s].
[2021-12-03 11:32:57.485282] INFO: moduleinvoker: use_datasource.v1 开始运行..
[2021-12-03 11:32:57.499026] INFO: moduleinvoker: 命中缓存
[2021-12-03 11:32:57.501865] INFO: moduleinvoker: use_datasource.v1 运行完成[0.016571s].
[2021-12-03 11:32:57.510871] INFO: moduleinvoker: derived_feature_extractor.v3 开始运行..
[2021-12-03 11:32:57.520575] INFO: moduleinvoker: 命中缓存
[2021-12-03 11:32:57.522029] INFO: moduleinvoker: derived_feature_extractor.v3 运行完成[0.01117s].
[2021-12-03 11:32:57.530207] INFO: moduleinvoker: dropnan.v2 开始运行..
[2021-12-03 11:32:57.536849] INFO: moduleinvoker: 命中缓存
[2021-12-03 11:32:57.538156] INFO: moduleinvoker: dropnan.v2 运行完成[0.007947s].
[2021-12-03 11:32:57.566651] INFO: moduleinvoker: hfbacktest.v1 开始运行..
[2021-12-03 11:32:57.572166] INFO: hfbacktest: biglearning V1.3.2
[2021-12-03 11:32:57.573510] INFO: hfbacktest: bigtrader v1.7.9
[2021-12-03 11:32:57.695767] INFO: moduleinvoker: cached.v2 开始运行..
[2021-12-03 11:32:57.881203] INFO: moduleinvoker: cached.v2 运行完成[0.185383s].
[2021-12-03 11:32:57.993063] INFO: moduleinvoker: cached.v2 开始运行..
[2021-12-03 11:32:58.395188] INFO: moduleinvoker: cached.v2 运行完成[0.402143s].
[2021-12-03 11:33:05.183188] INFO: hfbacktest: backtest done, raw_perf_ds:DataSource(097bd0442b4b4136bc6a27de50475786T)
[2021-12-03 11:33:06.143621] INFO: moduleinvoker: hfbacktest.v1 运行完成[8.577006s].
[2021-12-03 11:33:06.145480] INFO: moduleinvoker: hftrade.v1 运行完成[8.601496s].