一、背景描述
股票价格是一种不稳定的时间序列,受多种因素的影响。影响股市的外部因素很多,主要有经济因素、政治因素和公司自身因素三个方面的情况。自股票市场出现以来,研究人员采用各种方法研究股票价格的波动。随着数理统计方法和机器学习的广泛应用,越来越多的人将机器学习等预测方法应用于股票预测中,如神经网络预测、决策树预测、支持向量机预测、逻辑回归预测等。
XGBoost是由TianqiChen在2016年提出来,并证明了其模型的计算复杂度低、运行速度快、准确度高等特点。XGBoost是GBDT的高效实现。在分析时间序列数据时,GBDT虽然能有效提高股票预测结果,但由于检测速率相对较慢,为寻求快速且精确度较高的预测方法,采用XGBoost模型进行股票预测,在提高预测精度同时也提高预测速率。可以利用XGBoost网络模型对股票历史数据的收盘价进行分析预测,将真实值和预测值进行对比,最后通过评估算子来评判XGBoost模型对股价预测的效果。
数据集通过爬虫获取从2005年开始到2020年的股票(代码为 510050.SH)历史数据,下表展示了股票在多个交易日内的市场表现,主要字段包括:
字段 | 含义 |
---|---|
ts_code | 股票代码 |
trade_date | 交易日期 |
pre_close | 前一个交易日的收盘价 |
open | 开盘价 |
high | 当日最高价 |
low | 当日最低价 |
close | 当日收盘价 |
change | 收盘价变化值(与前一日相比的差值) |
pct_chg | 收盘价变化百分比 |
vol | 成交量 |
amount | 成交金额 |
label | 标记某日涨跌情况 |
这些字段全面记录了股票每天的价格波动和交易情况,用于后续分析和预测股票趋势。
二、Python代码和Sentosa_DSML社区版算法实现对比
(一) 数据读入
1、python代码实现
导入需要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib import rcParams
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
import xgboost as xgb
数据读入
dataset = pd.read_csv('20_year_FD.csv')
print(dataset.head())
2、Sentosa_DSML社区版实现、
首先,利用文本算子从本地文件读入股票数据集。
(二) 特征工程
1、python代码实现
def calculate_moving_averages(dataset, windows):
for window in windows:
column_name = f'MA{
window}'
dataset[column_name] = dataset['close'].rolling(window=window).mean()
dataset[['close'] + [f'MA{
window}' for window in windows]] = dataset[['close'] + [f'MA{
window}' for window in windows]].round(3)
return dataset
windows = [5, 7, 30]
dataset = calculate_moving_averages(dataset, windows)
print(dataset[['close', 'MA5', 'MA7', 'MA30']].head())
plt.figure(figsize=(14, 7))
plt.plot(dataset['close'], label='Close Price', color='blue')
plt.plot(dataset['MA5'], label='5-Day Moving Average', color='red', linestyle='--')
plt.plot(dataset['MA7'], label='7-Day Moving Average', color='green', linestyle='--')
plt.plot(dataset['MA30'], label='30-Day Moving Average', color='orange', linestyle='--')
plt.title('Close Price and Moving Averages')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.show()
得到实际股价与平均股价的差值的绝对值,观察偏离水平。
def calculate_deviation(dataset, ma_column):
deviation_column = f'deviation_{
ma_column}'
dataset[deviation_column] = abs(dataset['close'] - dataset[ma_column])
return dataset
dataset = calculate_deviation(dataset, 'MA5')
dataset = calculate_deviation(dataset, 'MA7')
dataset = calculate_deviation(dataset, 'MA30')
plt.figure(figsize=(