【Python】利用DT决策树进行股票涨跌预测
本文选取了江淮汽车上市至今(2023年6月21日)的交易数据作为案例, 计算了换手率和20日涨跌幅作为预测因子,使用决策树来进行股票涨跌幅预测,最终结果显示,预测的准确率在50%左右徘徊,效果不佳。
换手率是衡量股票流动性的指标,表示单位时间内股票的成交量占流通股本的比例。换手率高通常意味着市场对该股票的交易活跃度较高。
20日波动率是衡量股票价格变动幅度的指标,表示过去20个交易日的价格波动情况,波动率高通常表示股票价格波动较大。
"""
读取股票交易数据(csv文件),计算因子
使用决策树来进行预测股票未来收益情况
"""
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
import pandas as pd
# 读取江淮汽车股票信息
df = pd.read_csv('sh600418.csv', encoding='gbk')
# 换手率 = 成交量 / 流通股本
df['换手率'] = df['成交量'] / (df['流通市值'] / df['收盘价'])
df['20日波动率'] = df['收盘价'].rolling(20).std()
df['收益率'] = df['收盘价'] / df['前收盘价'] - 1
df['涨还是跌'] = '涨'
# 不涨不跌也是跌
df.loc[df['收益率']<=0, '涨还是跌'] = '跌'
df['下一天涨还是跌'] = df['涨还是跌'].shift(-1)
df = df[['股票名称', '交易日期', '收益率', '涨还是跌', '下一天涨还是跌', '换手率', '20日波动率']]
df.dropna(inplace=True)
df.reset_index(inplace=True, drop=True)
print(df)
# 划分训练和测试集,20%为训练集,随机种子为1(这里不考虑时间序列的问题,单纯考虑因子是否有效,现实中不能做到)
train_x, test_x, train_y, test_y = train_test_split(df[['换手率', '20日波动率']], df['下一天涨还是跌'], test_size=0.2, random_state=1)
model = DecisionTreeClassifier(max_depth=3)
model.fit(train_x, train_y)
pred_y = model.predict(test_x)
pred_df = pd.DataFrame()
pred_df['下一天涨还是跌'] = list(test_y)
pred_df['预测下一天涨还是跌'] = list(pred_y)
print(pred_df)
print('DT的涨跌预测准确率为:{:.4f}'.format(accuracy_score(pred_y, test_y)))