问答交流

高频回测模块报错

由junglewolfz创建,最终由junglewolfz 被浏览 42 用户

代码

代码:在高频回测模块的k线处理函数定义如下:
# 回测引擎:每日数据处理函数,每天执行一次
def bigquant_run(context, data):
    
    # 相隔几天(hold_days)进行一下换仓
    if context.trading_day_index % context.hold_days != 0:
        return 
    
    # 按日期过滤得到今日的预测数据
    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()}
    # 权重
    buy_cash_weights = context.stock_weights
    # 今日买入股票列表
    stock_to_buy = list(ranker_prediction.instrument[:len(buy_cash_weights)])
    # 持仓上限
    max_cash_per_instrument = context.portfolio.portfolio_value * context.max_cash_per_instrument

    # 通过positions对象,使用列表生成式的方法获取目前持仓的股票列表
    stock_hold_now = [equity.symbol for equity in context.portfolio.positions ]
    # 继续持有的股票:调仓时,如果买入的股票已经存在于目前的持仓里,那么应继续持有
    no_need_to_sell = [i for i in stock_hold_now if i in stock_to_buy]
    # 需要卖出的股票
    stock_to_sell = [i for i in stock_hold_now if i not in no_need_to_sell]
  
    # 卖出
    for stock in stock_to_sell:
        # 如果该股票停牌,则没法成交。因此需要用can_trade方法检查下该股票的状态
        # 如果返回真值,则可以正常下单,否则会出错
        # 因为stock是字符串格式,我们用symbol方法将其转化成平台可以接受的形式:Equity格式
        if data.can_trade(context.symbol(stock)):
            # order_target_percent是平台的一个下单接口,表明下单使得该股票的权重为0,
            #   即卖出全部股票,可参考回测文档
            context.order_target_percent(context.symbol(stock), 0)
    
    # 如果当天没有买入的股票,就返回
    if len(stock_to_buy) == 0:
        return
    
    # 买入
    for i, instrument in enumerate(stock_to_buy):
        cash = context.portfolio.portfolio_value * 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:
            context.order_value(context.symbol(instrument), cash)



报错:


AttributeError                            Traceback (most recent call last)
<ipython-input-4-2f2051da032e> in <module>
    287 )
    288 
--> 289 m21 = M.hftrade.v2(
    290     instruments=m12.instrument_list,
    291     options_data=m8.predictions,

<ipython-input-4-2f2051da032e> in m21_handle_data_bigquant_run(context, data)
     95         context.ranker_prediction.date == data.current_dt.strftime('%Y-%m-%d')]
     96     # 目前持仓
---> 97     positions = {e.symbol: p.amount * p.last_sale_price for e, p in context.portfolio.positions.items()}
     98     # 权重
     99     buy_cash_weights = context.stock_weights

<ipython-input-4-2f2051da032e> in <dictcomp>(.0)
     95         context.ranker_prediction.date == data.current_dt.strftime('%Y-%m-%d')]
     96     # 目前持仓
---> 97     positions = {e.symbol: p.amount * p.last_sale_price for e, p in context.portfolio.positions.items()}
     98     # 权重
     99     buy_cash_weights = context.stock_weights

AttributeError: 'str' object has no attribute 'symbol'

解答

直接从trade模块拷贝过来的话确实会有问题,很多trade模块的接口和HFTrade模块的接口确实会有些不同。

for e, p in context.portfolio.positions.items():
    print(e) # e即为symbol,不需要原来的e.symbol
    print(j) # j是一个对象,标的为股票的话对象名为StockPosition,期货的话为FuturePosition / 具体对象名能有哪些attribute, 可以参考文档https://bigquant.com/wiki/doc/-uUmJMOnqYu

文档中这个地方即为上述的对象名下面可获取的attribute列表


{w:100}

\

标签

高频交易回测模块bigquant_run函数data换仓
评论
  • ```python positions = {e.symbol: p.amount * p.last_sale_price for e, p in context.portfolio.positions.items()} 这段代码是从平台的高频回测说明那里抄过来的。而且单独在notepad中运行这句话也不会报错 ``` \
  • 我使用的是高频回测模块 HFTrade 回测对象是可转债 用的是stockranker 。预测数据包括 date instrument score position 这四列
  • 直接从trade模块拷贝过来的话确实会有问题,很多trade模块的接口和HFTrade模块的接口确实会有些不同。 ```python for e, p in context.portfolio.positions.items(): print(e) # e即为symbol,不需要原来的e.symbol print(j) # j是一个对象,标的为股票的话对象名为StockPosition,期货的话为FuturePosition / 具体对象名能有哪些attribute, 可以参考文档https://bigquant.com/wiki/doc/-uUmJMOnqYu ``` 文档中这个地方即为上述的对象名下面可获取的attribute列表 ![{w:100}](/wiki/api/attachments.redirect?id=2ce08859-bb0f-4eb8-a0e5-0ec0103791ac)
{link}