程生运行报错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>
\