问答交流

程序报错,求助!

由bqhlrz48创建,最终由hxgre 被浏览 3 用户

报错信息:

IndexError Traceback (most recent call last) Cell In[1],

line 52 39 m6 = M.input_features_dai.v30( 40 mode="表达式", 41 expr="(close / m_lag(close, 20) - 1) AS score", # N天的动量因子 (...) 48 m_name="m6" 49 ) 51 # @module(position="140,90", comment="""持股数量、打分到仓位""") ---> 52 m2 = M.score_to_position.v4( 53 score_field="""score DESC""", 54 hold_count=3, 55 position_expr="""1 AS position""", 56 total_position=1, 57 extract_data=False, 58 m_name="""m2""" 59 ) 61 # @module(position="140,220", comment="""抽取预测数据""") 62 m3 = M.extract_data_dai.v18( 63 sql=m2.data, 64 start_date="""2024-05-20""", (...) 71 m_name="""m3""" 72 )

File /opt/pyenv/versions/3.11.8/lib/python3.11/site-packages/bigmodule/modules.py:28, in call(self, **kwargs) File /opt/pyenv/versions/3.11.8/lib/python3.11/site-packages/bigmodule/moduleinvoker.py:203, in module_invoke(name, version, kwargs) File /opt/pyenv/versions/3.11.8/lib/python3.11/site-packages/bigmodule/moduleinvoker.py:169, in _module_invoke(name, version, kwargs) File /opt/pyenv/versions/3.11.8/lib/python3.11/site-packages/bigmodule/moduleinvoker.py:41, in _module_run(module, kwargs) File dist/build/score_to_position/v4/init.py:229, in v4.run() File dist/build/score_to_position/v4/init.py:135, in v4._build_sql_from_expr() IndexError: list index out of range


程序源代码如下:

from bigmodule import M

# <aistudiograph>

# @param(id="m4", name="initialize")
# 交易引擎:初始化函数,只执行一次
def m4_initialize_bigquant_run(context):
    from bigtrader.finance.commission import PerOrder

    # 系统已经设置了默认的交易手续费和滑点,要修改手续费可使用如下函数
    context.set_commission(PerOrder(buy_cost=0.0000, sell_cost=0.0003, min_cost=5))
    pass

# @param(id="m4", name="handle_data")
def m4_handle_data_bigquant_run(context, data):
    import pandas as pd

    # 下一个交易日不是调仓日,则不生成信号
    if not context.rebalance_period.is_signal_date(data.current_dt.date()):
        return

    # 从传入的数据 context.data 中读取今天的信号数据
    today_df = context.data[context.data["date"] == data.current_dt.strftime("%Y-%m-%d")]
    target_instruments = set(today_df["instrument"])

    # 获取当前已持有ETF
    holding_instruments = set(context.get_account_positions().keys())

    # 卖出不在目标持有列表中的ETF
    for instrument in holding_instruments - target_instruments:
        context.order_target_percent(instrument, 0)
        
    # 买入目标持有列表中的ETF
    for i, x in today_df.iterrows():
        # 处理 null 或者 decimal.Decimal 类型等
        position = 0.0 if pd.isnull(x.position) else float(x.position)
        context.order_target_percent(x.instrument, position)

m6 = M.input_features_dai.v30(
    mode="表达式",
    expr="(close / m_lag(close, 20) - 1) AS score", # N天的动量因子
    expr_filters="instrument in ('512100.SH','510880.SH','513730.SH', '513180.SH', '159561.SZ','518880.SH','520580.SH','513080.SH','513500.SH','513000.SH','159329.SZ','513310.SH','159980.SZ','159985.SZ','159981.SZ','511880','511990','511660')",
    expr_tables="cn_fund_bar1d",
    extra_fields="date, instrument",
    order_by="date",
    expr_drop_na=True,
    extract_data=False,
    m_name="m6"
)

# @module(position="140,90", comment="""持股数量、打分到仓位""")
m2 = M.score_to_position.v4(
    score_field="""score DESC""",
    hold_count=3,
    position_expr="""1 AS position""",
    total_position=1,
    extract_data=False,
    m_name="""m2"""
)

# @module(position="140,220", comment="""抽取预测数据""")
m3 = M.extract_data_dai.v18(
    sql=m2.data,
    start_date="""2024-05-20""",
    start_date_bound_to_trading_date=True,
    end_date="""2025-05-20""",
    end_date_bound_to_trading_date=True,
    before_start_days=150,
    keep_before=False,
    debug=False,
    m_name="""m3"""
)

# @module(position="140,350", comment="""交易,日线,设置初始化函数和K线处理函数,以及初始资金、基准等""")
m4 = M.bigtrader.v35(
    data=m3.data,
    start_date="""""",
    end_date="""""",
    initialize=m4_initialize_bigquant_run,
    handle_data=m4_handle_data_bigquant_run,
    capital_base=1000000,
    frequency="""daily""",
    product_type="""股票""",
    rebalance_period_type="""交易日""",
    rebalance_period_days="""5""",
    rebalance_period_roll_forward=True,
    backtest_engine_mode="""标准模式""",
    before_start_days=0,
    volume_limit=1,
    order_price_field_buy="""open""",
    order_price_field_sell="""open""",
    benchmark="""沪深300指数""",
    plot_charts=True,
    debug=True,
    backtest_only=False,
    m_name="""m4"""
)
# </aistudiograph>

\

评论
  • 参考模版策略,m2仓位分配需要有输入数据
{link}