版本 v1.0
### TALIB指标选股策略的交易规则
### 策略构建步骤
### 策略的实现
可视化策略实现如下:
# 本代码由可视化策略环境自动生成 2021年12月6日 22:14
# 本代码单元只能在可视化模式下编辑。您也可以拷贝代码,粘贴到新建的代码单元或者策略,然后修改。
# Python 代码入口函数,input_1/2/3 对应三个输入端,data_1/2/3 对应三个输出端
def m10_run_bigquant_run(input_1, input_2, input_3):
# 示例代码如下。在这里编写您的代码
df = input_1.read_df()
prices=[float(x) for x in df['close_0']]
import talib
macd, signal, hist = talib.MACD(np.array(prices),12,26,9)#使用talib库计算指标值
df['macd']=pd.Series(macd,index=df.index)
df['signal']=pd.Series(signal,index=df.index)
#计算昨日macd和signal
df['macd_1']=df['macd'].shift(1)
df['signal_1']=df['signal'].shift(1)
data_1 = DataSource.write_df(df)
return Outputs(data_1=data_1, data_2=None, data_3=None)
# 后处理函数,可选。输入是主函数的输出,可以在这里对数据做处理,或者返回更友好的outputs数据格式。此函数输出不会被缓存。
def m10_post_run_bigquant_run(outputs):
return outputs
# 回测引擎:初始化函数,只执行一次
def m9_initialize_bigquant_run(context):
# 系统已经设置了默认的交易手续费和滑点,要修改手续费可使用如下函数
context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))
# 回测引擎:每日数据处理函数,每天执行一次
def m9_handle_data_bigquant_run(context, data):
# 回测引擎:每日数据处理函数,每天执行一次
today = data.current_dt.strftime('%Y-%m-%d') # 日期
# 通过positions对象,使用列表生成式的方法获取目前持仓的股票列表和对应的最新市值
stock_hold_now = {e.symbol: p.amount * p.last_sale_price
for e, p in context.perf_tracker.position_tracker.positions.items()}
# 记录用于买入股票的可用现金
cash_for_buy = context.portfolio.cash
# 获取当日符合买入/卖出条件的股票列表
try:
buy_stock = context.daily_stock_buy[today] # 当日符合买入条件的股票
except:
buy_stock=[]
try:
sell_stock = context.daily_stock_sell[today] # 当日符合卖出条件的股票
except:
sell_stock = []
# 需要卖出的股票:已有持仓中符合卖出条件的股票
stock_to_sell = [i for i in stock_hold_now if i in sell_stock]
# 需要买入的股票:没有持仓且符合买入条件的股票
stock_to_buy = [i for i in buy_stock if i not in stock_hold_now]
# 卖出
for instrument in stock_to_sell:
# 如果该股票停牌,则没法成交。因此需要用can_trade方法检查下该股票的状态
# 如果返回真值,则可以正常下单,否则会出错
# 因为stock是字符串格式,我们用symbol方法将其转化成平台可以接受的形式:Equity格式
if data.can_trade(context.symbol(instrument)):
# order_target_percent是平台的一个下单接口,表明下单使得该股票的权重为0,即卖出全部股票,可参考回测文档
context.order_target_percent(context.symbol(instrument), 0)
# 由于是收盘卖出且开盘买入,因此买入时无需更新当日可用现金,如果是收盘买入开盘卖出则需更新可用现金
# cash_for_buy += stock_hold_now[instrument]
# 如果当天没有买入的股票,就返回
if len(stock_to_buy) == 0:
return
# 买入
for instrument in stock_to_buy:
# 针对当日可用现金使用等资金比例下单买入,整百股数下单
cash = cash_for_buy / len(stock_to_buy)
if data.can_trade(context.symbol(instrument)):
current_price = data.current(context.symbol(instrument), 'price')
amount = math.floor(cash / current_price / 100) * 100
context.order(context.symbol(instrument), amount)
# 回测引擎:准备数据,只执行一次
def m9_prepare_bigquant_run(context):
# 加载预测数据
df = context.options['data'].read_df()
# 函数:求满足开仓条件的股票列表
def open_pos_con(df):
return list(df[df['buy_condition']>0].instrument)
# 函数:求满足平仓条件的股票列表
def close_pos_con(df):
return list(df[df['sell_condition']>0].instrument)
# 每日买入股票的数据框
context.daily_stock_buy= df.groupby('date').apply(open_pos_con)
# 每日卖出股票的数据框
context.daily_stock_sell= df.groupby('date').apply(close_pos_con)
m1 = M.input_features.v1(
features="""# #号开始的表示注释
# 多个特征,每行一个,可以包含基础特征和衍生特征
close_0/adjust_factor_0"""
)
m2 = M.instruments.v2(
start_date=T.live_run_param('trading_date', '2016-01-01'),
end_date=T.live_run_param('trading_date', '2016-05-01'),
market='CN_STOCK_A',
instrument_list='600006.SHA',
max_count=0
)
m7 = M.general_feature_extractor.v7(
instruments=m2.data,
features=m1.data,
start_date='',
end_date='',
before_start_days=100
)
m10 = M.cached.v3(
input_1=m7.data,
run=m10_run_bigquant_run,
post_run=m10_post_run_bigquant_run,
input_ports='',
params='{}',
output_ports=''
)
m11 = M.input_features.v1(
features="""
# #号开始的表示注释
# 多个特征,每行一个,可以包含基础特征和衍生特征
buy_condition=where((macd_1<signal_1)&(macd>signal_1),1,0)
sell_condition=where((macd_1>signal_1)&(macd<signal_1),1,0)"""
)
m8 = M.derived_feature_extractor.v3(
input_data=m10.data_1,
features=m11.data,
date_col='date',
instrument_col='instrument',
drop_na=False,
remove_extra_columns=False
)
m3 = M.dropnan.v2(
input_data=m8.data
)
m9 = M.trade.v4(
instruments=m2.data,
options_data=m3.data,
start_date='',
end_date='',
initialize=m9_initialize_bigquant_run,
handle_data=m9_handle_data_bigquant_run,
prepare=m9_prepare_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'
)
[2021-02-21 16:43:30.207445] INFO: moduleinvoker: input_features.v1 开始运行..
[2021-02-21 16:43:30.224519] INFO: moduleinvoker: 命中缓存
[2021-02-21 16:43:30.226073] INFO: moduleinvoker: input_features.v1 运行完成[0.01864s].
[2021-02-21 16:43:30.229597] INFO: moduleinvoker: instruments.v2 开始运行..
[2021-02-21 16:43:30.268903] INFO: moduleinvoker: instruments.v2 运行完成[0.039277s].
[2021-02-21 16:43:30.285987] INFO: moduleinvoker: general_feature_extractor.v7 开始运行..
[2021-02-21 16:43:30.614004] INFO: 基础特征抽取: 年份 2015, 特征行数=67
[2021-02-21 16:43:30.959948] INFO: 基础特征抽取: 年份 2016, 特征行数=35
[2021-02-21 16:43:31.074149] INFO: 基础特征抽取: 总行数: 102
[2021-02-21 16:43:31.081480] INFO: moduleinvoker: general_feature_extractor.v7 运行完成[0.795499s].
[2021-02-21 16:43:31.092037] INFO: moduleinvoker: cached.v3 开始运行..
[2021-02-21 16:43:31.212653] INFO: moduleinvoker: cached.v3 运行完成[0.120606s].
[2021-02-21 16:43:31.215988] INFO: moduleinvoker: input_features.v1 开始运行..
[2021-02-21 16:43:31.221208] INFO: moduleinvoker: 命中缓存
[2021-02-21 16:43:31.223182] INFO: moduleinvoker: input_features.v1 运行完成[0.007192s].
[2021-02-21 16:43:31.228549] INFO: moduleinvoker: derived_feature_extractor.v3 开始运行..
[2021-02-21 16:43:31.278862] INFO: derived_feature_extractor: 提取完成 buy_condition=where((macd_1signal_1),1,0), 0.003s
[2021-02-21 16:43:31.284893] INFO: derived_feature_extractor: 提取完成 sell_condition=where((macd_1>signal_1)&(macd[2021-02-21 16:43:31.322542] INFO: derived_feature_extractor: /data, 102[2021-02-21 16:43:31.394928] INFO: moduleinvoker: derived_feature_extractor.v3 运行完成[0.166355s].[2021-02-21 16:43:31.401705] INFO: moduleinvoker: dropnan.v2 开始运行..[2021-02-21 16:43:31.470524] INFO: dropnan: /data, 68/102[2021-02-21 16:43:31.519194] INFO: dropnan: 行数: 68/102[2021-02-21 16:43:31.523542] INFO: moduleinvoker: dropnan.v2 运行完成[0.121834s].[2021-02-21 16:43:33.366691] INFO: moduleinvoker: backtest.v8 开始运行..[2021-02-21 16:43:33.373663] INFO: backtest: biglearning backtest:V8.5.0[2021-02-21 16:43:33.577023] INFO: backtest: product_type:stock by specified[2021-02-21 16:43:33.686323] INFO: moduleinvoker: cached.v2 开始运行..[2021-02-21 16:43:38.111697] INFO: backtest: 读取股票行情完成:98515[2021-02-21 16:43:38.348047] INFO: moduleinvoker: cached.v2 运行完成[4.661718s].[2021-02-21 16:43:38.483053] INFO: algo: TradingAlgorithm V1.8.0[2021-02-21 16:43:38.584006] INFO: algo: trading transform...[2021-02-21 16:43:38.887963] INFO: Performance: Simulated 79 trading days out of 79.[2021-02-21 16:43:38.890269] INFO: Performance: first open: 2016-01-04 09:30:00+00:00[2021-02-21 16:43:38.892452] INFO: Performance: last close: 2016-04-29 15:00:00+00:00[2021-02-21 16:43:39.738592] INFO: moduleinvoker: backtest.v8 运行完成[6.371897s].[2021-02-21 16:43:39.740015] INFO: moduleinvoker: trade.v4 运行完成[8.212118s].