程序报错,求助!
由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>
\