提交代码后不出结果的几个可能原因(会实时更新)
由xuxiaoyin创建,最终由xuxiaoyin 被浏览 15 用户
大家在提交之前务必要在cpt_jyc_2025_stock_csi1000_bar1m上使用因子分析工具来查看。 如果在该数据集上无法展示因子分析绩效, 那么提交后也不会产生分数!
机器学习模型训练失败
经过这几天的跟踪, 有一部分的比例是因为使用了机器学习模型导致无法出得分, 此时需要各位检查一下机器学习是否预测成功。可能存在以下原因导致无法出结果:
- 训练数据中存在缺失值导致损失为NaN:
针对这种情况,请大家对原数据作缺失值处理, 有些机器学习模型是无法对包含缺失值的数据集作训练和预测的。
加工的因子截面缺失过多
我们的因子分析架构会检测日频因子的缺失状况,如果截面缺失比例超过40%,我们就会对结果抛出异常。所以需要大家在因子加工之后检查一下自己的因子数据是否存在过多缺失值。
缺失值解决方案1:
- 使用上一期数据对当期缺失值进行填补(可以直接复制使用):
import dai
import pandas as pd
df:pd.DataFrame = '假设这是你加工出来的因子Dataframe'
sql = """
select
instrument, date,
last(columns(* exclude (date, instrument)) ignore nulls)
over (partition by instrument order by date rows between
unbounded preceding and current row) as 'columns(*)'
from df
where date >= '2023-01-01'
order by instrument, date
"""
df = dai.query(sql, bind_relations={"df": df}).df()
未来数据
- 我们有专门的AI工具来评估大家的代码,还有专业策略研究员来对你们的代码进行二次评估, 所以请各位同学不要心存侥幸心理去设计未来函数,我们会对未来函数抛出异常。
- 针对训练集和预测集重复的代码,我们也会抛出异常, 解决方案:若想使用机器学习模型,请使用滚动训练,或者可以使用cpt_jyc_2025_stock_csi1000_bar1m数据作训练:
import dai
import pandas as pd
def main(datasource, start_date, end_date):
import dai
import pandas as pd
# ===============训练集====================
sql = """
SELECT ...... FROM cpt_jyc_2025_stock_csi1000_bar1m
"""
train_df = dai.query(sql, filters={"date": ['2023-01-01', '2024-12-31']}).df() # cpt_jyc_2025_stock_csi1000_bar1m表的时间跨度为23年到24年
# 对训练集进行必要的预处理
......
# =================预测集===================
lookbackdays = 10
query_start_date = pd.to_datetime(start_date) - timedelta(days=lookbackdays)
sql = f"""
SELECT ...... FROM {datasource}
"""
test_df = dai.query(sql, filters={"date": [query_start_date, end_date]}).df()
# 对预测集做必要的预处理
......
# 使用train_df作模型训练
......
# 训练完毕后对test_df作预测, 预测值为factor
......
test_df = test_df[['date', 'instrument', 'factor']]
test_df = test_df [test_df ['date'].between(start_date, end_date)]
return test_df
当然,我们在测试集部分我们为各位选手多提供了半年数据, 各位可以向前取半年数据来训练:
import dai
import pandas as pd
def main(datasource, start_date, end_date):
import dai
import pandas as pd
from datetime import timedelta
# =============训练集预测集时间切分============
lookbackdays = 10
train_start_date = pd.to_datetime(start_date) - timedelta(days=120)
train_end_date = pd.to_datetime(start_date) - timedelta(days=lookbackdays+1)
query_start_date = pd.to_datetime(start_date) - timedelta(days=lookbackdays)
# ===============训练集====================
sql = f"""
SELECT ...... FROM {datasource}
"""
train_df = dai.query(sql, filters={"date": [train_start_date, train_end_date]}).df()
# 对训练集进行必要的预处理
......
# =================预测集===================
sql = f"""
SELECT ...... FROM {datasource}
"""
test_df = dai.query(sql, filters={"date": [query_start_date, end_date]}).df()
# 对预测集做必要的预处理
......
# 使用train_df作模型训练
......
# 训练完毕后对test_df作预测, 预测值为factor
......
test_df = test_df[['date', 'instrument', 'factor']]
test_df = test_df [test_df ['date'].between(start_date, end_date)]
return test_df
\