共计 3337 个字符,预计需要花费 9 分钟才能阅读完成。
本文将以股票交易作为示例。咱们用 AI 模型预测股票第二天是涨还是跌。在此背景下,比拟了分类算法 XGBoost、随机森林和逻辑分类器。文章的另外一个重点是数据筹备。咱们必须如何转换数据以便模型能够解决它。
在本文中,咱们将遵循 CRISP-DM 流程模型,以便咱们采纳结构化办法来解决业务案例。CRISP-DM 特地实用于潜在剖析,通常在行业中用于构建数据迷信我的项目。
另外就是咱们将应用 Python 包 openbb。这个包以蕴含了一些来自金融部门的数据源,咱们能够不便的应用它。
首先就是装置必须的库:
pip install pandas numpy“openbb[all]”swifter scikit-learn
业务了解
首先应该理解咱们要解决的问题,在咱们的例子中,能够将问题定义如下:
预测股票代码 AAPL 的股价第二天会上涨还是上涨。
而后就是应该思考手头有什么样的机器学习模型的问题。咱们想预测第二天股票是上涨还是上涨。所以这是一个分类问题(1:股票第二天上涨或 0:股票第二天上涨)。在分类问题中,咱们预测一个类别。在咱们的例子中,是一个 0 类和 1 类的二元分类。
数据了解和筹备
数据了解阶段侧重于辨认、收集和剖析数据集。第一步,咱们下载 Apple 股票数据。以下是如何应用 openbb 执行此操作:
data = openbb.stocks.load(
symbol = 'AAPL',
start_date = '2023-01-01',
end_date = '2023-04-01',
monthly = False)
data
该代码下载 2023-01-01 和 2023-04-01 之间的数据。下载的数据蕴含以下信息:
- Open:美元每日开盘价
- High:当日最高价(美元)
- Low:当日最低价(美元)
- Close:美元每日收盘价
- Adj Close:与股息或股票宰割相干的调整后收盘价
- Volume:交易的股票数量
- Dividends:已付股息
- Stock Splits:股票宰割执行
咱们曾经下载了数据,然而数据还不适宜建模分类模型。所以依然须要为建模筹备数据。所以须要编写了一个函数来下载数据,而后对其进行转换以进行建模。以下代码显示了此性能:
defget_training_data(symbol, start_date, end_date, monthly_bool=True, lookback=10):
data=openbb.stocks.load(
symbol=symbol,
start_date=start_date,
end_date=end_date,
monthly=monthly_bool)
data=get_label(data)
data_up_down=data['up_down'].to_numpy()
training_data=get_sequence_data(data_up_down, lookback)
returntraining_data
这外面蕴含的第一个函数时 get_label():
defencoding(n):
ifn>0:
return1
else:
return0
defget_label(data):
data['Delta'] =data['Close'] -data['Open']
data['up_down'] =data['Delta'].swifter.apply(lambdad: encoding(d))
returndata
他的次要工作是:计算收盘价和开盘价之间的差值。而后咱们用 1 标记股价上涨的所有日期,股价上涨的所有日期都标记为 0。另外的 up_down 列蕴含股票价格在特定日期是上涨还是上涨。这里应用 swifter.apply() 函数代替 pandas apply() 是因为 swifter 提供多核反对。
第二个函数是 get_sequence_data()。参数 lookback 指定预测中蕴含过来多少天。get_sequence_data() 代码如下:
defget_sequence_data(data_up_down, lookback):
shape= (data_up_down.shape[0] -lookback+1, lookback)
strides=data_up_down.strides+ (data_up_down.strides[-1],)
returnnp.lib.stride_tricks.as_strided(data_up_down, shape=shape, strides=strides)
这个函数有两个参数:data_up_down 和 lookback。它返回一个新的 NumPy 数组,该数组示意具备指定窗口大小的 data_up_down 数组的滑动窗口视图,该窗口大小由 lookback 参数确定。为了阐明这个函数是如何工作的,咱们看一个小例子。
get_sequence_data(np.array([1, 2, 3, 4, 5, 6]), 3)
后果如下:
array([[1, 2, 3],
[2, 3, 4],
[3, 4, 5],
[4, 5, 6]])
在下文中,咱们下载 Apple 股票的数据并对其进行转换以进行建模。咱们应用 10 天的回溯期。
data = get_training_data(symbol = 'AAPL', start_date = '2023-01-01', end_date = '2023-04-01', monthly_bool = False, lookback=10)
pd.DataFrame(data).to_csv("data/data_aapl.csv")
数据曾经筹备结束了,咱们开始建模和评估模型。
建模
将数据读入数据并生成测试和训练数据。
data = pandas.read_csv("./data/data_aapl.csv")
X=data.iloc[:,:-1]
Y=data.iloc[:,-1]
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=4284, stratify=Y)
逻辑回归:
该分类器是基于线性的模型,通常用作基线模型。咱们应用 scikit-learn 的实现:
model_lr = LogisticRegression(random_state = 42)
model_lr.fit(X_train,y_train)
y_pred = model_lr.predict(X_test)
XGBoost:
XGBoost 是为速度和性能而设计的梯度晋升决策树的实现。它属于树晋升算法,将许多弱树分类器顺次连贯。
model_xgb = XGBClassifier(random_state = 42)
model_xgb.fit(X_train, y_train)
y_pred = model_xgb.predict(X_test)
随机森林:
随机森林构建多个决策树。这种办法称为集成学习,因为多个学习器是相互连接的,该算法属于 bagging 办法。首字母缩写词“bagging”代表疏导聚合。这里也应用 scikit-learn 的实现:
model_rf = RandomForestClassifier(random_state = 42)
model_rf.fit(X_train, y_train)
y_pred = model_rf.predict(X_test)
评估
在对模型进行建模和训练之后,咱们须要查看模型在测试数据上的性能。测量指标是 Recall、Precision 和 F1-Score。下表显示了后果。
能够看到逻辑分类器(逻辑回归)和随机森林获得了显著优于 XGBoost 模型的后果,这是什么起因呢?这是因为数据比较简单,只有几个维度的特色,并且数据的长度也很小,咱们所有的模型也没有进行调优。
总结
咱们这篇文章的次要目标是介绍如何将股票价格的工夫序列转换为分类问题,并且演示如何在数据处理时应用窗口函数将工夫序列转换为一个序列,至于模型并没有太多的进行调优,所以对于成果评估来说越简略的模型体现得就越好。
https://avoid.overfit.cn/post/57a12ff0cf964fbebf1b27bc72fb2bbb
作者:Tinz Twins