【数据挖掘】使用移动平均预测道琼斯、纳斯达克、标准普尔指数——Python中的基本数据操作和可视化

简介: 本文将使用简单移动平均预测道琼斯、纳斯达克、标准普尔指数。作为技术分析中⼀种分析时间序列的常⽤⼯具,常被应⽤于股票价格序列。移动平均可过滤⾼频噪声,反映出中⻓期低频趋势,辅助投资者做出投资判断。

@TOC

一、介绍

移动平均(Moving Average,MA),⼜称移动平均线,简称均线。作为技术分析中⼀种分析时间序列的常⽤⼯具,常被应⽤于股票价格序列。移动平均可过滤⾼频噪声,反映出中⻓期低频趋势,辅助投资者做出投资判断。

流⾏的移动平均包括简单移动平均、加权移动平均、指数移动平均,更⾼阶的移动平均算法则有分形⾃适应移动平均、赫尔移动平均等。

而本文将使用简单移动平均预测道琼斯、纳斯达克、标准普尔指数

二、下载数据

下载S&P、Dow、Nasdaq数据并将其保存至文件夹内,数据已经打包好了:CSDN下载:琼斯、纳斯达克、标准普尔指数-数据挖掘数据集包

下载后的csv数据如下所示:

在这里插入图片描述

三、获取数据

获取数据我们使用pandas的read_csv函数,如:data = pd.read_csv('S&P.csv',header=0)

pd.read_csv函数用法:pd.read_csv(filepath_or_buffer,header,parse_dates,index_co)l

参数名 用法
filepath_or_buffer 字符串,或者任何对象的read()方法。这个字符串可以是URL,有效的URL方案包括http、ftp、s3和文件。可以直接写入"文件名.csv"
header 将行号用作列名,且是数据的开头

获取数据之后,我们可以打印一下数据:print(data),可以看到已经成功读取到csv数据:

在这里插入图片描述

四、分析数据

在这里插入图片描述

如上图所示,数据格式为csv,其中Date表示开盘的日期,Open表示开盘价,High表示当日最高值,Low表示当日最低值,Close表示收盘价格,Adj Close表示调整后的收盘价格,Volume表示当日成交量。我们需要预测的则是Adj Close这一列

我们可以使用pandas读取csv文件,并打印出Adj Close这一列:

import pandas as pd
data = pd.read_csv('DOW.csv',header=0)
data = data.applymap(str)
print(data['Adj Close'])

结果如下,可以看到在道琼斯数据集中,我们需要预测的Adj Close有798行,type为object,我们要做的就是根据数据,使用移动平均算法,预测后面的指数。

在这里插入图片描述

五、移动平均预测

移动平均值,就是指定时间段,对时间序列数据进行移动计算平均值。移动平均值常常用在计算股票的移动平均线、存货成本等方面。移动平均的本质是⼀种低通滤波。它的⽬的是过滤掉时间序列中的⾼频扰动,保留有⽤的低频趋势。计算公式image.png

比如若依次得到测定值image.png,按顺序取一定个数所做的全部算术平均值就是移动平均值,如image.png

panda提供了rolling函数可以用来计算移动平均,使用简单,速度较快:

DataFrame.rolling(window, min_periods=None, freq=None, center=False, win_type=None, on=None, axis=0, closed=None)

参数 用法
window 表示时间窗的大小,注意有两种形式(int or offset)。如果使用int,则数值表示计算统计量的观测值的数量即向前几个数据。如果是offset类型,表示时间窗的大小。
min_periods 最少需要有值的观测点的数量,对于int类型,默认与window相等。对于offset类型,默认为1。
freq 不用管,从0.18版本中已经被舍弃。
win_type 窗口类型,不用管,默认为None一般不特殊指定
on 对于DataFrame如果不使用index(索引)作为rolling的列,那么用on来指定使用哪列。
closed 定义区间的开闭,不用管,新版本中已经被舍弃
axis 方向(轴),一般都是0。
center 是否使用window的中间值作为label,默认为false。只能在window是int时使用。

那么我们使用的简单移动平均直接使用:data['ma5'] = data['Adj Close'].rolling(5).mean(),其表示窗口大小为5的移动平均。计算后,使用matplotlib.pyplot进行画图,横轴为时间,竖轴为预测价格,将其在pyplot 图中打印:

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(16,9))
ax1 = fig.add_subplot(111, ylabel='Price')
data.ma5.plot(ax=ax1, color='plum', lw=2., legend=True)

效果如下:

在这里插入图片描述

我们以同样方法画出多个均线并且和原数据real对比:

data['real'] = data['Adj Close'].rolling(1).mean()
data['ma5'] = data['Adj Close'].rolling(5).mean()
data['ma10'] = data['Adj Close'].rolling(10).mean()
data['ma20'] = data['Adj Close'].rolling(20).mean()
data['ma30'] = data['Adj Close'].rolling(30).mean()
data['ma50'] = data['Adj Close'].rolling(50).mean()
data['ma100'] = data['Adj Close'].rolling(100).mean()
data['ma200'] = data['Adj Close'].rolling(200).mean()
data['ma250'] = data['Adj Close'].rolling(250).mean()
data.tail()
fig = plt.figure(figsize=(16,9))
ax1 = fig.add_subplot(111, ylabel='Price')
data.real.plot(ax=ax1, color='black', lw=2., legend=True)
data.ma5.plot(ax=ax1, color='plum', lw=2., legend=True)
data.ma10.plot(ax=ax1, color='grey', lw=2., legend=True)
data.ma20.plot(ax=ax1, color='salmon', lw=2., legend=True)
data.ma30.plot(ax=ax1, color='goldenrod', lw=2., legend=True)
data.ma50.plot(ax=ax1, color='hotpink', lw=2., legend=True)
data.ma100.plot(ax=ax1, color='khaki', lw=2., legend=True)
data.ma200.plot(ax=ax1, color='bisque', lw=2., legend=True)
data.ma250.plot(ax=ax1, color='skyblue', lw=2., legend=True)
plt.grid()
plt.show()

在这里插入图片描述

可以发现,移动平均存在一定的滞后性,移动平均以滞后性的代价换来了平滑性,滞后性说明由简单移动平均计算得到的低频趋势对近期的最新数据不够敏感。没有未来数据便是滞后的根本原因。当股价不是随着趋势的变化方向,发生突发的方向趋势,移动平均线行动往往过于迟缓,改变方向速度落后于大趋势。这是一个极大弱点

在股价原有趋势发生反转时,由于MA的追踪趋势的特性,MA的行动往往过于迟缓,掉头速度落后于大趋势。这是MA的一个极大的弱点。等MA发出反转信号时,股价调头的深度已经很大了。

附录DOW在不同MA值下的滑动平均值:

在这里插入图片描述

Nasdaq在不同MA值下的滑动平均值:

在这里插入图片描述

S&P在不同MA值下的滑动平均值:

在这里插入图片描述

六、封装函数

我们将其进行封装如下,代码整体如下:

import matplotlib.pyplot as plt
import pandas as pd
import os
def cal_ma(name,data, day):
    data = pd.read_csv(data, header=0)
    data = data.applymap(str)
    # print(data['Date'])
    # print(data['Adj Close'])
    day = int(day)
    data['ma'+str(day)] = data['Adj Close'].rolling(day).mean()
    data.tail()
    fig = plt.figure(figsize=(16, 9))
    ax1 = fig.add_subplot(111, ylabel='Price')
    data['ma'+str(day)].plot(ax=ax1, color='red', lw=2., legend=True)
    plt.rcParams['font.sans-serif'] = ['FangSong']
    plt.title("MA"+str(day)+" about "+name+" data", fontsize=10, loc='center', color='black')
    plt.grid()
    plt.show()
if __name__ == "__main__":
    dataname = input("请输入数据名:")
    day = input("请输入MA的天数:")
    cal_ma(dataname,dataname+'.csv', day)

完整项目已经打包,免费下载:数据挖掘项目——移动平均预测道琼斯、纳斯达克、标准普尔指数

最后

💖 个人简介:人工智能领域研究生,目前主攻文本生成图像(text to image)方向

📝 关注我:中杯可乐多加冰

🔥  限时免费订阅:文本生成图像T2I专栏

🎉 支持我:点赞👍+收藏⭐️+留言📝

如果这篇文章帮助到你很多,希望能点击下方打赏我一杯可乐!多加冰哦

相关文章
|
20天前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
|
16天前
|
数据可视化 编译器 Python
Manim:数学可视化的强大工具 | python小知识
Manim(Manim Community Edition)是由3Blue1Brown的Grant Sanderson开发的数学动画引擎,专为数学和科学可视化设计。它结合了Python的灵活性与LaTeX的精确性,支持多领域的内容展示,能生成清晰、精确的数学动画,广泛应用于教育视频制作。安装简单,入门容易,适合教育工作者和编程爱好者使用。
79 7
|
19天前
|
数据采集 分布式计算 大数据
构建高效的数据管道:使用Python进行ETL任务
在数据驱动的世界中,高效地处理和移动数据是至关重要的。本文将引导你通过一个实际的Python ETL(提取、转换、加载)项目,从概念到实现。我们将探索如何设计一个灵活且可扩展的数据管道,确保数据的准确性和完整性。无论你是数据工程师、分析师还是任何对数据处理感兴趣的人,这篇文章都将成为你工具箱中的宝贵资源。
|
1月前
|
存储 数据可视化 数据挖掘
使用Python进行数据分析和可视化
本文将引导你理解如何使用Python进行数据分析和可视化。我们将从基础的数据结构开始,逐步深入到数据处理和分析的方法,最后通过实际的代码示例来展示如何创建直观的数据可视化。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。让我们一起探索数据的世界,发现隐藏在数字背后的故事!
|
1月前
|
传感器 物联网 开发者
使用Python读取串行设备的温度数据
本文介绍了如何使用Python通过串行接口(如UART、RS-232或RS-485)读取温度传感器的数据。详细步骤包括硬件连接、安装`pyserial`库、配置串行端口、发送请求及解析响应等。适合嵌入式系统和物联网应用开发者参考。
46 3
|
1月前
|
机器学习/深度学习 数据可视化 数据挖掘
使用Python进行数据分析和可视化
【10月更文挑战第42天】本文将介绍如何使用Python进行数据分析和可视化。我们将从数据导入、清洗、探索性分析、建模预测,以及结果的可视化展示等方面展开讲解。通过这篇文章,你将了解到Python在数据处理和分析中的强大功能,以及如何利用这些工具来提升你的工作效率。
|
1月前
|
数据可视化 搜索推荐 Shell
Python与Plotly:B站每周必看榜单的可视化解决方案
Python与Plotly:B站每周必看榜单的可视化解决方案
|
1月前
|
图形学 Python
SciPy 空间数据2
凸包(Convex Hull)是计算几何中的概念,指包含给定点集的所有凸集的交集。可以通过 `ConvexHull()` 方法创建凸包。示例代码展示了如何使用 `scipy` 库和 `matplotlib` 绘制给定点集的凸包。
28 1
|
1月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
1月前
|
数据采集 Web App开发 iOS开发
如何使用 Python 语言的正则表达式进行网页数据的爬取?
使用 Python 进行网页数据爬取的步骤包括:1. 安装必要库(requests、re、bs4);2. 发送 HTTP 请求获取网页内容;3. 使用正则表达式提取数据;4. 数据清洗和处理;5. 循环遍历多个页面。通过这些步骤,可以高效地从网页中提取所需信息。

热门文章

最新文章