CSIG挑战赛飞桨-工银瑞信赛道 baseline

学术   2024-10-22 10:47   北京  
  • 赛题名称:2024CSIG-飞桨、工银瑞信金融科技挑战赛
  • 赛题任务:基于AI的量化选股投资策略建模与可视分析
  • 赛题类型:金融量化

https://aistudio.baidu.com/competition/detail/1212/0/introduction

unsetunset赛题描述unsetunset

股票市场是一个充满挑战与机遇的领域,其动态变化的特性要求投资者具备敏锐的洞察力和高效的决策能力。近年来,随着计算机视觉技术的飞速发展,其在金融领域的应用也逐渐受到广泛关注。

本赛题由百度飞桨和工银瑞信联合设置,旨在通过利用计算机视觉的模型和网络结构,结合交易数据(如高开低收、成交量、成交金额等),探索一种新型的股票排名预测方法。   参赛者需要完成以下两个主要任务:

  • K线图的创新绘制:基于给定的交易数据,参赛者需要设计并绘制一种新型的K线图。这种K线图可以不是传统的形式,而是需要开动脑筋,创造出对计算机视觉模型更加友好的图形或像素图。这要求参赛者不仅要理解K线图的本质,还要具备创新思维和图形设计能力。
  • 股票排名预测:利用计算机视觉相关的技术,对自定义的股票K线图进行分析,并预测股票的排名。参赛者需要选择合适的计算机视觉模型和网络结构,对K线图进行特征提取和模式识别,从而实现对股票排名的预测。请注意,模型的设计应避免过拟合,并且应根据股票数据的特性对原有网络结构进行必要的定制化修改。

unsetunset评价标准unsetunset

评价标准为Rank IC(Rank Information Coefficient),即计算预测分值的排序值与未来5天收益率排序值之间的相关系数。

  • 初赛阶段

在初赛阶段,排名将在AI Studio(https://aistudio.baidu.com/ )排行榜中公布。根据排行榜分数决定晋级团队,晋级比例后续公布。报名后可见“数据集tab”。

  • 复赛阶段

在复赛阶段,参赛者需根据组织者公布的最近一周交易日的股票因子特征预测下一周交易日的股票排名得分。最终得分=股票排名得分(40%)+算法报告(40%)+K线图重绘策略(20%)。组织者将根据参赛提交的股票排名得分同实盘排名做相似度计算,根据股票上中下分段中各选N支股票,做收益区分度计算,并做综合评分。

unsetunset赛题数据集unsetunset

初赛数据集

训练集包括匿名股票的特征。股票:匿名股票代码 日期代码:匿名日期编号 开盘价:开盘价格 最高价:最高价格 最低价:最低价格 收盘价:收盘价格 成交量:成交量 成交额:成交金额 预测目标:在t日,预测未来5天收益率的股票排名得分。其中,t日的收益率Ret_t,5 =(收盘价_t+6-收盘价_t+1)/收盘价_t+1 。

测试集提供与训练集相同的特征文件。

复赛数据集

复赛提供与初赛数据集格式相同的特征文件。复赛以周为单位提供最新一周的特征文件。选手预测未来一周的股票排名得分。成交量:成交量 成交额:成交金额 预测目标:在t日,预测未来5天收益率的股票排名得分。其中,t日的收益率Rett,5 =(收盘价t+6-收盘价t+1)/收盘价t+1 。4.2.2测试集 测试集提供与训练集相同的特征文件。

unsetunset数据分析unsetunset

unsetunsetBaselineunsetunset

方法1:特征工程 + 全连接网络

  • 特征工程
train['MA_5'] = train.groupby('股票')['收盘价'].transform(lambda x: x.rolling(window=5).mean())
train['MA_20'] = train.groupby('股票')['收盘价'].transform(lambda x: x.rolling(window=20).mean())
train['EMA_12'] = train.groupby('股票')['收盘价'].transform(lambda x: x.ewm(span=12, adjust=False).mean())
train['EMA_26'] = train.groupby('股票')['收盘价'].transform(lambda x: x.ewm(span=26, adjust=False).mean())

# 相对强弱指数(RSI)
def compute_rsi(series, window=14):
    delta = series.diff()
    gain = (delta.where(delta > 00)).rolling(window=window).mean()
    loss = (-delta.where(delta < 00)).rolling(window=window).mean()
    rs = gain / loss
    return 100 - (100 / (1 + rs))

train['RSI_14'] = train.groupby('股票')['收盘价'].transform(lambda x: compute_rsi(x))
train['BB_upper'] = train['MA_20'] + 2 * train.groupby('股票')['收盘价'].transform(lambda x: x.rolling(window=20).std())
train['BB_lower'] = train['MA_20'] - 2 * train.groupby('股票')['收盘价'].transform(lambda x: x.rolling(window=20).std())
train['MACD'] = train['EMA_12'] - train['EMA_26']
train['Signal_Line'] = train.groupby('股票')['MACD'].transform(lambda x: x.ewm(span=9, adjust=False).mean())
train['Momentum_10'] = train.groupby('股票')['收盘价'].transform(lambda x: x.diff(10))
train['Lag_1'] = train.groupby('股票')['收盘价'].shift(1)
train['Lag_3'] = train.groupby('股票')['收盘价'].shift(3)

train['收益率'] = train.groupby('股票')['收盘价'].shift(-5) / train.groupby('股票')['收盘价'].shift(1) - 1

模型搭建:

model1 = nn.Sequential(
    nn.Linear(18, 128),
    nn.ReLU(),
    nn.Linear(128, 128),
    nn.ReLU(),
    nn.Linear(128, 128),
    nn.ReLU(),
    nn.Linear(128, 1)
)

paddle.summary(model1, (10, 18))

方法2:时序股票图 + 视觉网络

构建时序输入:


ts_length = 60
train_val_data = []
test_data = []

for stock_id, df in tqdm(train.groupby('股票')): # 每只股票生成k线图矩阵
    stock_df = df.iloc[1:-5]

    # 每只股票拥有的历史数据不同
    # 10天记录
    # 100天记录
    if len(stock_df) <= 10:
        tmpdata = df.iloc[:, 2:-1].values
        tmpdata = np.concatenate([np.zeros((ts_length-len(tmpdata), 6)), tmpdata])
        test_data.append([
            tmpdata, np.array([0])
        ])
        continue

    for idx in range(ts_length, len(stock_df)):
        tmpdata = stock_df.iloc[:idx, 2:-1].values[-ts_length:]
        if len(tmpdata) <= ts_length:
            tmpdata = np.concatenate([np.zeros((ts_length-len(tmpdata), 6)), tmpdata])

        train_val_data.append([tmpdata, stock_df.iloc[idx]['收益率']])


    tmpdata = df.iloc[-ts_length:, 2:-1].values
    if len(tmpdata) <= ts_length:
        tmpdata = np.concatenate([np.zeros((ts_length-len(tmpdata), 6)), tmpdata])
    test_data.append([
        tmpdata

模型搭建:

model2 = nn.Sequential(
    nn.Conv2D(1, 5, (3, 1)),
    nn.ReLU(),
    nn.Conv2D(5, 25, (3, 3)),
    nn.ReLU(),
    nn.MaxPool2D((2, 1)),
    nn.Conv2D(25, 25, (3, 2)),
    nn.ReLU(),
    nn.MaxPool2D((2, 1)),
    nn.Conv2D(25, 25, (3, 3)),
    nn.ReLU(),
    nn.Flatten(),
    nn.Linear(275, 1)
)

paddle.summary(model2, (1, 1, 60, 6))

Baseline完整链接:https://aistudio.baidu.com/projectdetail/8403264

Coggle数据科学
Coggle全称Communication For Kaggle,专注数据科学领域竞赛相关资讯分享。
 最新文章