版本 v1.0
### 布林带策略的交易规则
### 策略构建步骤
### 策略的实现
相关定义如下:
中轨 = N时间段的close价格简单移动平均线
上轨 = 中轨 + K × N时间段的标准差
下轨 = 中轨 − K × N时间段的标准差
当前价格相对位置 percent_b = (close - lower)/(upper - lower)
本例中N取20,K取2
当percent_b ≥ 1时,以第二日开盘价平空开多;
可视化策略实现如下:
# 本代码由可视化策略环境自动生成 2021年12月6日 22:50
# 本代码单元只能在可视化模式下编辑。您也可以拷贝代码,粘贴到新建的代码单元或者策略,然后修改。
# Python 代码入口函数,input_1/2/3 对应三个输入端,data_1/2/3 对应三个输出端
def m4_run_bigquant_run(input_1, input_2, input_3,before_days):
# 示例代码如下。在这里编写您的代码
start_date=(pd.to_datetime(input_1.read_pickle()['start_date']) - datetime.timedelta(days=before_days)).strftime('%Y-%m-%d')
end_date=input_1.read_pickle()['end_date']
instruments=input_1.read_pickle()['instruments']
fields=['open','high','low','close']
df = DataSource('bar1d_CN_FUTURE').read(instruments,start_date,end_date,fields)
df['adjust_factor']=1.0
data_1 = DataSource.write_df(df)
return Outputs(data_1=data_1, data_2=None, data_3=None)
# 后处理函数,可选。输入是主函数的输出,可以在这里对数据做处理,或者返回更友好的outputs数据格式。此函数输出不会被缓存。
def m4_post_run_bigquant_run(outputs):
return outputs
# 回测引擎:初始化函数,只执行一次
def m3_initialize_bigquant_run(context):
# 设置是否是结算模式
context.set_need_settle(False)
# 设置最大杠杆
context.set_max_leverage(1, 'fill_amap')
# 回测引擎:每日数据处理函数,每天执行一次
def m3_handle_data_bigquant_run(context, data):
# 获取当日指标数据
today = data.current_dt.strftime('%Y-%m-%d') # 当前交易日期
buy_condition=context.buy_condition[today]
sell_condition=context.sell_condition[today]
instrument = context.future_symbol(context.instruments[0]) # 交易标的
curr_po=context.portfolio.positions[instrument] # 组合持仓
curr_position = curr_po.amount # 持仓数量
# 交易逻辑
if buy_condition>0 and data.can_trade(instrument): # 开多,下单数量20手
order_target(instrument, 20)
print(today,'平空开多')
elif sell_condition>0 and data.can_trade(instrument):# 开空,下单数量20手
order_target(instrument, -20)
print(today,'平多开空')
# 回测引擎:准备数据,只执行一次
def m3_prepare_bigquant_run(context):
df = context.options['data'].read_df()
df['date']=df['date'].apply(lambda x:x.strftime('%Y-%m-%d'))
df.set_index('date',inplace=True)
context.buy_condition=df['buy_condition']
context.sell_condition=df['sell_condition']
# 回测引擎:每个单位时间开始前调用一次,即每日开盘前调用一次。
def m3_before_trading_start_bigquant_run(context, data):
pass
m2 = M.instruments.v2(
start_date='2017-11-01',
end_date='2018-05-01',
market='CN_FUTURE',
instrument_list='RU1809.SHF',
max_count=0
)
m4 = M.cached.v3(
input_1=m2.data,
run=m4_run_bigquant_run,
post_run=m4_post_run_bigquant_run,
input_ports='',
params='{\'before_days\':60}',
output_ports=''
)
m5 = M.input_features.v1(
features="""
# #号开始的表示注释
# 多个特征,每行一个,可以包含基础特征和衍生特征
buy_condition=where((close-(mean(close,20)-2*std(close,20)))/(4*std(close,20))>=1,1,0)
sell_condition=where((close-(mean(close,20)-2*std(close,20)))/(4*std(close,20))<=0,1,0)
"""
)
m6 = M.derived_feature_extractor.v3(
input_data=m4.data_1,
features=m5.data,
date_col='date',
instrument_col='instrument',
drop_na=False,
remove_extra_columns=False,
user_functions={}
)
m7 = M.dropnan.v1(
input_data=m6.data
)
m3 = M.trade.v4(
instruments=m2.data,
options_data=m7.data,
start_date='',
end_date='',
initialize=m3_initialize_bigquant_run,
handle_data=m3_handle_data_bigquant_run,
prepare=m3_prepare_bigquant_run,
before_trading_start=m3_before_trading_start_bigquant_run,
volume_limit=0,
order_price_field_buy='open',
order_price_field_sell='open',
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'
)