问答交流

开发环境运行策略代码报错AttributeError: 'TradingEnvironment' object has no attribute 'options_data'

由bqkrmo6v创建,最终由small_q 被浏览 70 用户


比较怪的是,下午都能运行的代码,晚上就不可运行了,\n使用新账号,报同样的错,

使用新电脑,报同样的错,

这个是代码问题还是环境问题,如果是环境问题有没有办法重置当前账号环境(以我的测试,这个应该不是环境问题)

我也看了M.hftrade.v2的文档,的确是没有 options_data属性,但是options_data是图形操作系统自己生成的。

\

# 本代码由可视化策略环境自动生成 2023年8月8日 09:32
# 本代码单元只能在可视化模式下编辑。您也可以拷贝代码,粘贴到新建的代码单元或者策略,然后修改。
 
# 显式导入 BigQuant 相关 SDK 模块
from bigdatasource.api import DataSource
from biglearning.api import M
from biglearning.api import tools as T
from biglearning.module2.common.data import Outputs
 
import pandas as pd
import numpy as np
import math
import warnings
import datetime
 
from zipline.finance.commission import PerOrder
from zipline.api import get_open_orders
from zipline.api import symbol
 
from bigtrader.sdk import *
from bigtrader.utils.my_collections import NumPyDeque
from bigtrader.constant import OrderType
from bigtrader.constant import Direction

# Python 代码入口函数,input_1/2/3 对应三个输入端,data_1/2/3 对应三个输出端
def m8_run_bigquant_run(input_1, input_2, input_3):
    # 示例代码如下。在这里编写您的代码
    df = input_1.read()
    df['list_date'] = df['list_date'].astype(str)
    df['delist_date'] = df['delist_date'].astype(str)
    df = df.loc[:,['instrument','list_date','delist_date']]
    
    data_1 = DataSource.write_df(df)
    return Outputs(data_1=data_1, data_2=None, data_3=None)

# 后处理函数,可选。输入是主函数的输出,可以在这里对数据做处理,或者返回更友好的outputs数据格式。此函数输出不会被缓存。
def m8_post_run_bigquant_run(outputs):
    return outputs

# Python 代码入口函数,input_1/2/3 对应三个输入端,data_1/2/3 对应三个输出端
def m9_run_bigquant_run(input_1, input_2, input_3):
    # 示例代码如下。在这里编写您的代码
    df = input_1.read()
    
    df = df.loc[:,['date','instrument','close','bond_prem_ratio','double_low','remain_size']]
    
    data_1 = DataSource.write_df(df)
    return Outputs(data_1=data_1, data_2=None, data_3=None)

# 后处理函数,可选。输入是主函数的输出,可以在这里对数据做处理,或者返回更友好的outputs数据格式。此函数输出不会被缓存。
def m9_post_run_bigquant_run(outputs):
    print(outputs)
    # 从数据输出端 data_1 中读取数据
    df = outputs.data_1.read()
    print(df)
    # 对读取的数据进行处理,例如添加新的列
    df['new_column'] = df['close'] * 2
    df['double_low_custom'] = df['close'] + df['bond_prem_ratio']
    # 将处理后的数据写入一个新的输出端 data_2 中
    data_1 = DataSource.write_df(df)
    
    # 返回新的 Outputs 对象
    return Outputs(data_1=data_1)


# 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['date'] = pd.to_datetime(df['date'])
    df['list_date'] = pd.to_datetime(df['list_date'])
    df['delist_date'] = pd.to_datetime(df['delist_date'])
    
    #买入规则:上市满30天才能买入
    df['can_buy'] = df['date'] > (df['list_date'] + timedelta(days=30))

    #卖出规则:离退市日期差6个月时清仓
    df['to_clean'] = (df['date'] + timedelta(days=180)) > df['delist_date']
    
    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 m7_initialize_bigquant_run(context):
    print("initializing")
       # 加载股票指标数据,数据继承自m6模块
    context.indicator_data = context.options['data'].read_df()

    # 系统已经设置了默认的交易手续费和滑点,要修改手续费可使用如下函数
    context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))
    
    # 设置股票数量
    context.stock_num = 20
    
    # 调仓天数,22个交易日大概就是一个月。可以理解为一个月换仓一次
    context.rebalance_days = 22
    
    # 如果策略运行中,需要将数据进行保存,可以借用extension这个对象,类型为dict
    # 比如当前运行的k线的索引,比如个股持仓天数、买入均价
    try:
        print(f"check idx: {context.extension.idx}")
    except AttributeError as e:
        context.extension.idx = 0
 
# 交易引擎:每个单位时间开盘前调用一次。
def m7_before_trading_start_bigquant_run(context, data):
    context.subscribe(context.instruments)
    pass
# 交易引擎:tick数据处理函数,每个tick执行一次
def m7_handle_tick_bigquant_run(context, data):
    pass

# 回测引擎:每日数据处理函数,每天执行一次
def m7_handle_data_bigquant_run(context, data):
    
    context.extension.idx += 1
    # 不在换仓日就return,相当于后面的代码只会一个月运行一次,买入的股票会持有1个月
    if  context.extension.idx % context.rebalance_days != 0:
        return
    
    # 当前的日期
    date = data.current_dt.strftime('%Y-%m-%d')
    cur_data = context.indicator_data[context.indicator_data['date'] == date]
    
    print('cur_data')
    print(cur_data)
    #建仓条件判断:市场双低均值达到170可进行建仓
    if cur_data['double_low'].mean() > 170:
        print(date,':该调仓日市场双低均值为',cur_data['double_low'].mean(),",无需建仓")
        return
    
    
    # 设定股票池
    # 条件1:上市超过1个月
    stock_can_buy = cur_data[cur_data['can_buy'] == 1]
    # 条件2:剩余期限小于180个自然日
    stock_to_clean = cur_data[cur_data['to_clean'] == 1]
    
    symbols = list(set(stock_can_buy['instrument'].values).difference(set(stock_to_clean['instrument'].values)))
    cur_data = cur_data.set_index('instrument').loc[symbols,:].reset_index().sort_values('double_low')
    stock_to_buy = list(cur_data.instrument[:context.stock_num])
   
    # 通过positions对象,使用列表生成式的方法获取目前持仓的股票列表
    stock_hold_now = [equity 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:
        context.order_target_percent(stock, 0)
    
    # 如果当天没有买入的股票,就返回
    if len(stock_to_buy) == 0:
        print(date,'当天没有买入的股票')
        return

    # 等权重买入 
    weight =  1 / len(stock_to_buy)
    
    # 买入
    for stock in stock_to_buy:
        context.order_target_percent(stock, weight)
 
# 交易引擎:成交回报处理函数,每个成交发生时执行一次
def m7_handle_trade_bigquant_run(context, data):
    pass

# 交易引擎:委托回报处理函数,每个委托变化时执行一次
def m7_handle_order_bigquant_run(context, data):
    pass

# 交易引擎:盘后处理函数,每日盘后执行一次
def m7_after_trading_bigquant_run(context, data):
    pass


m1 = M.use_datasource.v1(
    datasource_id='market_performance_CN_CONBOND',
    start_date='2020-01-01',
    end_date='2023-05-31'
)

m6 = M.trade_data_generation.v1(
    input=m1.data,
    category='CN_STOCK',
    m_cached=False
)

m2 = M.use_datasource.v1(
    datasource_id='basic_info_CN_CONBOND',
    start_date='2020-01-01',
    end_date='2023-05-31'
)

m8 = M.cached.v3(
    input_1=m2.data,
    run=m8_run_bigquant_run,
    post_run=m8_post_run_bigquant_run,
    input_ports='',
    params='{}',
    output_ports=''
)

m4 = M.input_features.v1(
    features="""
# #号开始的表示注释,注释需单独一行
# 多个特征,每行一个,可以包含基础特征和衍生特征,特征须为本平台特征
double_low = close + bond_prem_ratio
remain_size > 1.5
"""
)

m5 = M.derived_feature_extractor.v3(
    input_data=m1.data,
    features=m4.data,
    date_col='date',
    instrument_col='instrument',
    drop_na=False,
    remove_extra_columns=False,
    user_functions={}
)

m9 = M.cached.v3(
    input_1=m5.data,
    run=m9_run_bigquant_run,
    post_run=m9_post_run_bigquant_run,
    input_ports='',
    params='{}',
    output_ports=''
)

m3 = M.join.v3(
    data1=m9.data_1,
    data2=m8.data_1,
    on='instrument',
    how='inner',
    sort=False
)

m10 = M.cached.v3(
    input_1=m3.data,
    run=m10_run_bigquant_run,
    post_run=m10_post_run_bigquant_run,
    input_ports='',
    params='{}',
    output_ports=''
)

m7 = M.hftrade.v2(
    instruments=m6.instrument_list,
    options_data=m10.data_1,
    start_date='2020-01-01',
    end_date='2023-05-31',
    initialize=m7_initialize_bigquant_run,
    before_trading_start=m7_before_trading_start_bigquant_run,
    handle_tick=m7_handle_tick_bigquant_run,
    handle_data=m7_handle_data_bigquant_run,
    handle_trade=m7_handle_trade_bigquant_run,
    handle_order=m7_handle_order_bigquant_run,
    after_trading=m7_after_trading_bigquant_run,
    capital_base=1000001,
    frequency='daily',
    price_type='真实价格',
    product_type='可转债',
    before_start_days='0',
    volume_limit=1,
    order_price_field_buy='close',
    order_price_field_sell='close',
    benchmark='000300.HIX',
    plot_charts=True,
    disable_cache=False,
    replay_bdb=False,
    show_debug_info=False,
    backtest_only=False
)

\

{'version': 'v3', 'data_1': DataSource(655cd94fe54d4e79940331959bef7651T), 'data_2': None, 'data_3': None}             date  instrument       close  bond_prem_ratio  double_low  \0      2020-01-02  110031.HCB  126.000000        18.393200  144.393204   1      2020-01-02  110033.HCB  116.800003        16.957600  133.757599   2      2020-01-02  110034.HCB  108.900002        42.707199  151.607208   3      2020-01-02  110038.HCB  109.000000        73.657204  182.657196   4      2020-01-02  110041.HCB  119.900002        21.189199  141.089203   ...           ...         ...         ...              ...         ...   311491 2023-05-31  128143.ZCB  118.906998        38.032600  156.939606   311492 2023-05-31  128144.ZCB  113.714996        38.135300  151.850296   311493 2023-05-31  132018.HCB  141.746002         0.248600  141.994598   311494 2023-05-31  132020.HCB  110.274002        50.236301  160.510300   311495 2023-05-31  132026.HCB  109.319000        20.343100  129.662094           remain_size  0         23.989988  1         12.117621  2         14.992964  3          6.309111  4         18.730385  ...             ...  311491     2.439604  311492     9.793798  311493   131.698441  311494    35.064827  311495   100.000000  [311496 rows x 6 columns][2023-08-08 09:44:42.720546] INFO join: /data, 行数=307808/996, 耗时=0.325205s[2023-08-08 09:44:42.782457] INFO join: 最终行数: 307808[2023-08-08 09:44:48.359183] INFO hfbacktest: biglearning V1.4.21[2023-08-08 09:44:48.362653] INFO hfbacktest: bigtrader v1.10.4 2023-07-24---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[2], line 256
    239 m3 = M.join.v3(
    240     data1=m9.data_1,
    241     data2=m8.data_1,
   (...)
    244     sort=False
    245 )
    247 m10 = M.cached.v3(
    248     input_1=m3.data,
    249     run=m10_run_bigquant_run,
   (...)
    253     output_ports=''
    254 )
--> 256 m7 = M.hftrade.v2(
    257     instruments=m6.instrument_list,
    258     options_data=m10.data_1,
    259     start_date='2020-01-01',
    260     end_date='2023-05-31',
    261     initialize=m7_initialize_bigquant_run,
    262     before_trading_start=m7_before_trading_start_bigquant_run,
    263     handle_tick=m7_handle_tick_bigquant_run,
    264     handle_data=m7_handle_data_bigquant_run,
    265     handle_trade=m7_handle_trade_bigquant_run,
    266     handle_order=m7_handle_order_bigquant_run,
    267     after_trading=m7_after_trading_bigquant_run,
    268     capital_base=1000001,
    269     frequency='daily',
    270     price_type='真实价格',
    271     product_type='可转债',
    272     before_start_days='0',
    273     volume_limit=1,
    274     order_price_field_buy='close',
    275     order_price_field_sell='close',
    276     benchmark='000300.HIX',
    277     plot_charts=True,
    278     disable_cache=False,
    279     replay_bdb=False,
    280     show_debug_info=False,
    281     backtest_only=False
    282 )
File module2/common/modulemanagerv2.py:88, in biglearning.module2.common.modulemanagerv2.BigQuantModuleVersion.__call__()
File module2/common/moduleinvoker.py:331, in biglearning.module2.common.moduleinvoker.module_invoke()
File module2/common/moduleinvoker.py:253, in biglearning.module2.common.moduleinvoker._invoke_with_cache()
File module2/common/moduleinvoker.py:214, in biglearning.module2.common.moduleinvoker._invoke_with_cache()
File module2/common/moduleinvoker.py:171, in biglearning.module2.common.moduleinvoker._module_run()
File module2/modules/hftrade/v2/__init__.py:351, in biglearning.module2.modules.hftrade.v2.__init__.bigquant_run()
File module2/modules/hftrade/v2/__init__.py:190, in biglearning.module2.modules.hftrade.v2.__init__.bigquant_run.do_backtest_run()
File module2/common/modulemanagerv2.py:88, in biglearning.module2.common.modulemanagerv2.BigQuantModuleVersion.__call__()
File module2/common/moduleinvoker.py:331, in biglearning.module2.common.moduleinvoker.module_invoke()
File module2/common/moduleinvoker.py:253, in biglearning.module2.common.moduleinvoker._invoke_with_cache()
File module2/common/moduleinvoker.py:214, in biglearning.module2.common.moduleinvoker._invoke_with_cache()
File module2/common/moduleinvoker.py:173, in biglearning.module2.common.moduleinvoker._module_run()
File module2/modules/hfbacktest/v1/__init__.py:568, in biglearning.module2.modules.hfbacktest.v1.__init__.BigQuantModule.run()
File module2/modules/hfbacktest/v1/__init__.py:504, in biglearning.module2.modules.hfbacktest.v1.__init__.BigQuantModule.run_algo()
File /var/app/enabled/bigtrader2/bigtrader/run_trading.py:750, in run_backtest(start_date, end_date, strategy, strategy_setting, capital_base, product_type, frequency, instruments, options_data, **kwargs)
    747 if kwargs.get("capital") and capital_base == DEFAULT_CAPITAL:
    748     capital_base = kwargs.pop("capital")
--> 750 rt = RunTrading(RunMode.BACKTEST,
    751                 acct_type=acct_type,
    752                 account_id=account_id,
    753                 password="",
    754                 strategy=strategy,
    755                 strategy_setting=strategy_setting,
    756                 start_date=start_date,
    757                 end_date=end_date,
    758                 capital_base=capital_base,
    759                 instruments=instruments,
    760                 product_type=product_type,
    761                 frequency=frequency,
    762                 options_data=options_data,
    763                 **kwargs)
    764 return rt.run(**kwargs)
File /var/app/enabled/bigtrader2/bigtrader/run_trading.py:267, in RunTrading.__init__(self, run_mode, strategy, **kwargs)
    265     options_data = kwargs.pop("options_data", None)
    266     if options_data is not None:
--> 267         trading_env.options['data'] = trading_env.options_data
    269 if "initial_positions" in kwargs:
    270     trading_env.initial_positions = kwargs.pop("initial_positions")
AttributeError: 'TradingEnvironment' object has no attribute 'options_data'

\

标签

AttributeErrordata
评论
  • 已经修复了
{link}