问答交流

程生运行报错Cannot cast array data from dtype('O') to dtype('float64') according to the rule 'safe'

由bqrctkw8创建,最终由bqrctkw8 被浏览 1 用户

from bigmodule import M

# <aistudiograph>

# @param(id="m9", name="run")
def m9_run_bigquant_run(input_1, input_2, input_3):
    # Python 代码入口函数,input_1/2/3 对应三个输入端,data_1/2/3 对应三个输出端
    # 示例代码如下。在这里编写您的代码
    import dai

    df = input_1.read()
    
    drop_cols =['st_status', 'low', 'low_1', 'price_limit_status']
    
    df = df.drop(columns=drop_cols)

   
    ds = dai.DataSource.write_bdb(df)

    return dict(data_1=ds, data_2={"hello": "world"}, data_3=None)

# @param(id="m14", name="initialize")
# 交易引擎:初始化函数, 只执行一次
def m14_initialize_bigquant_run(context):
    import math
    import numpy as np

    from bigtrader.finance.commission import PerOrder

    # 系统已经设置了默认的交易手续费和滑点, 要修改手续费可使用如下函数
    context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))
    # 预测数据, 通过 options 传入进来, 使用 read_df 函数, 加载到内存 (DataFrame)
    # 设置买入的股票数量, 这里买入预测股票列表排名靠前的5只
    stock_count = 2
    # 每只的股票的权重, 如下的权重分配会使得靠前的股票分配多一点的资金, [0.339160, 0.213986, 0.169580, ..]
    context.stock_weights = np.array(
        [1 / math.log(i + 2) for i in range(0, stock_count)]
    )
    context.stock_weights = context.stock_weights / context.stock_weights.sum()

    # 设置每只股票占用的最大资金比例
    context.max_cash_per_instrument = 0.5
    context.options["hold_days"] = 2


# @param(id="m14", name="before_trading_start")
# 交易引擎:每个单位时间开盘前调用一次。
def m14_before_trading_start_bigquant_run(context, data):
    # 盘前处理,订阅行情等
    pass

# @param(id="m14", name="handle_data")
# 回测引擎:每日数据处理函数, 每天执行一次
def m14_handle_data_bigquant_run(context, data):
    # 按日期过滤得到今日的预测数据
    ranker_prediction = context.data[
        context.data.date == data.current_dt.strftime("%Y-%m-%d")
    ]
    
    ranker_prediction = ranker_prediction.sort_values('score', ascending=False)
    
    

    # 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: p.amount * p.last_sale_price for e, p in context.portfolio.positions.items()
    }

    # 2. 生成卖出订单:hold_days天之后才开始卖出;对持仓的股票, 按机器学习算法预测的排序末位淘汰
    if not is_staging and cash_for_sell > 0:
        equities = {e: e for e, p in context.portfolio.positions.items()}
        instruments = list(
            reversed(
                list(
                    ranker_prediction.instrument[
                        ranker_prediction.instrument.apply(lambda x: x in equities)
                    ]
                )
            )
        )

        for instrument in instruments:
            context.order_target(instrument, 0)
            cash_for_sell -= positions[instrument]
            if cash_for_sell <= 0:
                break

    # 3. 生成买入订单:按机器学习算法预测的排序, 买入前面的stock_count只股票
    buy_cash_weights = context.stock_weights
    buy_instruments = list(ranker_prediction.instrument[: len(buy_cash_weights)])
    max_cash_per_instrument = (
        context.portfolio.portfolio_value * context.max_cash_per_instrument
    )
    for i, instrument in enumerate(buy_instruments):
        cash = cash_for_buy * 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(instrument, cash)

# @param(id="m14", name="handle_trade")
# 交易引擎:成交回报处理函数,每个成交发生时执行一次
def m14_handle_trade_bigquant_run(context, trade):
    pass

# @param(id="m14", name="handle_order")
# 交易引擎:委托回报处理函数,每个委托变化时执行一次
def m14_handle_order_bigquant_run(context, order):
    pass

# @module(position="-845,-1266", comment="""训练集""")
m1 = M.instruments_dai.v3(
    start_date="""2023-04-01""",
    start_date_bound_to_trading_date=False,
    end_date="""2024-04-30""",
    end_date_bound_to_trading_date=False,
    market="""中国A股""",
    custom_market="""""",
    m_name="""m1"""
)

# m_avg(turn,5)   # 过去5天换手率均值
# m_avg(turn,10)     # 过去10天换手率均值
# total_market_cap   # 总市值
# mf_net_amount_5    # 过去5天主力净流入金额
# mf_net_amount_10   # 过去10天主力净流入金额
# m_avg(volume,5) as avg_volume_5   # 过去5天成交量均值
# m_avg(volume,10) as avg_volume_10 # 过去10天成交量均值
# sum(if(price_limit_status=2, 1, 0) over (partition by instrument order by date rows between 9 preceding and current row)) as limit_up_count_10_raw # 过去10天涨停次数原始值
# limit_up_count_10_raw as limit_up_count_10 # 过去10天涨停次数
# (limit_up_count_10_raw > 0) as has_limit_up_10 # 过去10天是否有涨停记录


# # @module(position="-395,-1377", comment="""""", comment_collapsed=True)
# m2 = M.input_features_expr.v1(
#     features="""
# #过去5天换手率均值
# m_avg(turn,5)  
# #过去10天换手率均值
# m_avg(turn,10)  
# #总市值
# total_market_cap 
# #过去5天主力净流入金额
# mf_net_amount_5   
# #过去10天主力净流入金额
# mf_net_amount_10 
# #过去5天成交量均值
# m_avg(volume,5) as avg_volume_5  
# #过去10天成交量均值
# m_avg(volume,10) as avg_volume_10 
# #过去20天标准差
# m_stddev(close,20) as close_std_20  
# #过去5天最高收盘价
# m_max(close,5) as close_max_5       
# #过去5天最低收盘价  
# m_min(close,5) as close_min_5       
# #过去20天平均收盘价 
# m_avg(close,20) as close_avg_20     

# # 新增涨停因子
# (m_shift(close, 1) * if(st_status == 1, 1.05, 1.1)) as limit_up_price
# if(high >= (m_shift(close, 1) * if(st_status == 1, 1.05, 1.1)), 1, 0) as is_limit_up

# # 新增:10日内涨停次数
# # m_sum(is_limit_up, 10) as limit_up_count_10d

# # 过滤因子,这四个因子不参与模型学习
# st_status 
# low   
# price_limit_status
# m_lag(low,1) as low_1
# """,
#     m_name="""m2"""
# )
# @module(position="-395,-1377", comment="""""", comment_collapsed=True)
m2 = M.input_features_expr.v1(
    features="""
# 基础因子
m_avg(turn, 5) as avg_turn_5d  
total_market_cap 
mf_net_amount_5   
m_avg(volume, 5) as avg_volume_5  
m_max(close, 5) as close_max_5       
m_min(close, 5) as close_min_5       
m_avg(close, 20) as close_avg_20     

# 涨停价格计算
(m_shift(close, 1) * if(st_status == 1, 1.05, 1.1)) as limit_up_price
if(high >= (m_shift(close, 1) * if(st_status == 1, 1.05, 1.1)), 1, 0) as is_limit_up

# ========== 新增因子 ==========
# ---- 涨停频率类 ----
m_sum(is_limit_up, 5) as limit_up_count_5d
m_sum(is_limit_up, 10) as limit_up_count_10d

# ---- 涨停强度类 ----
volume / m_shift(avg_volume_5, 1) as volume_ratio_on_limit

# ---- 涨停形态类 ----
if(close == high and close == open and close == limit_up_price, 1, 0) as is_strong_limit
if(open == high and high == low and low == close and close == limit_up_price, 1, 0) as is_one_char_limit

# ---- 量价突破类 ----
close >= m_max(close, 10) as price_breakout_10d
close >= m_max(close, 20) as price_breakout_20d

# ---- 主力行为类 ----
m_sum(if(mf_net_amount_5 > 0, 1, 0), 5) as mf_positive_days_5

# ---- 风险控制类 ----
close / m_max(close, 20) as price_to_high_ratio
m_stddev(close / m_shift(close, 1) - 1, 5) as return_volatility_5d

# ==== 过滤因子(不参与模型训练)====
st_status 
low   
price_limit_status
m_lag(low, 1) as low_1
""",
    m_name="m2"
)

# @module(position="-514,-1040", comment="""""", comment_collapsed=True)
m3 = M.extract_data_expr.v1(
    instruments=m1.data,
    features=m2.data,
    start_date="""""",
    end_date="""""",
    before_start_days=90,
    m_name="""m3"""
)

# @module(position="-977,-1102", comment="""""", comment_collapsed=True)
m4 = M.input_features_expr.v1(
    features="""m_lead(close, 2) / m_lead(open, 1) AS _future_return
all_quantile_cont(_future_return, 0.01) AS _future_return_1pct
all_quantile_cont(_future_return, 0.99) AS _future_return_99pct
clip(_future_return, _future_return_1pct, _future_return_99pct) AS _clipped_return
all_cbins(_clipped_return, 70) AS _binned_return
_binned_return AS _label
if( m_lead(high, 1) = m_lead(low, 1), NULL, _label) as label 

""",
    m_name="""m4"""
)

# @module(position="-979,-1037", comment="""""", comment_collapsed=True)
m5 = M.extract_data_expr.v1(
    instruments=m1.data,
    features=m4.data,
    start_date="""""",
    end_date="""""",
    before_start_days=90,
    m_name="""m5"""
)

# @module(position="-726,-916", comment="""""", comment_collapsed=True)
m8 = M.data_join.v4(
    data1=m5.data,
    data2=m3.data,
    on="""date,instrument""",
    how="""inner""",
    sort=True,
    m_name="""m8"""
)

# @module(position="-727,-839", comment="""""", comment_collapsed=True)
m6 = M.data_filter.v5(
    input_data=m8.data,
    expr="""st_status==0 & price_limit_status==2 | price_limit_status ==3 & low>low_1""",
    output_left_data=False,
    m_name="""m6"""
)

# @module(position="-730,-764", comment="""""", comment_collapsed=True)
m12 = M.data_dropnan.v6(
    input_data=m6.data,
    m_name="""m12"""
)

# @module(position="-726,-677", comment="""""", comment_collapsed=True)
m9 = M.python.v2(
    input_1=m12.data,
    run=m9_run_bigquant_run,
    do_run=True,
    m_name="""m9"""
)

# @module(position="-315,-563", comment="""""", comment_collapsed=True)
m7 = M.stock_ranker_dai_train.v9(
    data=m9.data_1,
    learning_algorithm="""排序""",
    number_of_leaves=32,
    min_docs_per_leaf=1000,
    number_of_trees=20,
    learning_rate=0.1,
    max_bins=1072,
    feature_fraction=1,
    data_row_fraction=1,
    plot_charts=True,
    ndcg_discount_base=1,
    m_name="""m7"""
)

# @module(position="70,-1263", comment="""测试集""")
m15 = M.instruments_dai.v3(
    start_date="""2024-05-01""",
    start_date_bound_to_trading_date=False,
    end_date="""2025-04-30""",
    end_date_bound_to_trading_date=True,
    market="""中国A股""",
    custom_market="""""",
    m_cached=False,
    m_name="""m15"""
)

# @module(position="76,-937", comment="""""", comment_collapsed=True)
m16 = M.extract_data_expr.v1(
    instruments=m15.data,
    features=m2.data,
    start_date="""""",
    end_date="""""",
    before_start_days=90,
    m_name="""m16"""
)

# @module(position="76,-861", comment="""""", comment_collapsed=True)
m10 = M.data_filter.v5(
    input_data=m16.data,
    expr="""st_status==0 & price_limit_status==2 | price_limit_status ==3 & low>low_1""",
    output_left_data=False,
    m_name="""m10"""
)

# @module(position="78,-778", comment="""""", comment_collapsed=True)
m17 = M.data_dropnan.v6(
    input_data=m10.data,
    m_name="""m17"""
)

# @module(position="-317,-490", comment="""""", comment_collapsed=True)
m13 = M.stock_ranker_dai_predict.v13(
    model=m7.model,
    data=m17.data,
    m_name="""m13"""
)

# @module(position="-334,-396", comment="""""", comment_collapsed=True)
m14 = M.bigtrader.v34(
    data=m13.predictions,
    start_date="""""",
    end_date="""""",
    initialize=m14_initialize_bigquant_run,
    before_trading_start=m14_before_trading_start_bigquant_run,
    handle_data=m14_handle_data_bigquant_run,
    handle_trade=m14_handle_trade_bigquant_run,
    handle_order=m14_handle_order_bigquant_run,
    capital_base=1000000.1,
    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="""close""",
    benchmark="""沪深300指数""",
    plot_charts=True,
    debug=False,
    backtest_only=False,
    m_name="""m14"""
)
# </aistudiograph>

\

标签

数据类型数据处理
{link}