问答交流

【代码报错】AttributeError: 'StrategyContext' object has no attribute 'perf_tracker

由liyajuan57创建,最终由small_q 被浏览 11 用户

1.0策略升级3.0报错

\n**==AttributeError: 'StrategyContext' object has no attribute 'perf_tracker'==**

Output is truncated. View as a open in a text editor. Adjust cell output settings...


K线处理代码为:

回测引擎:每日数据处理函数,每天执行一次

def bigquant_run(context, data):

    #获取当日日期
today = data.current_dt.strftime('%Y-%m-%d')
stock_hold_now = [equity.symbol for equity in context.portfolio.positions ]
#大盘风控模块,读取风控数据  
current_day_data2 = context.data2[context.data2["date"] == today]
benckmark_risk = current_day_data2['market_risk_indicator'].iloc[0]

benckmark_risk=context.benckmark_risk[today]

context.symbol
#当risk为1时,市场有风险,全部平仓,不再执行其它操作
if benckmark_risk > 0:
    for instrument in stock_hold_now:
        context.order_target(symbol(instrument), 0)
    print(today,'大盘风控止损触发,全仓卖出')
    return

#------------------------------------------止损模块START--------------------------------------------
equities = {e.symbol: p for e, p in context.portfolio.positions.items() if p.amount>0}

# 新建当日止损股票列表是为了handle_data 策略逻辑部分不再对该股票进行判断
stoploss_stock = [] 
if len(equities) > 0:
    for i in equities.keys():
        stock_market_price = data.current(context.symbol(i), 'price')  # 最新市场价格
        last_sale_date = equities[i].last_sale_date   # 上次交易日期
        delta_days = data.current_dt - last_sale_date  
        hold_days = delta_days.days # 持仓天数
        # 建仓以来的最高价
        highest_price_since_buy = data.history(context.symbol(i), 'high', hold_days, '1d').max()
        # 确定止损位置
        stoploss_line = highest_price_since_buy - highest_price_since_buy * 0.05
        #record('止损位置', stoploss_line)
        # 如果价格下穿止损位置
        if stock_market_price < stoploss_line:
            context.order_target_percent(context.symbol(i), 0)     
            stoploss_stock.append(i)
    if len(stoploss_stock)>0:
        print('日期:', today, '股票:', stoploss_stock, '出现跟踪止损状况')
#-------------------------------------------止损模块END---------------------------------------------    

# 按日期过滤得到今日的预测数据

ranker_prediction = context.ranker_prediction[

context.ranker_prediction.date == data.current_dt.strftime('%Y-%m-%d')]

ranker_prediction =context.data[context.data["date"] == data.current_dt.strftime("%Y-%m-%d")]

# 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.perf_tracker.position_tracker.positions.items()}
sell_stock = []
# 2. 生成卖出订单:hold_days天之后才开始卖出;对持仓的股票,按机器学习算法预测的排序末位淘汰

if not is_staging and cash_for_sell > 0:

==equities = {e.symbol: e for e, p in context.perf_tracker.position_tracker.positions.items()}==


instruments = stock_hold_now

# print('rank order for sell %s' % instruments)

for instrument in instruments:

# 如果已经移动止损卖出过则不再轮仓卖出,以防止出现空头持仓

if instrument in stoploss_stock:

continue

context.order_target(context.symbol(instrument), 0)

cash_for_sell -= positions[instrument]

if cash_for_sell <= 0:

break


\

文档

【代码报错】IndexError: index 8325 is out of bounds for axis 0 with size 8324
评论
  • 获取持仓请使用 get_position() 或 get_positions(),具体请查看bigtrader文档
  • 谢谢!
{link}