股票预测项目

项目目的是通过股票的历史行情价格来预测未来某只股票的涨跌,问题本身其实就是二分类问题,数据是通过tushare库来获取到的。

  1. 根据已经给定的数据,构造出样本数据。
  2. 提取完技术指标之后,做一些简单的数据处理
  3. 构造训练数据和测试数据
  4. 利用随机森立学习二分类器
# 导入相应的函数库
import pandas as pd
import datetime
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import f1_score
import matplotlib.pyplot as plt

# 技术指标的提取函数
from technical_indicators import *

# 导入股票数据,下面的股票数据是通过tushare库来获得的
stock = pd.read_csv("600519.csv")
stock.head(10)

1. 对于股票数据提取技术指标

直接调用给定的技术指标库来获得这些数据。  如果对某一种指标感兴趣,想深入理解建议在百度上搜索 : “技术指标” + “指标名字”来获得相关的参考资料,比如搜索 “技术指标” + 'rate of change", 有大量的资料可以参考的。

# 提取各类技术指标, 你可以把所有的技术指标全部调用一遍,也可以选择几个来尝试。 或者感兴趣的话,可以把其他的技术指标也加进来。 
#       每个技术指标的参数是不一样的,但基本也就1-2个参数,最常用的参数是天数(函数里用n来表示), 有些技术指标需要传入两个参数(比如MACD,
#       一个是针对于fast_line, 一个是针对于slow_line, 需要分别定义天数)。 由于每个指标都有参数,所以针对于同一类指标其实可以提取很多不同的特征的!

stock = average_directional_movement_index(stock, 12, 26) #  提取技术指标并存放在新的dataframe中
stock = moving_average(stock, 5)
stock = moving_average(stock, 15)

stock = moving_average(stock, 5)
stock = exponential_moving_average(stock, 5)


print (stock)

2. 数据处理,以及训练样本和测试样本的提取

通过上面的环节我们已经提取好了所需要的技术指标。 接下来的环节是通过这批数据来构造训练数据和测试数据了。注:数据中存在着NAN,为了去理解这些NAN的源头,需要看一下pandas里的rolling().mean()是如何工作的。 在我们项目中,我们是通过历史一段时间的数据来预测未来的涨跌的,所以一定不能使用未来数据来预测未来,只能用历史数据来预测未来。

# 完成样本数据的构造,并随机分成训练和测试数据

stock['labels']=[0 for i in range(stock.shape[0])]

for index in range(stock.shape[0]-1):
    
    if stock.loc[index,'close'] > stock.loc[index+1,'close']:
        stock.loc[index+1,'labels'] = 1
    else:
        continue
stock.drop(index=0)
y = stock['labels']
X = stock.drop('date',axis=1)

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=123)

print (X_train.shape, y_train.shape, X_test.shape, y_test.shape)

3. 利用随机森林训练模型

模型训练部分跟之前没有太大区别,试着通过交叉验证来训练一下,然后看看结果如何。

#训练随机森林模型,请尝试不同的参数,最后在测试集上输出最好的参数
from sklearn.metrics import classification_report 
from sklearn.model_selection import GridSearchCV

rf = RandomForestClassifier()

params={'criterion':['entropy'],'n_estimators':[5,10,15], 'max_depth':[5,10], 'min_samples_split':[4,6,8]}

clf = GridSearchCV(estimator=rf,param_grid=params,scoring='f1',cv=5)

clf.fit(X_train,y_train)

print(clf.best_params_)

predictions = clf.predict(X_test)

print(classification_report(y_test, predictions))

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值