Python股票处理之六_数据预处理A

1.        说明

在数据统计和预测的过程中,工程师基本都使用现成的算法,工程师的主要工作是根据具体业务逻辑预处理数据和选择算法。
首先要对数据预处理(数据清洗),包括数据的归一化,去除重复数据,修改错误数据,填充无效数据,抽象数据表示,筛选特征值,分配权重等等,以得到更准确的数据和更有效的结果。
继续上次关于股票直方图的话题,来看看简单的股票数据预处理。
左图是昨天股票涨跌的直方图,从中看出,涨跌幅分布在-10到50的区间内。
涨幅超过10%是因为计入了新股的首日涨幅,跌涨超过-10%,可能由于分红配送等原因引起。下面程序中将对此区域进行特殊处理。
对于当日停牌的数据,它的开盘价收盘价最高价最低价都是同一个值,如果加入统计,会在0附近形成一个无意义的峰值,在预处理中也把它去掉。
如果用左图结果做一个从(-10,10)共计20个区间的分类器,那么结果多半会落入(-1,1)的区间内,这并不是我们想要的。我们更希望看到的是将3000多支股票平均分布在这20个区域,每个区域股票数量相同,但是各区域大小不同。根据区域得到更合理的分类结果。(假设我们之后将要通过现有股票的各个特征,预测涨跌最有可能分布在哪个区域,这是一个对结果的分类问题,暂不考虑回归)

2.        程序

1)       代码

# -*- coding:utf-8 -*-  

import tushare as ts
import numpy as np  
import matplotlib.pyplot as plt  

e = ts.get_today_all()
size = 20	#把区间分成20份
array = []

ll = e[u'high']	# 最高价
hh = e[u'low'] # 最低价
cc = e[u'changepercent']	# 涨跌幅
for i in range(0, len(e)):
	if ll[i] != hh[i]:	# 最高价与最低价相同说明停牌
		if cc[i] > 10:	# 涨幅大于10%的股票归为10%
			array.append(10)
		elif cc[i] < -10:	# 跌幅大于-10%的股票归为-10%
			array.append(-10)
		else:
			array.append(cc[i])

print "Total:",len(array)
array=np.sort(array)	# 排序

bin_arr = []
bin_arr.append(-10)	# 加入区间的左侧值
count = 0	# 区域计数
for i in range(0, len(array)):
	count+=1	 
	if count > len(array) / size:
		print array[i]
		count = 0
		bin_arr.append(array[i])
bin_arr.append(10)	# 加入区间右侧值

hist, bins = np.histogram(array, bins=bin_arr)	# 按bin_arr给定的区域计算直方图
width = np.diff(bins)
center = (bins[:-1] + bins[1:]) / 2
plt.bar(center, hist, align='center', width=width)
plt.show()  

2)       运行结果


Total: 3010
-1.271     -0.667     -0.289     -0.098     0.061      0.219      0.348      0.482      0.599      0.719      0.873      1.021      1.16       1.312      1.505      1.786      2.133      2.713      3.74

3)       分析

从结果可以看出,总共筛选出了3010支股票,将其分成20个区间,其中每个区间的股票数基本相等(最后一个不足1/20),此处只使用了一天的数据,当天微涨;实际处理时,需要使用更多数据来划分区域,20个区域可能也有点多。此处只是抛砖引玉,程序写得并不严谨,大家领会精神即可。
以上计算用到了直方图均衡化的原理,在频域上划分,替代按值域划分,让我们聚焦于数据更集中的区域。

3.        参考

1)       直方图均衡化的数学原理
http://blog.csdn.net/superjunenaruto/article/details/52431941

好的,这是一个比较复杂的任务,需要进行数据预处理、模型搭建、模型训练、模型预测和结果可视化等多个步骤。在这里我会尽可能详细地说明每一步需要做什么。 首先,我们需要准备股票历史数据。这里我们可以使用 Yahoo Finance API 来获取股票历史数据。可以使用以下代码来获取股票历史数据: ```python import yfinance as yf stock_data = yf.download("AAPL", start="2015-01-01", end="2021-12-31") ``` 这里我们以 AAPL(苹果公司)为例,获取 2015 年 1 月 1 日到 2021 年 12 月 31 日的历史数据。获取到的数据会被存储在一个 Pandas DataFrame 中。 接下来,我们需要进行数据预处理数据预处理的目的是为了将原始数据转换成适合于模型训练的数据。这里我们将使用 Min-Max 标准化将数据转换到 0 到 1 的范围内。 ```python from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler(feature_range=(0, 1)) scaled_data = scaler.fit_transform(stock_data['Close'].values.reshape(-1, 1)) ``` 这里我们将收盘价进行了标准化,并将标准化后的数据存储在一个 Numpy 数组中。 接下来,我们需要将数据集划分为训练集和测试集。这里我们将前 80% 的数据作为训练集,后 20% 的数据作为测试集。 ```python train_size = int(len(scaled_data) * 0.8) test_size = len(scaled_data) - train_size train_data, test_data = scaled_data[0:train_size,:], scaled_data[train_size:len(scaled_data),:] ``` 接下来,我们需要将数据转换成适合于 RNN 的数据格式。这里我们将使用时间步长为 60(也就是前 60 天的数据)来预测未来 1 天的股票价格。 ```python import numpy as np def create_dataset(dataset, look_back=60): dataX, dataY = [], [] for i in range(len(dataset)-look_back-1): a = dataset[i:(i+look_back), 0] dataX.append(a) dataY.append(dataset[i + look_back, 0]) return np.array(dataX), np.array(dataY) train_X, train_Y = create_dataset(train_data) test_X, test_Y = create_dataset(test_data) ``` 这里我们定义了一个函数 `create_dataset()` 来将数据转换成适合于 RNN 的格式。这里我们使用的时间步长为 60。 接下来,我们需要搭建 RNN 模型。这里我们将使用 Keras 来搭建模型。这里我们将使用一个包含两个 LSTM 层的模型。 ```python from keras.models import Sequential from keras.layers import Dense, LSTM model = Sequential() model.add(LSTM(50, input_shape=(train_X.shape[1], train_X.shape[2]), return_sequences=True)) model.add(LSTM(50)) model.add(Dense(1)) model.compile(loss='mean_squared_error', optimizer='adam') ``` 这里我们定义了一个包含两个 LSTM 层和一个全连接层的模型。模型的损失函数为均方误差(MSE),优化器为 Adam。 接下来,我们需要训练模型。 ```python model.fit(train_X, train_Y, epochs=100, batch_size=64, validation_data=(test_X, test_Y), verbose=2) ``` 这里我们将模型训练了 100 个 epochs,批次大小为 64。同时我们还将测试集作为验证集来验证模型的性能。 最后,我们可以使用训练好的模型来对未来股票价格进行预测,并将结果进行可视化分析。 ```python train_predict = model.predict(train_X) test_predict = model.predict(test_X) train_predict = scaler.inverse_transform(train_predict) train_Y = scaler.inverse_transform([train_Y]) test_predict = scaler.inverse_transform(test_predict) test_Y = scaler.inverse_transform([test_Y]) import matplotlib.pyplot as plt plt.plot(train_predict) plt.plot(train_Y.T) plt.show() plt.plot(test_predict) plt.plot(test_Y.T) plt.show() ``` 这里我们使用了 Matplotlib 来进行可视化分析。我们将训练集和测试集的预测结果和真实值进行了对比。可以看出,我们的模型在训练集和测试集上都取得了不错的效果。 希望这份代码能够对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值