默认设置为等权重买入
还可以设置买入计数器 控制最多持仓数量,不超过某个比例
建议 在初始 单个股票最大资金比例那里就设置一下 平均分配的仓位 不要 一下子 怼到 单个股票仓位100% 不然就会出现有些仓位不平衡的现象
# 本代码由可视化策略环境自动生成 2022年4月2日 23:55
# 本代码单元只能在可视化模式下编辑。您也可以拷贝代码,粘贴到新建的代码单元或者策略,然后修改。
# 回测引擎:初始化函数,只执行一次
def m19_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))
# 股票成交时,手续费按成交次数收取,每一次成交收取5元手续费
#context.set_commission(PerTrade(5))
# 预测数据,通过options传入进来,使用 read_df 函数,加载到内存 (DataFrame)
# 设置买入的股票数量,这里买入预测股票列表排名靠前的10只
stock_count = 5
# 每只的股票的权重,如下的权重分配会使得靠前的股票分配多一点的资金,[0.339160, 0.213986, 0.169580, ..]
#weight = 1 / len(stock_count)
# 每只的股票的权重,如下的权重分配会使得靠前的股票分配多一点的资金,[0.339160, 0.213986, 0.169580, ..]
#1 / context.stock_count #这个是等权重设置
context.stock_weights = T.norm([1 / math.log(i + 2) for i in range(0, stock_count)])
# 设置每只股票占用的最大资金比例
context.max_cash_per_instrument = 0.1
context.options['hold_days'] =5
# 回测引擎:每日数据处理函数,每天执行一次
def m19_handle_data_bigquant_run(context, data):
# 按日期过滤得到今日的预测数据
ranker_prediction = context.ranker_prediction[
context.ranker_prediction.date == data.current_dt.strftime('%Y-%m-%d')]
#-------------大盘风控模块-----------------------------
# 获取当前持仓
positions = {e.symbol: p.amount * p.last_sale_price
for e, p in context.portfolio.positions.items()}
today = data.current_dt.strftime('%Y-%m-%d')
# 按日期过滤得到今日的预测数据
ranker_prediction = context.ranker_prediction[
context.ranker_prediction.date == today]
#print('当天的预测:',ranker_prediction)
try:
#大盘风控模块,读取风控数据
benckmark_risk=ranker_prediction['bm_0'].values[0]
if benckmark_risk > 0:
for instrument in positions.keys():
context.order_target(context.symbol(instrument), 0)
print(today,'大盘风控止损触发,全仓卖出')
#如果return 在这里 只会卖出第一支持仓的股票,执行一次后返回,有可能起不到全仓风控的作用
return
except:
print('开仓!')
#-------------大盘风控模块
#--------------读取个股择时数据 模块--------------------------------
today_date = data.current_dt.strftime('%Y-%m-%d')
#这里我们做一个报错处理机制 这样就可以 防止 如果哪一天不小心搞错了哪一行数据
#读取数据错误造成策略报错
try:
#--- #获取市值--
cond5=ranker_prediction.cond5.values
#print(cond5)
except:
print('当天 cond5有数据缺失,请检查!',today_date)
#获取换手率
#huanshoulv=ranker_prediction.huanshoulv.values
#获取资金流 超大单
try:
cond8=ranker_prediction.cond8.values
#print(cond8)
except:
print('当天 cond8有数据缺失,请检查!',today_date)
# try:
# #获取3日天涨幅
# cond10=ranker_prediction.cond10.values[0]
# except:
# print('当天 cond10有数据缺失,请检查!',today_date)
# #获取创三日内新高
# try:
# cond11=ranker_prediction.cond11.values[0]
# except:
# print('当天 cond11有数据缺失,请检查!',today_date)
# #获取开盘缺口--
# try:
# cond12=ranker_prediction.cond12.values[0]
# except:
# print('当天 cond12有数据缺失,请检查!',today_date)
#----------收盘价是否大于20日均线----用来做20日均线止损
try:
cond13=ranker_prediction.cond13.values
#print(cond13)
except:
print('当天 cond13有数据缺失,请检查!',today_date)
#---收盘价是否小于10日均线大于20日均线-用来判断是否低吸补仓
try:
cond14=ranker_prediction.cond14.values
#print(cond14)
except:
print('当天 cond14有数据缺失,请检查!',today_date)
#--------------读取个股择时数据 模块--------------------------------
#这里是 一个止盈止损/补仓逻辑
#可以对持仓股票进行补仓--20日均线跌破就止损
#也可以按照一定的涨幅就卖出止盈
#------------------------------------------止盈止损/补仓逻辑START---------------------------------#
#读取当日的时间
date = data.current_dt.strftime('%Y-%m-%d')
#检查持仓
positions = {e.symbol: p.cost_basis for e, p in context.portfolio.positions.items()}
# 新建当日止赢股票列表是为了handle_data 策略逻辑部分不再对该股票进行判断
current_stopwin_stock = []
current_stoploss_stock = []
current_buy_stock=[]
if len(positions) > 0:
#print('持仓:',positions)
#df2[df2.instrument=='000002.SZA'].loc[df2.date=='2019-09-30'].cond8
for i in positions.keys():
#读取 cond8 当日资金流的数据
zjl=ranker_prediction[ranker_prediction.instrument==i].cond8
#print('资金流',zjl)
#读取 cond13 当日是否跌破20日均线-发生止损的数据 --如果收盘价>ma20 返回1,收盘价<ma20返回0
zhisun_20=ranker_prediction[ranker_prediction.instrument==i].cond13
#print('止损线-20日均线',zhisun_20)
#读取 cond14 收盘价是否小于10日均线大于20日均线-用来判断是否低吸补仓的数据
bucang10_20=ranker_prediction[ranker_prediction.instrument==i].cond14
#print('补仓线-10日线-20日均线',bucang10_20)
#---下面是读取持仓成本
stock_cost = positions[i]
stock_market_price = data.current(context.symbol(i), 'price')
#open_price = data.current(context.symbol(i), 'open') #当天开盘价
high_price1 = data.current(context.symbol(i), 'high') #当天最高价
low_price1 = data.current(context.symbol(i), 'low') #当天最低价
avg_price1=((high_price1+low_price1)/2)*1.021#当天分时均价
# 赚50%就止盈
if (stock_market_price - stock_cost)/ stock_cost >= 0.5:
context.order_target_percent(context.symbol(i),0)
current_stopwin_stock.append(i)
print('日期:',date,'股票:',i,'出现止盈状况')
#- 跌破20日线 ,发生止损
if zhisun_20.values<1:
context.order_target_percent(context.symbol(i),0)
current_stoploss_stock.append(i)
print('日期:',date,'股票:',i,'出现跌破20日线止损状况')
#- 已经超过5%的止损线 止损
if (stock_market_price - stock_cost)/ stock_cost <= 0.5:
context.order_target_percent(context.symbol(i),0)
current_stoploss_stock.append(i)
print('日期:',date,'股票:',i,'出现-7%止损状况')
#- 跌破10日线 ,但未跌破20日线,补仓至 25%
if bucang10_20.values>0:
context.order_target_percent(context.symbol(i),0.25)
current_buy_stock.append(i)
print('日期:',date,'股票:',i,'出现10日线补仓状况')
#-------------------------------------------止盈止损/补仓逻辑模块END-------------------------------#
# 1. 资金分配
# 平均持仓时间是hold_days,每日都将买入股票,每日预期使用 1/hold_days 的资金
# 实际操作中,会存在一定的买入误差,所以在前hold_days天,等量使用资金;之后,尽量使用剩余资金(这里设置最多用等量的1.5倍)
is_staging = context.trading_day_index < context.options['hold_days'] # 是否在建仓期间(前 hold_days 天)
cash_avg = context.portfolio.portfolio_value / context.options['hold_days']
cash_for_buy = min(context.portfolio.cash, (1 if is_staging else 1.5) * cash_avg)
cash_for_sell = cash_avg - (context.portfolio.cash - cash_for_buy)
positions = {e.symbol: p.amount * p.last_sale_price
for e, p in context.portfolio.positions.items()}
#-------------------------这里是 固定天数的轮仓周期,到达固定天数的股票 就要被卖出
# #----------------------------START:持有固定天数卖出---------------------------
today = data.current_dt
# 不是建仓期(在前hold_days属于建仓期)
if not is_staging:
equities = {e.symbol: p for e, p in context.portfolio.positions.items() if p.amount>0}
for instrument in equities:
# print('last_sale_date: ', equities[instrument].last_sale_date)
sid = equities[instrument].sid # 交易标的
#今天和上次交易的时间相隔hold_days就全部卖出 # timedelta(x) x=我们的持仓天数 比如x=5就是相隔5天卖出
if today-equities[instrument].last_sale_date>=datetime.timedelta(22) and data.can_trade(context.symbol(instrument)):
context.order_target_percent(sid, 0)
# #--------------------------------END:持有固定天数卖出---------------------------
#------------------如果 不喜欢 轮仓中的股票被末尾淘汰制度 可以把这一段 代码注释掉,这样 可以防止 有时候 卖出 不统一的情况
#---------------------------------以下是 末尾淘汰制代码 可注释------------------------------------------------
# 2. 生成卖出订单:hold_days天之后才开始卖出;对持仓的股票,按机器学习算法预测的排序末位淘汰
if not is_staging and cash_for_sell > 0:
equities = {e.symbol: e for e, p in context.portfolio.positions.items()}
instruments = list(reversed(list(ranker_prediction.instrument[ranker_prediction.instrument.apply(
lambda x: x in equities)])))
for instrument in instruments:
if instrument in current_stopwin_stock or current_stoploss_stock:
continue
context.order_target(context.symbol(instrument),0)
cash_for_sell -= positions[instrument]
if cash_for_sell <= 0:
break
#---------------------------------以上是 末尾淘汰制代码 可注释------------------------------------------------
#---------------下面是生产买入订单的函数交易 -------------------------------------
# 3. 生成买入订单:按机器学习算法预测的排序,买入前面的stock_count只股票
buy_cash_weights = context.stock_weights
buy_instruments = list(ranker_prediction.instrument[:len(buy_cash_weights)])
max_cash_per_instrument = context.portfolio.portfolio_value * context.max_cash_per_instrument
for i, instrument in enumerate(buy_instruments):
cash = cash_for_buy * buy_cash_weights[i]
if cash > max_cash_per_instrument - positions.get(instrument, 0):
# 确保股票持仓量不会超过每次股票最大的占用资金量
cash = max_cash_per_instrument - positions.get(instrument, 0)
if cash > 0:
#如果当天买入的股票存在补仓的列表中,不重复买入
if instrument in current_buy_stock:
continue
#--如果当日选出来的股票资金流入为负数,那我们可能觉得这个股票是在出货,我们不买入,反之,如果资金流入,我们继续买入
zjl=ranker_prediction[ranker_prediction.instrument==instrument].cond8
#print('资金流超大单',zjl)
#资金流大于0 买入
if cash>0:#zjl.values>0:
context.order_value(context.symbol(instrument), cash)
# 回测引擎:准备数据,只执行一次
def m19_prepare_bigquant_run(context):
# 获取st状态和涨跌停状态,超大单流入,主力资金流入状态
context.status_df = D.features(instruments =context.instruments,start_date = context.start_date, end_date = context.end_date,
fields=['st_status_0','price_limit_status_0','price_limit_status_1','mf_net_amount_xl_0','mf_net_amount_main_0'])
def m19_before_trading_start_bigquant_run(context, data):
# 获取涨跌停状态 -主力资金流入数据
df_stock_status=context.status_df.set_index('date')
today=data.current_dt.strftime('%Y-%m-%d')
# 得到当前未完成订单
for orders in get_open_orders().values():
# 循环,撤销订单
for _order in orders:
ins=str(_order.sid.symbol)
try:
#判断一下如果当日涨停,则取消卖单
if df_stock_status[df_stock_status.instrument==ins].price_limit_status_0.ix[today]>2 and _order.amount<0:
cancel_order(_order)
print(today,'尾盘涨停取消卖单',ins)
#判断一下如果当日收盘主力资金流入,则取消卖单
if df_stock_status[df_stock_status.instrument==ins].mf_net_amount_main_0.ix[today]>0 and _order.amount<0:
cancel_order(_order)
print(today,'当日收盘主力资金流入取消卖单',ins)
except:
continue
m1 = M.instruments.v2(
start_date='2010-01-01',
end_date='2018-01-01',
market='CN_STOCK_A',
instrument_list="""002714.SZA
000620.SZA
600066.SHA
600887.SHA
002415.SZA
300450.SZA
000622.SZA
002690.SZA
300601.SZA
000776.SZA
600519.SHA
000333.SZA
002035.SZA
002236.SZA
300015.SZA
600436.SHA
600566.SHA
600201.SHA
600705.SHA
000156.SZA
002677.SZA
002032.SZA
600681.SHA
603601.SHA
002372.SZA
603019.SHA
300571.SZA
002475.SZA
300033.SZA
600346.SHA
601888.SHA
600763.SHA
603799.SHA
603690.SHA
002044.SZA
300253.SZA
000651.SZA
002085.SZA
600903.SHA
600340.SHA
300296.SZA
002572.SZA
300176.SZA
000963.SZA
000403.SZA
002747.SZA
000789.SZA
002508.SZA
300347.SZA
300401.SZA
300666.SZA
000732.SZA
000049.SZA
300451.SZA
603986.SHA
300684.SZA
000681.SZA
000671.SZA
002230.SZA
600867.SHA
300059.SZA
002020.SZA
300457.SZA
300136.SZA
300308.SZA
000661.SZA
002304.SZA
600276.SHA
600563.SHA
601012.SHA
000703.SZA
002410.SZA
002358.SZA
300725.SZA
300226.SZA
300675.SZA
300324.SZA
600801.SHA
000048.SZA
300383.SZA
300285.SZA
300459.SZA
002008.SZA
603288.SHA
002049.SZA
002311.SZA
600305.SHA
300377.SZA
002746.SZA
603638.SHA
002507.SZA
002252.SZA
002271.SZA
300482.SZA
000002.SZA
600612.SHA
002081.SZA
002013.SZA
300357.SZA""",
max_count=0
)
m13 = M.advanced_auto_labeler.v2(
instruments=m1.data,
label_expr="""# #号开始的表示注释
# 0. 每行一个,顺序执行,从第二个开始,可以使用label字段
# 1. 可用数据字段见 https://bigquant.com/docs/develop/datasource/deprecated/history_data.html
# 添加benchmark_前缀,可使用对应的benchmark数据
# 2. 可用操作符和函数见 `表达式引擎 <https://bigquant.com/docs/develop/bigexpr/usage.html>`_
# 计算收益:5日收盘价(作为卖出价格)除以明日开盘价(作为买入价格)
(shift(close, -5) / shift(open, -1)-1)
# 极值处理:用1%和99%分位的值做clip
clip(label, all_quantile(label, 0.01), all_quantile(label, 0.99))
all_wbins(label, 20)
# 过滤掉一字涨停的情况 (设置label为NaN,在后续处理和训练中会忽略NaN的label)
where(shift(high, -1) == shift(low, -1), NaN, label)
""",
start_date='',
end_date='',
benchmark='000300.SHA',
drop_na_label=True,
cast_label_int=True,
user_functions={}
)
m3 = M.input_features.v1(
features="""# #号开始的表示注释
# 多个特征,每行一个,可以包含基础特征和衍生特征
#rank_return_10/rank_return_30
# return_5
# return_10
# return_20
# avg_amount_0/avg_amount_5
# avg_amount_5/avg_amount_20
# rank_avg_amount_0/rank_avg_amount_5
# rank_avg_amount_5/rank_avg_amount_10
# rank_return_0
# rank_return_5
# rank_return_10
# rank_return_0/rank_return_5
# rank_return_5/rank_return_10
# pe_ttm_0
avg_turn_15/turn_0
mf_net_amount_xl_0
alpha4=close_0*avg_turn_0+close_1*avg_turn_1+close_2*avg_turn_2
"""
)
m6 = M.features_short.v1(
input_1=m3.data
)
m10 = M.input_features.v1(
features_ds=m3.data,
features="""
# #号开始的表示注释,注释需单独一行
# 多个特征,每行一个,可以包含基础特征和衍生特征,特征须为本平台特征
#---过滤st
# cond1=where(st_status_0==0, 1, 0)>0
# #---过滤新股
# cond2=where(list_days_0>125, 1, 0)>0
# #---过滤-成交量放天量-
# cond3=where(volume_0<ts_max(volume_0, 60), 1, 0)>0
# #--过滤 近10天内长上影线过多>4次的股票
# cond4=where(sum((high_0-close_0)/close_0>0.03,10)<4, 1, 0)>0
cond1=sum(ta_macd_dif(close_0,2,4,4),5)>sum(ta_macd_dea(close_0,2,4,4),5)
cond2=close_0>mean(close_0, 25)
cond3=sum(ta_macd_dea(close_0,2,4,4),5)>0.2
price_limit_status_0
cond4=st_status_0<1"""
)
m15 = M.general_feature_extractor.v7(
instruments=m1.data,
features=m10.data,
start_date='',
end_date='',
before_start_days=90
)
m16 = M.derived_feature_extractor.v3(
input_data=m15.data,
features=m10.data,
date_col='date',
instrument_col='instrument',
drop_na=False,
remove_extra_columns=False
)
m7 = M.join.v3(
data1=m13.data,
data2=m16.data,
on='date,instrument',
how='inner',
sort=False
)
m22 = M.filter.v3(
input_data=m7.data,
expr='cond1&cond2&cond3',
output_left_data=False
)
m2 = M.dropnan.v2(
input_data=m22.data
)
m26 = M.stock_ranker_train.v5(
training_ds=m2.data,
features=m6.data_1,
test_ds=m2.data,
learning_algorithm='排序',
number_of_leaves=20,
minimum_docs_per_leaf=1000,
number_of_trees=70,
learning_rate=0.1,
max_bins=1023,
feature_fraction=1,
m_lazy_run=False
)
m9 = M.instruments.v2(
start_date=T.live_run_param('trading_date', '2018-01-01'),
end_date=T.live_run_param('trading_date', '2022-04-01'),
market='CN_STOCK_A',
instrument_list="""
300782.SZA
605358.SHA
603290.SHA
603392.SHA
601865.SHA
300759.SZA
300750.SZA
300677.SZA
002607.SZA
603259.SHA
300751.SZA
603613.SHA
601100.SHA
300763.SZA
002568.SZA
300724.SZA
603345.SHA
600763.SHA
603713.SHA
300595.SZA
300014.SZA
603712.SHA
300760.SZA
603317.SHA
002791.SZA
601066.SHA
002985.SZA
300661.SZA
300347.SZA
300777.SZA
603129.SHA
300454.SZA
601888.SHA
605111.SHA
603638.SHA
300850.SZA
600809.SHA
002414.SZA
603893.SHA
002967.SZA
600132.SHA
603605.SHA
300015.SZA
603267.SHA
300012.SZA
600882.SHA
300684.SZA
300390.SZA
300769.SZA
300748.SZA
000799.SZA
300767.SZA
300775.SZA
603737.SHA
300601.SZA
601698.SHA
300841.SZA
002975.SZA
603501.SHA
300122.SZA
300677.SZA
603392.SHA
002791.SZA
601865.SHA
300759.SZA
002568.SZA
603613.SHA
300014.SZA
601100.SHA
300763.SZA
300274.SZA
601633.SHA
603501.SHA
002709.SZA
603317.SHA
300661.SZA
002985.SZA
600882.SHA
300598.SZA
300777.SZA
300552.SZA
300346.SZA
002475.SZA
605111.SHA
300850.SZA
300526.SZA
601012.SHA
603893.SHA
002967.SZA
000858.SZA
603267.SHA
000568.SZA
603638.SHA
000708.SZA
603456.SHA
000995.SZA
600399.SHA
300767.SZA
300595.SZA
300347.SZA
600763.SHA
300751.SZA
600316.SHA
300775.SZA
603208.SHA
600862.SHA
002241.SZA
002706.SZA
300390.SZA
601698.SHA
002541.SZA
002607.SZA
000733.SZA
000596.SZA
603345.SHA
300151.SZA
300496.SZA
002705.SZA
002756.SZA
603185.SHA
002850.SZA
000661.SZA
002600.SZA
300724.SZA
600584.SHA
002414.SZA
300223.SZA
002920.SZA
603906.SHA
002714.SZA
600966.SHA
300083.SZA
300601.SZA
600438.SHA
002812.SZA
002459.SZA
603027.SHA
300015.SZA
300763.SZA
002709.SZA
688202.SHA
000422.SZA
300769.SZA
300751.SZA
300343.SZA
605117.SHA
300827.SZA
601633.SHA
603026.SHA
002240.SZA
002326.SZA
002487.SZA
000762.SZA
300432.SZA
603396.SHA
300363.SZA
603985.SHA
000155.SZA
002594.SZA
600399.SHA
600702.SHA
300171.SZA
002176.SZA
000733.SZA
300750.SZA
601127.SHA
002812.SZA
603260.SHA
600610.SHA
601012.SHA
003022.SZA
603127.SHA
000301.SZA
002585.SZA
688198.SHA
002245.SZA
300693.SZA
600096.SHA
300568.SZA
300382.SZA
300443.SZA
003031.SZA
605376.SHA
603806.SHA
603223.SHA
688116.SHA
002529.SZA
600141.SHA
600956.SHA
300035.SZA
300316.SZA
002460.SZA
600110.SHA
300671.SZA
002407.SZA
600532.SHA
688599.SHA
002472.SZA
600499.SHA
600111.SHA
600884.SHA
300696.SZA
603267.SHA""",
max_count=0
)
m17 = M.general_feature_extractor.v7(
instruments=m9.data,
features=m10.data,
start_date='',
end_date='',
before_start_days=90
)
m18 = M.derived_feature_extractor.v3(
input_data=m17.data,
features=m10.data,
date_col='date',
instrument_col='instrument',
drop_na=False,
remove_extra_columns=False
)
m23 = M.filter.v3(
input_data=m18.data,
expr='cond1&cond2&cond3&cond4',
output_left_data=False
)
m36 = M.dropnan.v2(
input_data=m23.data
)
m8 = M.stock_ranker_predict.v5(
model=m26.model,
data=m36.data,
m_lazy_run=False
)
m21 = M.input_features.v1(
features="""# #号开始的表示注释
# 多个特征,每行一个,可以包含基础特征和衍生特征
#当天收盘价/昨日的收盘价
#--- 1.用指数的成交量(3.5日ma线死叉) 作为 全仓卖出风控的依据
bm_0=where(ta_macd_dif(close,2,4,4)-ta_macd_dea(close,2,4,4)<0,1,0)#where(mean(volume, 5)-mean(volume, 10)<0,1,0)
#bm_0=where(ta_macd_dif(close,2,4,4)-ta_macd_dea(close,2,4,4)<0,1,0)
#--- 2.用指数的 MAAMT指标 作为 MAAMT指标择时策略 全仓卖出风控的依据
#成交量(金额)类
#求成交额的移动平均线。
#MAAMT=MA(AMOUNT,N)
#信号产生方式 如果成交额上穿 MAAMT,则产生买入信号;
#如果成交额下穿 MAAMT,则产生卖出信号。
#bm_1=where(mean(amount, 5)-mean(amount, 10)<0,1,0)
#--- 3.用指数的 MAAMT指标 作为 MAAMT指标择时策略 全仓卖出风控的依据"""
)
m20 = M.index_feature_extract.v3(
input_1=m9.data,
input_2=m21.data,
before_days=20,
index='000300.HIX'
)
m24 = M.input_features.v1(
features="""# 换手率
turn_0
turn_1
turn_2
huanshoulv=turn_0+turn_1+turn_2
#这里 注释掉 就不会冲突 这里 建议 如果 在训练集 和测试集的特征列表中存在 过滤的表达式,最好是使用 不同的变量名 比如 已经使用过cond1
#在 主函数中的过滤 最好使用 coond11或者alpha1之类的其他变量名称,防止内存窜行
# 下面的条件 的意思是 过滤 判断 两天内存在一字板, 判断是否条件为真,如果是,取消 买入
#这里 可以参考来进行多种条件组合过滤 ,可以不干扰预测集的样本,,做个股择时
#cond1=where((open_1==close_1)|(open_2==close_2), 1, 0)
cond5=market_cap_float_0
#cond6=list_days_0
#cond7=list_board_0
cond8=mf_net_amount_xl_0
#cond9=(close_0-open_2)/open_2
#cond10=high_0>high_2+0.01
##cond11=sum(price_limit_status_0==3, 10)
#---收盘大于21天内最高点 /开盘缺口《6%
#cond12=(open_0-close_1)/close_1
#---收盘价是否大于20日均线----用来做20日均线止损
cond13=where(close_0>mean(close_0, 20), 1, 0)
#---收盘价是否小于10日均线大于20日均线-用来判断是否低吸补仓
cond14=where((close_0>mean(close_0, 20))&(close_0<mean(close_0, 10)), 1, 0)
"""
)
m25 = M.general_feature_extractor.v7(
instruments=m9.data,
features=m24.data,
start_date='',
end_date='',
before_start_days=90
)
m5 = M.derived_feature_extractor.v3(
input_data=m25.data,
features=m24.data,
date_col='date',
instrument_col='instrument',
drop_na=False,
remove_extra_columns=False
)
m14 = M.join.v3(
data1=m20.data_1,
data2=m5.data,
on='date,',
how='inner',
sort=False
)
m12 = M.join.v3(
data1=m8.predictions,
data2=m14.data,
on='date,instrument',
how='inner',
sort=False
)
m11 = M.sort.v4(
input_ds=m12.data,
sort_by='date',
group_by='--',
keep_columns='--',
ascending=False
)
m19 = M.trade.v4(
instruments=m9.data,
options_data=m11.sorted_data,
start_date='',
end_date='',
initialize=m19_initialize_bigquant_run,
handle_data=m19_handle_data_bigquant_run,
prepare=m19_prepare_bigquant_run,
before_trading_start=m19_before_trading_start_bigquant_run,
volume_limit=0.025,
order_price_field_buy='open',
order_price_field_sell='close',
capital_base=100000000,
auto_cancel_non_tradable_orders=True,
data_frequency='daily',
price_type='真实价格',
product_type='股票',
plot_charts=True,
backtest_only=False,
benchmark='000300.SHA'
)
[2022-04-02 23:51:19.061800] INFO: moduleinvoker: instruments.v2 开始运行..
[2022-04-02 23:51:19.072195] INFO: moduleinvoker: 命中缓存
[2022-04-02 23:51:19.074927] INFO: moduleinvoker: instruments.v2 运行完成[0.013134s].
[2022-04-02 23:51:19.084390] INFO: moduleinvoker: advanced_auto_labeler.v2 开始运行..
[2022-04-02 23:51:19.092666] INFO: moduleinvoker: 命中缓存
[2022-04-02 23:51:19.094597] INFO: moduleinvoker: advanced_auto_labeler.v2 运行完成[0.010206s].
[2022-04-02 23:51:19.099117] INFO: moduleinvoker: input_features.v1 开始运行..
[2022-04-02 23:51:19.109706] INFO: moduleinvoker: 命中缓存
[2022-04-02 23:51:19.111231] INFO: moduleinvoker: input_features.v1 运行完成[0.012112s].
[2022-04-02 23:51:19.121719] INFO: moduleinvoker: features_short.v1 开始运行..
[2022-04-02 23:51:19.128832] INFO: moduleinvoker: 命中缓存
[2022-04-02 23:51:19.130349] INFO: moduleinvoker: features_short.v1 运行完成[0.008631s].
[2022-04-02 23:51:19.134046] INFO: moduleinvoker: input_features.v1 开始运行..
[2022-04-02 23:51:19.140020] INFO: moduleinvoker: 命中缓存
[2022-04-02 23:51:19.141424] INFO: moduleinvoker: input_features.v1 运行完成[0.007377s].
[2022-04-02 23:51:19.158149] INFO: moduleinvoker: general_feature_extractor.v7 开始运行..
[2022-04-02 23:51:19.166049] INFO: moduleinvoker: 命中缓存
[2022-04-02 23:51:19.168800] INFO: moduleinvoker: general_feature_extractor.v7 运行完成[0.010656s].
[2022-04-02 23:51:19.179704] INFO: moduleinvoker: derived_feature_extractor.v3 开始运行..
[2022-04-02 23:51:19.187364] INFO: moduleinvoker: 命中缓存
[2022-04-02 23:51:19.189464] INFO: moduleinvoker: derived_feature_extractor.v3 运行完成[0.009757s].
[2022-04-02 23:51:19.202252] INFO: moduleinvoker: join.v3 开始运行..
[2022-04-02 23:51:19.212099] INFO: moduleinvoker: 命中缓存
[2022-04-02 23:51:19.216654] INFO: moduleinvoker: join.v3 运行完成[0.014384s].
[2022-04-02 23:51:19.232499] INFO: moduleinvoker: filter.v3 开始运行..
[2022-04-02 23:51:19.242516] INFO: moduleinvoker: 命中缓存
[2022-04-02 23:51:19.244136] INFO: moduleinvoker: filter.v3 运行完成[0.011641s].
[2022-04-02 23:51:19.252923] INFO: moduleinvoker: dropnan.v2 开始运行..
[2022-04-02 23:51:19.262151] INFO: moduleinvoker: 命中缓存
[2022-04-02 23:51:19.264733] INFO: moduleinvoker: dropnan.v2 运行完成[0.011792s].
[2022-04-02 23:51:19.277372] INFO: moduleinvoker: stock_ranker_train.v5 开始运行..
[2022-04-02 23:51:19.294866] INFO: moduleinvoker: 命中缓存
[2022-04-02 23:51:19.512892] INFO: moduleinvoker: stock_ranker_train.v5 运行完成[0.235516s].
[2022-04-02 23:51:19.522535] INFO: moduleinvoker: instruments.v2 开始运行..
[2022-04-02 23:51:19.530594] INFO: moduleinvoker: 命中缓存
[2022-04-02 23:51:19.532470] INFO: moduleinvoker: instruments.v2 运行完成[0.00994s].
[2022-04-02 23:51:19.548093] INFO: moduleinvoker: general_feature_extractor.v7 开始运行..
[2022-04-02 23:51:19.556347] INFO: moduleinvoker: 命中缓存
[2022-04-02 23:51:19.558609] INFO: moduleinvoker: general_feature_extractor.v7 运行完成[0.010546s].
[2022-04-02 23:51:19.576509] INFO: moduleinvoker: derived_feature_extractor.v3 开始运行..
[2022-04-02 23:51:19.584959] INFO: moduleinvoker: 命中缓存
[2022-04-02 23:51:19.587061] INFO: moduleinvoker: derived_feature_extractor.v3 运行完成[0.010555s].
[2022-04-02 23:51:19.601219] INFO: moduleinvoker: filter.v3 开始运行..
[2022-04-02 23:51:19.609963] INFO: moduleinvoker: 命中缓存
[2022-04-02 23:51:19.612306] INFO: moduleinvoker: filter.v3 运行完成[0.011076s].
[2022-04-02 23:51:19.624468] INFO: moduleinvoker: dropnan.v2 开始运行..
[2022-04-02 23:51:19.631752] INFO: moduleinvoker: 命中缓存
[2022-04-02 23:51:19.633548] INFO: moduleinvoker: dropnan.v2 运行完成[0.009077s].
[2022-04-02 23:51:19.644046] INFO: moduleinvoker: stock_ranker_predict.v5 开始运行..
[2022-04-02 23:51:19.653669] INFO: moduleinvoker: 命中缓存
[2022-04-02 23:51:19.656745] INFO: moduleinvoker: stock_ranker_predict.v5 运行完成[0.012695s].
[2022-04-02 23:51:19.666177] INFO: moduleinvoker: input_features.v1 开始运行..
[2022-04-02 23:51:19.674877] INFO: moduleinvoker: 命中缓存
[2022-04-02 23:51:19.676920] INFO: moduleinvoker: input_features.v1 运行完成[0.010748s].
[2022-04-02 23:51:19.704101] INFO: moduleinvoker: index_feature_extract.v3 开始运行..
[2022-04-02 23:51:19.757326] INFO: moduleinvoker: 命中缓存
[2022-04-02 23:51:19.759562] INFO: moduleinvoker: index_feature_extract.v3 运行完成[0.055489s].
[2022-04-02 23:51:19.765127] INFO: moduleinvoker: input_features.v1 开始运行..
[2022-04-02 23:51:19.772526] INFO: moduleinvoker: 命中缓存
[2022-04-02 23:51:19.774464] INFO: moduleinvoker: input_features.v1 运行完成[0.009337s].
[2022-04-02 23:51:19.795358] INFO: moduleinvoker: general_feature_extractor.v7 开始运行..
[2022-04-02 23:51:19.812023] INFO: moduleinvoker: 命中缓存
[2022-04-02 23:51:19.814434] INFO: moduleinvoker: general_feature_extractor.v7 运行完成[0.019082s].
[2022-04-02 23:51:19.826015] INFO: moduleinvoker: derived_feature_extractor.v3 开始运行..
[2022-04-02 23:51:19.835777] INFO: moduleinvoker: 命中缓存
[2022-04-02 23:51:19.837801] INFO: moduleinvoker: derived_feature_extractor.v3 运行完成[0.011793s].
[2022-04-02 23:51:19.850483] INFO: moduleinvoker: join.v3 开始运行..
[2022-04-02 23:51:19.859856] INFO: moduleinvoker: 命中缓存
[2022-04-02 23:51:19.862366] INFO: moduleinvoker: join.v3 运行完成[0.011871s].
[2022-04-02 23:51:19.873041] INFO: moduleinvoker: join.v3 开始运行..
[2022-04-02 23:51:19.884741] INFO: moduleinvoker: 命中缓存
[2022-04-02 23:51:19.887000] INFO: moduleinvoker: join.v3 运行完成[0.013949s].
[2022-04-02 23:51:19.893832] INFO: moduleinvoker: sort.v4 开始运行..
[2022-04-02 23:51:19.901316] INFO: moduleinvoker: 命中缓存
[2022-04-02 23:51:19.903461] INFO: moduleinvoker: sort.v4 运行完成[0.009624s].
[2022-04-02 23:51:19.959001] INFO: moduleinvoker: backtest.v8 开始运行..
[2022-04-02 23:51:19.997993] INFO: backtest: biglearning backtest:V8.6.2
[2022-04-02 23:51:28.441627] INFO: backtest: product_type:stock by specified
[2022-04-02 23:51:28.626403] INFO: moduleinvoker: cached.v2 开始运行..
[2022-04-02 23:51:28.635717] INFO: moduleinvoker: 命中缓存
[2022-04-02 23:51:28.637766] INFO: moduleinvoker: cached.v2 运行完成[0.011389s].
[2022-04-02 23:51:29.334237] INFO: algo: TradingAlgorithm V1.8.7
[2022-04-02 23:51:30.718469] INFO: algo: trading transform...
[2022-04-02 23:51:38.411595] INFO: algo: handle_splits get splits [dt:2018-04-12 00:00:00+00:00] [asset:Equity(557 [603456.SHA]), ratio:0.5491848587989807]
[2022-04-02 23:51:41.137033] INFO: algo: handle_splits get splits [dt:2018-05-11 00:00:00+00:00] [asset:Equity(918 [300346.SZA]), ratio:0.5860233306884766]
[2022-04-02 23:51:41.140431] INFO: Position: position stock handle split[sid:918, orig_amount:64500, new_amount:110063.0, orig_cost:30.301890820603088, new_cost:17.7576, ratio:0.5860233306884766, last_sale_price:17.610002517700195]
[2022-04-02 23:51:41.142117] INFO: Position: after split: PositionStock(asset:Equity(918 [300346.SZA]), amount:110063.0, cost_basis:17.7576, last_sale_price:30.05000114440918)
[2022-04-02 23:51:41.143669] INFO: Position: returning cash: 15.4503
[2022-04-02 23:51:43.700729] INFO: algo: handle_splits get splits [dt:2018-06-13 00:00:00+00:00] [asset:Equity(492 [300601.SZA]), ratio:0.6669785380363464]
[2022-04-02 23:51:57.583600] INFO: algo: handle_splits get splits [dt:2019-01-08 00:00:00+00:00] [asset:Equity(1065 [002607.SZA]), ratio:0.9500640630722046]
[2022-04-02 23:51:57.587027] INFO: Position: position stock handle split[sid:1065, orig_amount:604400, new_amount:636167.0, orig_cost:7.93028488108894, new_cost:7.5343, ratio:0.9500640630722046, last_sale_price:7.420000076293945]
[2022-04-02 23:51:57.589859] INFO: Position: after split: PositionStock(asset:Equity(1065 [002607.SZA]), amount:636167.0, cost_basis:7.5343, last_sale_price:7.809999942779541)
[2022-04-02 23:51:57.591975] INFO: Position: returning cash: 4.6484
[2022-04-02 23:52:05.795087] INFO: algo: handle_splits get splits [dt:2019-04-19 00:00:00+00:00] [asset:Equity(715 [002245.SZA]), ratio:0.9965457320213318]
[2022-04-02 23:52:05.796979] INFO: Position: position stock handle split[sid:715, orig_amount:650500, new_amount:652754.0, orig_cost:6.0101243403877715, new_cost:5.9894, ratio:0.9965457320213318, last_sale_price:5.7699995040893555]
[2022-04-02 23:52:05.798217] INFO: Position: after split: PositionStock(asset:Equity(715 [002245.SZA]), amount:652754.0, cost_basis:5.9894, last_sale_price:5.789999485015869)
[2022-04-02 23:52:05.799345] INFO: Position: returning cash: 4.5581
[2022-04-02 23:52:05.959688] INFO: algo: handle_splits get splits [dt:2019-04-22 00:00:00+00:00] [asset:Equity(687 [603638.SHA]), ratio:0.671668291091919]
[2022-04-02 23:52:05.962194] INFO: Position: position stock handle split[sid:687, orig_amount:144000, new_amount:214391.0, orig_cost:31.80198759455828, new_cost:21.3604, ratio:0.671668291091919, last_sale_price:22.830005645751953]
[2022-04-02 23:52:05.963832] INFO: Position: after split: PositionStock(asset:Equity(687 [603638.SHA]), amount:214391.0, cost_basis:21.3604, last_sale_price:33.9900016784668)
[2022-04-02 23:52:05.965303] INFO: Position: returning cash: 12.3521
[2022-04-02 23:52:08.112077] INFO: algo: handle_splits get splits [dt:2019-05-27 00:00:00+00:00] [asset:Equity(436 [300223.SZA]), ratio:0.9989210963249207]
[2022-04-02 23:52:08.114513] INFO: Position: position stock handle split[sid:436, orig_amount:158700, new_amount:158871.0, orig_cost:35.000066846752745, new_cost:34.9623, ratio:0.9989210963249207, last_sale_price:27.779996871948242]
[2022-04-02 23:52:08.116265] INFO: Position: after split: PositionStock(asset:Equity(436 [300223.SZA]), amount:158871.0, cost_basis:34.9623, last_sale_price:27.810001373291016)
[2022-04-02 23:52:08.117817] INFO: Position: returning cash: 11.3049
[2022-04-02 23:52:08.187019] INFO: algo: handle_splits get splits [dt:2019-05-28 00:00:00+00:00] [asset:Equity(68 [300035.SZA]), ratio:0.9951999187469482]
[2022-04-02 23:52:09.584319] INFO: algo: handle_splits get splits [dt:2019-06-21 00:00:00+00:00] [asset:Equity(222 [000596.SZA]), ratio:0.9866058826446533]
[2022-04-02 23:52:39.625815] INFO: algo: handle_splits get splits [dt:2020-07-31 00:00:00+00:00] [asset:Equity(406 [600316.SHA]), ratio:0.9996211528778076]
[2022-04-02 23:52:39.628771] INFO: Position: position stock handle split[sid:406, orig_amount:191600, new_amount:191672.0, orig_cost:26.7600850682515, new_cost:26.7499, ratio:0.9996211528778076, last_sale_price:26.380001068115234]
[2022-04-02 23:52:39.630458] INFO: Position: after split: PositionStock(asset:Equity(406 [600316.SHA]), amount:191672.0, cost_basis:26.7499, last_sale_price:26.389999389648438)
[2022-04-02 23:52:39.631986] INFO: Position: returning cash: 16.2136
[2022-04-02 23:53:00.294887] INFO: algo: handle_splits get splits [dt:2021-05-18 00:00:00+00:00] [asset:Equity(512 [300751.SZA]), ratio:0.5542612075805664]
[2022-04-02 23:53:00.297065] INFO: algo: handle_splits get splits [dt:2021-05-18 00:00:00+00:00] [asset:Equity(584 [603392.SHA]), ratio:0.713743269443512]
[2022-04-02 23:53:00.298663] INFO: Position: position stock handle split[sid:584, orig_amount:19500, new_amount:27320.0, orig_cost:326.0080393952682, new_cost:232.686, ratio:0.713743269443512, last_sale_price:233.179931640625]
[2022-04-02 23:53:00.300176] INFO: Position: after split: PositionStock(asset:Equity(584 [603392.SHA]), amount:27320.0, cost_basis:232.686, last_sale_price:326.70001220703125)
[2022-04-02 23:53:00.301741] INFO: Position: returning cash: 174.4182
[2022-04-02 23:53:03.315829] INFO: algo: handle_splits get splits [dt:2021-06-30 00:00:00+00:00] [asset:Equity(385 [300759.SZA]), ratio:0.9986032247543335]
[2022-04-02 23:53:03.317876] INFO: algo: handle_splits get splits [dt:2021-06-30 00:00:00+00:00] [asset:Equity(476 [300763.SZA]), ratio:0.588227391242981]
[2022-04-02 23:53:03.319351] INFO: Position: position stock handle split[sid:385, orig_amount:29400, new_amount:29441.0, orig_cost:214.78253372879075, new_cost:214.4825, ratio:0.9986032247543335, last_sale_price:214.51995849609375]
[2022-04-02 23:53:03.320965] INFO: Position: after split: PositionStock(asset:Equity(385 [300759.SZA]), amount:29441.0, cost_basis:214.4825, last_sale_price:214.82000732421875)
[2022-04-02 23:53:03.322484] INFO: Position: returning cash: 26.3069
[2022-04-02 23:53:03.323936] INFO: Position: position stock handle split[sid:476, orig_amount:20700, new_amount:35190.0, orig_cost:275.0009971121443, new_cost:161.7631, ratio:0.588227391242981, last_sale_price:176.87998962402344]
[2022-04-02 23:53:03.325455] INFO: Position: after split: PositionStock(asset:Equity(476 [300763.SZA]), amount:35190.0, cost_basis:161.7631, last_sale_price:300.70001220703125)
[2022-04-02 23:53:03.326839] INFO: Position: returning cash: 83.6253
[2022-04-02 23:53:20.376581] INFO: Performance: Simulated 1032 trading days out of 1032.
[2022-04-02 23:53:20.382829] INFO: Performance: first open: 2018-01-02 09:30:00+00:00
[2022-04-02 23:53:20.385910] INFO: Performance: last close: 2022-04-01 15:00:00+00:00
[2022-04-02 23:53:24.942383] INFO: moduleinvoker: backtest.v8 运行完成[124.983397s].
[2022-04-02 23:53:24.944254] INFO: moduleinvoker: trade.v4 运行完成[125.033194s].
# df2=m12.data.read()
# df2
#df2[df2.instrument=='000002.SZA'].loc[df2.date=='2019-09-30'].cond8
#DataSource('bar1d_CN_STOCK_A').read(instruments=['600773.SHA'],start_date = '2016-12-29',end_date = '2016-12-29')
#(75.100739+74.35778)/2