Datawhale干货
方向:金融量化,科大讯飞赛事
赛题名称:AI量化模型预测挑战赛
赛题类型:金融量化
赛题链接👇:
https://challenge.xfyun.cn/topic/info?type=quantitative-model&ch=vWxQGFU
赛题背景
量化金融在国外已经有数十年的历程,而在国内兴起还不到十年。这是一个极具挑战的领域。量化金融结合了数理统计、金融理论、社会学、心理学等多学科的精华,同时特别注重实践。由于市场博弈参与个体的差异性和群体效应的复杂性,量化金融极具挑战与重大的机遇的特点。
本赛事通过大数据与机器学习的方法和工具,理解市场行为的原理,通过数据分析和模型创建量化策略,采用历史数据,验证量化策略的有效性,并且通过实时数据进行评测。
赛事任务
给定数据集:给定训练集(含验证集), 包括10只(不公开)股票、79个交易日的L1snapshot数据, 数据已进行规范化和隐藏处理,包括5档量/价,中间价,交易量等数据(具体可参考后续数据说明)。
预测任务:利用过往及当前数据预测未来中间价的移动方向,在数据上进行模型训练与预测
赛题数据集
行情频率:3秒一个数据点(也称为1个tick的snapshot);
每个数据点包括当前最新成交价/五档量价/过去3秒内的成交金额等数据;
训练集中每个数据点包含5个预测标签的标注;允许利用过去不超过100tick(包含当前tick)的数据,预测未来N个tick后的中间价移动方向。
预测时间跨度:5、10、20、40、60个tick,5个预测任务;即在t时刻,分别预测t+5tick,t+10tick,t+20tick,t+40tick,t+60tick以后:最新中间价相较t时刻的中间价:下跌/不变/上涨。
字段 | 含义 |
---|---|
date | 日期 |
time | 时间戳 |
sym | 标的(仅序号) |
close | 最新价/收盘价 |
amount_delta | 成交量变化 |
n_midprice | 中间价 |
n_bid1 | 买一价 |
n_bsize1 | 买一量 |
n_bid2 | 买二价 |
n_bsize2 | 买二量 |
n_bid3 | 买三价 |
n_bsize3 | 买三量 |
n_bid4 | 买四价 |
n_bsize4 | 买四量 |
n_bid5 | 买五价 |
n_bsize5 | 买五量 |
n_ask1 | 卖一价 |
n_asize1 | 卖一量 |
n_ask2 | 卖二价 |
n_asize2 | 卖二量 |
n_ask3 | 卖三价 |
n_asize3 | 卖三量 |
n_ask4 | 卖四价 |
n_asize4 | 卖四量 |
n_ask5 | 卖五价 |
n_asize5 | 卖五量 |
label5 | 5tick价格移动方向 |
label10 | 10tick价格移动方向 |
label20 | 20tick价格移动方向 |
label40 | 40tick价格移动方向 |
label60 | 60tick价格移动方向 |
评价指标
本模型依据提交的结果文件,采用macro-F1 score进行评价,取label_5, label_10, label_20, label_40, label_60五项中的最高分作为最终得分。
赛题思路
赛题是一个典型的金融量化的比赛,可以做很多时序的特征工程,接下来展示简单的树模型思路:
import pandas as pd
import numpy as np
import glob
from sklearn.linear_model import LogisticRegression
from joblib import delayed, Parallel
from tqdm import tqdm_notebook
# 训练集和测试集文件路径
train_paths = glob.glob('./AI量化模型预测挑战赛公开数据/train/*')
test_paths = glob.glob('./AI量化模型预测挑战赛公开数据/test/*')
# 自定义特征工程
def base_feature(path, train=True):
df_feat = []
df = pd.read_csv(path)
for idx, row in enumerate(df.iterrows()):
idx_feat = []
for col in ['n_close', 'amount_delta', 'n_midprice', 'n_bid1', 'n_bsize1', 'n_bid2',
'n_bsize2', 'n_bid3', 'n_bsize3', 'n_bid4', 'n_bsize4', 'n_bid5',
'n_bsize5', 'n_ask1', 'n_asize1', 'n_ask2', 'n_asize2', 'n_ask3',
'n_asize3', 'n_ask4', 'n_asize4', 'n_ask5', 'n_asize5']:
idx_feat.append(row[1][col])
if idx == 0:
idx_feat.append(np.nan)
else:
idx_feat.append(row[1][col] - df.iloc[max(0, idx-3):idx][col].mean())
idx_feat.append(row[1][col] - df.iloc[max(0, idx-10):idx][col].mean())
idx_feat.append(row[1][col] - df.iloc[max(0, idx-20):idx][col].mean())
idx_feat.append(row[1][col] - df.iloc[max(0, idx-3):idx][col].max())
idx_feat.append(row[1][col] - df.iloc[max(0, idx-10):idx][col].max())
idx_feat.append(row[1][col] - df.iloc[max(0, idx-20):idx][col].max())
if train:
idx_feat += list(row[1].iloc[-5:])
df_feat.append(idx_feat)
return pd.DataFrame(df_feat)
train_feat = Parallel(n_jobs=5)(delayed(base_feature)(path, True) for path in tqdm_notebook(train_paths[:]))
test_feat = Parallel(n_jobs=5)(delayed(base_feature)(path, False) for path in tqdm_notebook(test_paths[:]))
import lightgbm as lgb
train_feat = pd.concat(train_feat, 0)
# 构建模型
m5 = lgb.LGBMClassifier()
m5.fit(train_feat.iloc[:, :-5], train_feat.iloc[:, -5])
m10 = lgb.LGBMClassifier()
m10.fit(train_feat.iloc[:, :-5], train_feat.iloc[:, -4])
m20 = lgb.LGBMClassifier()
m20.fit(train_feat.iloc[:, :-5], train_feat.iloc[:, -3])
m40 = lgb.LGBMClassifier()
m40.fit(train_feat.iloc[:, :-5], train_feat.iloc[:, -2])
m60 = lgb.LGBMClassifier()
m60.fit(train_feat.iloc[:, :-5], train_feat.iloc[:, -1])
# 写入测试集
for df, path in zip(test_feat, test_paths):
sub = pd.DataFrame({
'uuid': range(len(df)),
'label_5': m5.predict(df),
'label_10': m10.predict(df),
'label_20': m20.predict(df),
'label_40': m40.predict(df),
'label_60': m60.predict(df)
})
sub.to_csv('./submit/' + path.split('/')[-1], index=None)
完整代码见👇:
https://github.com/datawhalechina/competition-baseline/tree/master/competition/%E7%A7%91%E5%A4%A7%E8%AE%AF%E9%A3%9EAI%E5%BC%80%E5%8F%91%E8%80%85%E5%A4%A7%E8%B5%9B2023
加入AI赛事学习
Datawhale、科大讯飞、天池联合发起的 AI 夏令营,第三期报名截止到8月15号,扫码申请。基于科大讯飞、天池最新赛事。