




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录TOC\o"1-3"\h\u289301引言 基于Python的股票数据分析系统设计作者:刘一平指导老师:陈学明(海南师范大学物理与电子工程学院,海口,571158)摘要:随着数字经济的不断深入拓展,股票数据的深入分析和预测逐渐变为投资者关注的重点。此项研究利用Python语言爬取股票数据,通过显示K线图对数据进行量化及可视化。再使用移动平均线分析、线性回归及时间序列自回归的三种算法,预测得出未来股票的上涨概率。综合考虑不同算法的优点,使预测结果更全面,为投资者提供一定价值的参考。在数字经济化的趋势下,数据分析在金融界的使用正在逐渐增多。本此设计希望通过对股票数据进行分析预测,为投资者提供更加精确和高效的决策意见。关键词:python;股票;数据可视化;股市预测1引言1.1研究意义股票市场由于不稳定、波动等原因可能使投资者面临着各种各样的风险,对股票进行深入细致的分析将帮助投资者更便捷地了解股票,并减少其投资风险。在信息技术飞速发展,大数据,人工智能等先进技术被广泛运用的今天,可以帮助投资者快速,精准地发现并把握投资中潜在的风险与机会。综合不同数据源进行研究分析可以发现股票的未来走向,这将给投资方带来更广阔的选择空间。在金融科技(FinTech)的演进中,股票数据分析起到了不可或缺的作用,它为金融领域的创新和转型提供了推动力。在大数据,人工智能和机器学习技术手段的推动下,金融机构能够研发更加智能有效的投资工具与交易系统,从而提高服务水平与竞争力。Python是一种强大且易学易用的编程语言之一,也是股票数据分析中优选的工具。Python具有丰富的数据分析库(如Pandas、NumPy、Matplotlib等)和人工智能库(如TensorFlow、PyTorch等),能够支持数据获取,清洗和分析,直至模型训练和预测的每一个环节,对股票数据分析具有有力的技术支持。所以探讨如何将Python运用到股票数据分析中,无论从理论上还是从实践上都有很大的意义。1.2研究现状目前,Python在股票数据分析领域具有广泛的应用,它提供了丰富的处理库,如Pandas、NumPy和Quandl等。投资者可以使用这些库来从各种数据源(如YahooFinance、AlphaVantage等)获取股票价格、交易量、财务报表等数据,并进行数据清洗、格式化和整合。何雨峰,许超,黄兰运用Python爬虫技术获取数据,使用DEA方法构建CCR模型进行数据分析,对不同财务状况的中小企业在融资过程的优势做出比较,为企业融资提出建议REF_Ref29873\r\h[1]。李雪采用多线程Python网络爬虫技术对股吧内的相关信息进行爬取,并对测度网络舆情方法进行改进,通过基于情感词典法的文本挖掘技术进行数据分析,构建“关注度”“情绪得分”和“意见分歧”共3个网络舆情指数REF_Ref29912\r\h[2]。Python中的一些库的提供了强大的绘图功能,如Matplotlib、Seaborn和Plotly,可以将股票数据以图表、折线图、柱状图等形式直观地展示出来,帮助投资者直观地理解市场趋势和规律。李思佳用Python实现了股票交易的大数据可视化分析,其中着重剖析了特斯拉汽车与比亚迪这二个股票在最近五年内的股价、成交额等的具体变动情形。该成果便于相关人士在融资流程中更灵活的对股票交易数据进行分类,为股票投资提供决策支持REF_Ref29951\r\h[3]。王子豪通过使用Python,对股价信息进行了可视化管理,从信息可视化理论出发,提出了优质高效的大数据信息,并利用数据挖掘方法对微软、苹果、谷歌等企业多只股价趋势展开了深入研究REF_Ref30036\r\h[4]。Python在量化交易和算法交易方面有着广泛的应用。通过使用量化交易框架如Zipline、Backtrader和PyAlgoTrade等,投资者可以快速开发和测试各种交易策略,并利用机器学习和人工智能技术进行模型训练和优化,实现自动化交易和风险管理。梁国鹏,刘力军通过对量化交易系统展开研究,对现有交易策略进行分析并根据其存在的不足进行改进,以此实现量化交易系统的有效运行,进行回测来指导投资者并为其带来超额收益REF_Ref30075\r\h[5]。谭军龙,李慧莹提出一种基于Python的量化投资交易系统的设计,用于个人投资者的自动化量化交易REF_Ref30104\r\h[6]。魏玉娇选取了交通银行、中国银行、中信银行三只股票的日交易数据为样本,利用Python进行了量化通道策略及其与配对交易结合的实证研究REF_Ref30140\r\h[7]。利用Python的机器学习库如Scikit-learn、TensorFlow和PyTorch等,投资者可以构建各种预测模型和分类算法,用于股票价格预测、市场情绪分析和风险评估等方面。尹清通过Python中的机器学习算法分析携出用户特征,建立易携出用户模型预测,提前定位易携出客户,进行维稳挽留,有效降低了携出用户的概率REF_Ref30219\r\h[8]。孟平,龙华秋研究领域包括对流量特性的获取以及有关机器学习方法的描述,首先通过从日常捕获的流量中来获取相应的特性,接着通过对机器学习模型的评估,来快速确定对其是否存在威胁性.然后经过使用数据集对机器学习的模型进行评价,其准确率可以达到99%REF_Ref30294\r\h[9]。张凯姣借助Python平台设计并实现了基于模块化设计的成纱质量预测系统,设计了预测模块,数据处理模块以及可视化模块,并且提供了便捷的GUI界面REF_Ref30333\r\h[10]。1.3研究内容构建一个股票数据分析与预测系统,该系统能够实现以下功能:(1)股票数据爬取:通过网络爬虫技术得到股票市场历史价格数据及K线图,保证数据及时完整。(2)数据处理及特征提取:将爬取的股票数据经过清洗,加工并提取特征,从而构造出一个高效的特征集合来训练模型。(3)机器学习模型搭建:采用了移动平均线分析法,趋势回归线分析法和时间序列自回归分析法3种不同传统学习方法,将特征提取得到的股票数据建模并加以分析,从而预测出未来股票价格的变化趋势。(4)系统界面设计:设计用户友好的界面,将数据分析和预测结果直观地呈现给用户,提供可视化的股票价格走势图表,以提高用户的体验感和使用便捷度。1.4设计思路及方法本研究首先通过爬虫技术从财经网站获取股票数据。然后,利用Python的Pandas库对数据进行清洗和预处理,包括缺失值处理、异常值检测和数据标准化等步骤REF_Ref3070\r\h[13]。通过对股票数据进行量化和可视化,提取了包括开盘价、收盘价、最高价、最低价、成交量等在内的多个特征值,并显示出该只股票的K线图,使用户可以更直观高效地读取股票数据。另外在展示K线图时,用户可以自由缩放时间轴,查看不同时间段的股票走势。然后,选取了移动平均线,趋势线,基于历史数据的分析三种算法进行模型训练。移动平均线是一种平滑股价波动的方法,能够消除短期价格波动带来的噪声,凸显价格走势的长期趋势。趋势线则是一种描绘股价走势的方法,可以直观地显示价格变化的趋势。基于历史数据的分析方法则利用股票价格的历史数据来预测未来价格走势。通过对训练集的学习,各模型能够预测未来一段时间内的股票价格上涨的概率。最后,将所有程序功能合并开发全新的页面,方便用户的使用。流程如图1-1-4所示:图1-4-4系统流程图2相关技术介绍2.1Python语言Python是一种面向对象的解释型计算机程序设计语言,易于学习,语法简洁优雅,支持动态类型,且功能强大,具有丰富的标准库和第三方库。标准库是Python自带的工具库,由Python官方作者开发和发布,比如os,time等,在Python安装后即可使用。第三方库是全球Python开发者共同创建并贡献出的工具库,需另行安装方可应用,例如Pandas、Flask、sk-learn等。得益于Python的广泛流行和开发者社区的活跃性,诸多第三方库应运而生,助力实现多样化的功能。2.2Pandas库Pandas是公认的数据分析领域的一个核心工具,在Python各大数据分析库当中占据着举足轻重的地位。它强大,丰富的数据组织和管理能力,使得它成为功能强大,切实可行的数据管理平台。它向用户展示一个高效,灵活,易懂的数据架构,使应对各种数据市场更加简明,直观,快捷。Pandas有处理下列类型资料的功能:(1)数据与SQL或Excel的表格有相似之处。(2)时间序列数据中的有序与无序(具有非固定的频率)。(3)带有行和列标签的矩阵数据。(4)各种不同类型的观察和统计数据集。Pandas这个数据处理库主要呈现了两种关键的数据结构:Series(一维)和DataFrame(二维),这两种结构能够处理金融、统计、社会科学、工程等多个领域中的大量关键案例REF_Ref4053\r\h[14]。3.3Tushare数据接口库Tushare作为Python数据接口库没有任何费用和开放性,专门用于收集与金融有关的资料。该平台向投资者,开发者以及数据分析师们提供丰富的股票,期货,基金及其他金融市场信息,推荐数据有助于投资者对市场进行风险评估,制定交易策略以及支持投资决策。Python开发环境下的Tushare操作十分直观方便,使用者能够很容易获得股票,指数,基金以及其他与金融有关的信息,或通过API接口与Thrift接口实现数据查询与合作操作。简而言之,Tushare实质上是一个方便获取股票、期货、基金等金融信息的工具,并且是完全免费的。Tushare公司提供与金融市场有关的多种资料。这些资料对评估市场风险,制定交易策略和支持决策过程大有帮助。3.4NumPy库NumPy是Python语言的一种扩展型程序库,给使用者带来了强大的向量和矩阵运算能力。利用这些工具,使用者可以更容易地完成最优化、线性代数、统计微分、插值运算、特殊方程、傅里叶变换、信号处理和图像处理以及常微分方程计算等科研与工程技术领域中常用的运算工作。所以,NumPy在提升运算质量与便捷性领域起到了巨大作用。NumPy是一个开源的Python科学计算基础数据库,它是SciPy、Pandas等软件的数据处理的基础。它的主要特征及作用有以下方面:(1)强大的N维数组对象ndarray:这是一个类似于列表的数组对象,它描述了相同类型元素的集合。另外,它具有矢量运算、复杂广播能力等快速、省时的多维数组特点,给使用者提供一种有效的数据处理手段。(2)标准数学函数库:为快速操作整组数据提供功能,不需要写循环,也就是内置并行操作功能。在系统执行一定的计算并有多个核心的情况下,NumPy将自动并行计算从而显著提高计算的效率。(3)实用功能:包括线性代数,傅里叶变换,随机生成函数,以及其他实用的功能,给各种计算带来方便的运算。(4)数组与矩阵运算:NumPy可直接进行数组与矩阵运算而不需要循环以减少用户写代码的复杂性。3股票数据获取及预处理3.1爬虫可行性爬虫是一种在FOAF社区中广受欢迎的术语。它会按照预先设定的规则,自动地抓取网络信息中的程序或脚本。爬虫的原理类似于人类在网络环境中的做法,如通过网页浏览和点击网络链接等多种方式来获取网页中的信息和数据。爬虫系统会预先建立标准,例如特定URL中的图形和核心词汇的出现次数,再自动识别网站的信息,抓取并解读其中的内容。在网络上,爬虫在数据收集中至关重要。在搜索引擎、数据审查、价格控制、社交媒体监督等多个情镜中,它的地位都是不容忽视的。搜索引擎可以利用网络爬虫技术来搜集网络上的资料,同时创建相应的索引,这可以让用户迅速地找到到他们所需的内容。数据分析专家可以通过采取爬虫方法来搜集众多的数据,并且深入挖掘和解析这些数据,进而揭示其背后的深层次价值。3.2爬取数据的流程Tushare是一个面向金融数据的Python第三方库,提供了丰富的金融数据接口,可以获取股票、基金、期货等市场数据。以下是使用Tushare进行数据爬取的一般流程:图3-2-1Tushare爬虫流程3.3爬虫重要程序(1)获取接口token。在使用Tushare接口之前,首先需要获取一个独特的接口token。打开Tushare官方网站(/),注册并登录账户。登录成功后,请点击页面右上角的个人头像,进入用户中心。在用户中心页面,点击一个名为“接口token”的选项,即可获取专属接口token。图3-3-1Tushare接口获得(2)导入库并设置token。importpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltimportmplfinanceasmpfimporttushareastspro=_api('4e0c27861ed60fd7d119dd3493aeafca4603c36e8cfbac912c99bc18')(3)获取股票数据,以下程序爬取为深市A股2023年到2024年的历史数据,可以根据不同需要调整从而获得目标数据。daily=_bar('000001.SZ',start_date='2023-04-13',end_date='20240416')daily.index=daily.trade_datedaily=daily.rename(index=pd.Timestamp)3.4数据预处理Python中进行爬虫后的数据预处理通常包括以下步骤:(1)数据清洗:清洗数据是指将数据中的缺失值、重复值以及异常值等处理完毕,保证数据的质量。在Python环境下,可以使用pandas库清洗数据,其中使用dropna()功能去除数据缺失值,通过使用drop_duplicates()函数来消除重复数据,并运用条件判断或统计方法来识别和处理异常数据。(2)数据转换所谓数据转换是指将数据从一种形式转换为另一种形式,将日期时间转换为标准形式,将数据类型转换为适合分析需要的形式。可利用pandas库中to_datetime()功能把日期时间字符串变换成日期时间格式、用astype()功能把数据类型变换成指定类型等等。(3)数据标准化数据标准化就是把数据按一定标准缩放到量纲与范围一致,便于后续分析与建模的过程。常用标准化方法有Z-score标准化,Min-Max标准化等。可以使用sklearn库中的StandardScaler和MinMaxScaler进行数据标准化操作。(4)特征提取:所谓特征提取,就是从原始数据中抽取对分析与建模有帮助的特征。可针对特定问题采用不同特征提取方法如文本数据关键词特征提取和时间序列数据周期性特征提取。(5)合并数据:如果爬取的数据分散在多个文件或多个数据源中,需要将这些数据进行合并再进行分析。可以使用pandas库中的merge()函数或concat()函数进行数据合并操作。(6)其他预处理操作:根据一些具体情况可能还需要进行其他预处理操作,比如处理文本中的数据的分词、去除停用词,处理图像数据的缩放、裁剪等。再获取数据,把数据格式化成mplfinance的标准格式,取重要数据并重命名。部分代码如下所示:data=file_namedata=data[::-1]self.data_source=file_namedata=data[['trade_date','open','close','high','low','vol','amount','pre_close','change','pct_chg']]data.columns=['date','open','close','high','low','volume','amount','pre_close','change','pct_chg']data['upper_lim']=np.round(data['pre_close']*1.10)data['lower_lim']=np.round(data['pre_close']*0.90)data['average']=np.round((data['high']+data['low'])/2)4数据量化及可视化在购买股票的时候,可以使用历史数据来对当前的股票的走势进行预测,这就需要对股票的数据进行获取并且进行一定的分析,人们是比较喜欢图形化的界面的,因此,在这里采用一种可视化的方法来实现股票数据的分析。4.1基本界面设置(1)设置程序输出界面的长宽比例,字体大小格式等。部分代码如下所示:self.number_get.setFixedSize(350,70)my_color=mpf.make_marketcolors(up='r',down='g',edge='inherit',wick='inherit',volume='inherit')(2)plot()函数通过两个属性color和linestyle设置线段颜色和线段样式,通过plt.show()方法立即显示图片。my_color=mpf.make_marketcolors(up='r',down='g',edge='inherit',wick='inherit',volume='inherit')my_style=mpf.make_mpf_style(marketcolors=my_color,figcolor='(0.82,0.83,0.85)',gridcolor='(0.82,0.83,0.85)')4.2输出K线图设计这里需要用到的库是mplfinance,mplfinance是一款基于matplotlib的金融数据可视化分析模块,它的前身是mpl_finance,相较于mpl_finance,mplfinance做了许多简化,使其在使用上更为便捷。mplfinance为我们提供了丰富的图表类型,如K线图、技术指标图等,可以轻松地将复杂的市场数据转化为直观的图表,便于我们观察和分析市场走势。Ta-lib库专门用于金融市场数据的技术分析。其中集成了许多计算技术指标功能,例如IFI,KDJ,OBV。这些指标都采用特殊算法,可以很方便地计算出各种指标,然后对市场的动态有一个比较全面的掌握,也为制定交易策略提供了一定的借鉴,从而促进收益水平的提高。除了上述功能外,Ta-lib还拥有识别K线形状的能力,它可以自动识别多种常见的K线形状,为投资者的决策提供了强大的支持。这里首先利用Ta-lib对各项技术指标及K线形态进行统计,再借助于mplfinance对数据进行可视化处理。这能够更加直观的了解市场数据趋势及特点,以便于更好的投资分析。除此之外,这两个数据库也兼容Python编程语言,能够轻松地与其他Python数据库进行集成,从而提供更多的功能和可能性。部分代码如下所示:(1)初始化交互式K线图对象,历史数据作为唯一的参数用于初始化对象。self.data=dataself.style=my_style(2)设置初始化的K线图显示区间起点为0,即显示第0到第99个交易日的数据(前100个数据),设置ax1图表中显示的均线类型。self.idx_start=0self.idx_range=100self.avg_type='ma'self.indicator='macd'初始化figure对象,在figure上建立三个Axes对象并分别设置好它们的位置和基本属性,在figure上预先放置文本并设置格式,文本内容根据需要显示的数据实时更新,这里可以生成当天的股票数据信息,并显示在界面最上方,如图所示。图4-2-2当天股票数据显示部分代码如下:self.fig=mpf.figure(style=my_style,figsize=(12,8),facecolor=(0.82,0.83,0.85))fig=self.figself.ax1=fig.add_axes([0.08,0.25,0.88,0.60])self.ax2=fig.add_axes([0.08,0.15,0.88,0.10],sharex=self.ax1)self.ax2.set_ylabel('volume')self.ax3=fig.add_axes([0.08,0.05,0.88,0.10],sharex=self.ax1)self.ax3.set_ylabel('macd')self.t1=fig.text(0.50,0.94,'513100.SH-纳斯达克指数ETF基金',**title_font)self.t2=fig.text(0.12,0.90,'开/收:',**normal_label_font)(4)添加K线图重叠均线,根据均线类型添加移动均线或布林带线。ifself.avg_type=='ma':ap.append(mpf.make_addplot(plot_data[['MA5','MA10','MA20','MA60']],ax=self.ax1))elifself.avg_type=='bb':ap.append(mpf.make_addplot(plot_data[['bb-u','bb-m','bb-l']],ax=self.ax1))(5)添加指标,根据指标类型添加MACD或RSI或DEMA。以MACD指标为例:ifself.indicator=='macd':ap.append(mpf.make_addplot(plot_data[['macd-m','macd-s']],ylabel='macd',ax=self.ax3))bar_r=np.where(plot_data['macd-h']>0,plot_data['macd-h'],0)bar_g=np.where(plot_data['macd-h']<=0,plot_data['macd-h'],0)ap.append(mpf.make_addplot(bar_r,type='bar',color='red',ax=self.ax3))ap.append(mpf.make_addplot(bar_g,type='bar',color='green',ax=self.ax3))(6)绘制图表:mpf.plot(plot_data,ax=self.ax1,volume=self.ax2,addplot=ap,type='candle',style=self.style,datetime_format='%Y-%m',xrotation=0)print("show")plt.draw()plt.show()(7)根据最新的参数,重新绘制整个图表:all_data=self.dataplot_data=all_data.iloc[idx_start:idx_start+idx_range](8)最终得到的K线图如下图4-2-2所示,图中有类似蜡烛的阳线和阴线,分别代表上涨和下跌,还有布林指标折线图,由上、中、下三条线组成,分别是上轨线、中轨线和下轨线,另外还有最下方的成交量bar图,X轴为股票日期数据,Y轴为成交数据。这些指标都是判断股票波动的重要数据。图4-2-2K线图5预测模型的实现5.1移动平均线分析移动平均线(MovingAverage,MA)是股票分析中常用的一种技术,用于平滑价格数据,以便更清晰地看到价格趋势。通过对过去一段时期股票平均价格的测算,对今后价格走势进行预测。这里选取了5日、10日、20日和60日的移动平均线作为比较基准,目的是为了评估短期与长期内的价格走势。当短期移动平均线向上突破长期移动平均线时,我们通常认为这是一个买进的信号,意味着股票价格可能继续上涨。反之,当短期移动平均线向下突破长期移动平均线时,我们认为这是一个卖出信号,暗示股票价格可能出现下跌。简单移动平均线(SimpleMovingAverage,SMA)的计算公式如下:SMAn=1其中,SMAn是窗口大小为n的简单移动平均线,Pi是第i天的价格,n是移动平均线的窗口大小。移动平均线是一种迟滞性指标,这意味着它无法预测市场的即时变化。因此,需要将移动平均线与其他技术指标相结合,以提高预测的准确性。部分实现代码如下:ap=[mpf.make_addplot(plot_data[['MA5','MA10','MA20','MA60']],ax=ax1)short_window=10medium_window=50long_window=200df_filled=pd.DataFrame(df,columns=df.columns)df_filled['short_mavg']=df_filled['close'].rolling(window=short_window).mean()df_filled['medium_mavg']=df_filled['close'].rolling(window=medium_window).mean()df_filled['long_mavg']=df_filled['close'].rolling(window=long_window).mean()df_filled['up_prob_sma']=math.tanh((df_filled['close']/(df_filled['short_mavg']+df_filled['long_mavg']))[len(df_filled['close'])-1])5.2趋势线分析趋势线分析(TrendLineAnalysis)采用拟合数据的线性模型来预测未来的价格走势。在编写代码时,采用了线性回归模型(LinearRegression)来对价格数据进行拟合。线性回归是一种统计分析方法,通过建立自变量(如时间、历史价格等)与因变量(未来价格)之间的线性关系,来预测股票价格的未来走势。对近一年来的股票数据进行回归分析就可得到预测未来股价的线性方程,根据这个方程来判断涨跌的可能性。线性回归的基本原理如下:线性回归模型是基于最小二乘法构建的,其基本目标是寻找到一条直线,使这条直线的自变量与因变量之间的预测值与实际值的残差平方和达到最小。在这里,线性回归模型就是求解直线方程y=wx+b中的斜率w和截距b。线性回归模型在金融领域的优势主要体现在以下几个方面:1.稳定性:线性回归模型具有较强的稳定性,所以可以在不同的金融市场环境下保持较好的预测效果。2.实用性:线性回归模型对数据的要求相对比较低,即使数据量有限,它也可以构建出具有较高预测能力的模型。3.易于操作:线性回归模型的构建和预测过程比较简单,并且易于操作,这可以帮助投资者快速做出决策。要使用线性回归模型预测股票价格,需要收集近一年来的股票数据,如时间、历史价格等信息。然后利用这些数据进行回归分析,进而求解线性方程y=wx+b。得到线性方程,再根据该方程预测未来股价的走势。如果预测值与实际值的残差平方和较小,则说明线性回归模型对股票价格的预测具有较高的准确性。部分代码实现如下:X=df_filled[['close']].dropna()#确保没有NaN值y=df_filled['close'].dropna()X=X.shift(1)#将'close'列向上移动一位,作为自变量X['close'][0]=(X['close'][1]+X['close'][2])/2X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.4,random_state=2)model=LinearRegression()model.fit(X_train,y_train)df_filled['up_prob_trend']=abs(y_test/model.predict(X_test))df_filled['up_prob_trend'][len(df_filled['up_prob_trend'])-1]math.tanh(df_filled['up_prob_trend'][len(df_filled['up_prob_trend'])-1])5.3基于历史数据的统计分析时间序列ARIMA(自回归积分移动平均)模型是一种用于分析和预测时间序列数据的统计模型。结合了自回归(AR),差分(I)和移动平均(MA)的概念,可以捕捉时间序列数据中的趋势和周期性REF_Ref5372\r\h[15],模型过程如图5-3-1所示。图5-3-1ARIMA操作过程首先,采用ADF检验(AugmentedDickey-FullerTest)来验证时间序列数据的稳定性。ADF检验旨在检验自变量中某一个或者某几个变量单位根的存在性,也就是考察时间序列的非平稳性。时间序列分析是一种专为处理时间序列数据而设计的统计手段,它通过对历史数据的时间序列特性进行分析,以预测未来数据可能出现的变动。在时间序列分析领域,自回归模型是一种经常被采用的方法,其主要是通过建立过去数据与未来数据的自回归联系来预估未来股票的价格走势。如果ADF检验的结果表明数据是非平稳的,代码将使用ARIMA模型(自回归积分滑动平均模型)来拟合数据。ARIMA模型是一种用于时间序列预测的模型,它可以同时考虑数据的自回归特性(AR),差分操作(I),和移动平均特性(MA)。ARIMA模型的一般形式是ARIMA(p,d,q),其中p是自回归项的阶数,d是进行差分的次数,q是移动平均项的阶数。在代码中,使用了ARIMA(1,2,4)模型。如果模型拟合成功,即残差序列是平稳的,那么使用模型的拟合值和实际值的比较来计算上涨概率(up_prob_arima)。如果拟合值大于实际值,则认为上涨概率高。df_filled['close_diff']=df_filled['close'].diff().dropna()df_filled['close_diff'][0]=(df_filled['close_diff'][1]+df_filled['close_diff'][2])/2#print(df_filled['close_diff'])result=adfuller(df_filled['close_diff'])ifresult[1]<0.05:model_arima=ARIMA(df_filled['close_diff'],order=(1,2,4))results=model_arima.fit()df_filled['up_prob_arima']=math.tanh(abs(results.fittedvalues*100)[len(df_filled['close'])-1])else:df_filled['up_prob_arima']=05.4综合股票预测值在股票市场预测中,我们常常采用多种预测模型以提高预测的准确性。上述三种预测模型分别是基于移动均线分析,趋势线分析和历史数据的统计分析的。为了更全面地评估股票的上涨概率,这里用均值的方法将这三种预测模型的结果进行综合。代码实现如下:df_filled['final_up_prob']=(df_filled['up_prob_sma']+df_filled['up_prob_trend']+df_filled['up_prob_arima'])/3self.result=df_filledprint(self.result['up_prob_sma'][len(self.result)-1])print(self.result['up_prob_trend'][len(self.result)-1])print(self.result['up_prob_arima'][len(self.result)-1])6股票分析预测系统的应用测试6.1系统操作说明图6-1-1系统操作流程6.2运行结果测试本次以2024年4月15日A股深市中鼎股份(000887.SZ)这只股票为例测试股票分析系统的应用结果:(1)运行代码后按下键盘上的“A键”可以得到一个有着“输入股票代码”的窗口,可以在窗口里输入深市任意一只股票代码,结果如图6-2-1所示:图6-2-1输入股票代码窗口(2)在输入框里输入中鼎股份这个股票代码,点击“Enter键”,可以得到这只股票近一年的K线图,这个图由价格波动线,平均日线,成交量线等组成,且图像上有开盘价,收盘价,涨幅,平均日价,交易额,最高价,最低价信息等,用户可以对股票波动有一个直观清晰的认识。输出的K线图如下图6-2-2所示:图6-2-2K线图在K线图这个页面,可以用右上角的功能键进行选取放大等,可以更清楚地观察一段时间的K线,如下图6-2-3所示:图6-2-3K线图放大接着点击键盘“M”键,可以得到基于SMA算法的股票上涨概率约为56.5%,如下图6-2-4所示:图6-2-4SMA算法预测值窗口(5)点击键盘“T”键,可以得到基于趋势线算法的股票上涨概率约为76.6%,如下图6-2-5所示:图6-2-5趋势线分析算法预测值窗口(6)点击键盘“R”键,可以得到基于历史数据统计分析的股票上涨概率约为64.1%,如下图6-2-6所示:图6-2-6ARIMA算法预测值窗口(7)点击“C”键,可以得到综合分析的股票上涨概率约为62.5%,如下图6-2-7所示:图6-2-7综合概率预测值窗口7总结本实验选取近一年的股票数据,采用了三种不同的算法进行分析:移动平均线、线性回归以及时间序列的自回归,并得出相应的上涨概率,通过求均值的方式计算出了综合上涨概率。这种方法综合考虑了不同算法的优点,使预测结果更全面准确。然而,由于采用的是传统分析方法,未涉及深度学习等先进技术,因此预测结果可能存在一定的误差。需要注意的是,股市波动变幻莫测,任何预测方法都无法保证100%的准确性。因此,投资者在使用本分析预测系统时,应谨慎参考预测结果,并结合其他因素进行综合判断。参考文献何雨峰,许超,黄兰.基于数据包络方法的中小企业融资优势分析[J].中国集体经济,2020(5):98-100.李雪.网络舆情测度及其对银行业系统性风险的影响研究[D].吉林:长春工业大学,2023.李思佳.基于Python的股票数据可视化分析——以新能源汽车行业为例[J].河北软件职业技术学院学报,2021,23(3):15-18.王子豪.股票数据初探——移动平均与烛状图分析[J].中小企业管理与科技(上旬刊),2021,(01):111-112+115.梁国鹏,刘力军.基于Python的量化交易系统设计与实现[J].现代信息科技,2021,5(8):86-89,94.DOI:10.19850/ki.2096-4706.2021.08.025.谭军龙,李慧莹.基于Python的量化投资交易系统的设计和实现[J].中国战略新兴产业,2021(27):41-42.DOI:10.12230/j.issn.2095-6657.2021.27.027.魏玉娇.基于Python的量化投资通道突破策略的应用研究[J].品牌研究,2021(23):265-267,281.DOI:10.3969/j.issn.1671-1009.2021.23.081.尹清.基于Python机器学习算法的易携出客户模型研究[J].中国新通信,2022,24(16):59-61.DOI:10.3969/j.issn.1673-4866.2022.16.019.孟平,龙华秋.基于Python的机器学习入侵检测的研究[J].网络安全技术与应用,2019(8):40-42.张凯姣.基于Python机器学习的可视化麻纱质量预测系统[D].上海:东华大学,2017.AlbeladiK,ZafarB,MueenA.TimeSeriesForecastingusingLSTMandARIMA[J].InternationalJournalofAdvancedComputerScienceandApplications(IJACSA),2023,14(1).JingyiZ.RepresentativeStockAnalysisinChineseMedicalIndustryandRelevantInvestmentRecommendations[J].JournalofEconomics,FinanceandAccountingStudies,2023,5(2):139-151.游颖,程俊.基于Python语言的教学数据处理平台设计[J].中国新技术新产品,2023,(17):26-29.DOI:10.13612/tp.2023.17.011.潘奕霖.基于用户画像的生活垃圾产废模式构建研究[D].哈尔滨工业大学,2022.DOI:10.27061/ki.ghgdu.2022.002934.郭聪楠.基于ARIMAGRU模型的地面沉降分析与预测研究[D].北京建筑大学,2023.附录主函数:importpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltimportmplfinanceasmpfimporttushareasts#读取示例数据pro=_api('4e0c27861ed60fd7d119dd3493aeafca4603c36e8cfbac912c99bc18')daily=_bar('000001.SZ',start_date='2023-04-13',end_date='20240416')daily.index=daily.trade_datedaily=daily.rename(index=pd.Timestamp)#daily.drop(columns=['ts_code','trade_date','pre_close','change','pct_chg','amount'],inplace=True)#daily.columns=['open','high','low','close','volume']daily.sort_index(inplace=True)data=pd.read_csv('test_data.csv',index_col=0)data=dailydata.index=pd.to_datetime(data.index)my_color=mpf.make_marketcolors(up='r',down='g',edge='inherit',wick='inherit',volume='inherit')my_style=mpf.make_mpf_style(marketcolors=my_color,figcolor='(0.82,0.83,0.85)',gridcolor='(0.82,0.83,0.85)')#定义各种字体title_font={'fontname':'MicrosoftYaHei','size':'16','color':'black','weight':'bold','va':'bottom','ha':'center'}large_red_font={'fontname':'MicrosoftYaHei','size':'24','color':'red','weight':'bold','va':'bottom'}large_green_font={'fontname':'MicrosoftYaHei','size':'24','color':'green','weight':'bold','va':'bottom'}small_red_font={'fontname':'MicrosoftYaHei','size':'12','color':'red','weight':'bold','va':'bottom'}small_green_font={'fontname':'MicrosoftYaHei','size':'12','color':'green','weight':'bold','va':'bottom'}normal_label_font={'fontname':'MicrosoftYaHei','size':'12','color':'black','weight':'normal','va':'bottom','ha':'right'}normal_font={'fontname':'MicrosoftYaHei','size':'12','color':'black','weight':'normal','va':'bottom','ha':'left'}classInterCandle:def__init__(self,data,my_style):self.pressed=Falseself.xpress=None#初始化交互式K线图对象,历史数据作为唯一的参数用于初始化对象self.data=dataself.style=my_style#设置初始化的K线图显示区间起点为0,即显示第0到第99个交易日的数据(前100个数据)self.idx_start=0self.idx_range=100#设置ax1图表中显示的均线类型self.avg_type='ma'self.indicator='macd'#初始化figure对象,在figure上建立三个Axes对象并分别设置好它们的位置和基本属性self.fig=mpf.figure(style=my_style,figsize=(12,8),facecolor=(0.82,0.83,0.85))fig=self.figself.ax1=fig.add_axes([0.08,0.25,0.88,0.60])self.ax2=fig.add_axes([0.08,0.15,0.88,0.10],sharex=self.ax1)self.ax2.set_ylabel('volume')self.ax3=fig.add_axes([0.08,0.05,0.88,0.10],sharex=self.ax1)self.ax3.set_ylabel('macd')#初始化figure对象,在figure上预先放置文本并设置格式,文本内容根据需要显示的数据实时更新self.t1=fig.text(0.50,0.94,'513100.SH-纳斯达克指数ETF基金',**title_font)self.t2=fig.text(0.12,0.90,'开/收:',**normal_label_font)self.t3=fig.text(0.14,0.89,f'',**large_red_font)self.t4=fig.text(0.14,0.86,f'',**small_red_font)self.t5=fig.text(0.22,0.86,f'',**small_red_font)self.t6=fig.text(0.12,0.86,f'',**normal_label_font)self.t7=fig.text(0.40,0.90,'高:',**normal_label_font)self.t8=fig.text(0.40,0.90,f'',**small_red_font)self.t9=fig.text(0.40,0.86,'低:',**normal_label_font)self.t10=fig.text(0.40,0.86,f'',**small_green_font)self.t11=fig.text(0.55,0.90,'量(万手):',**normal_label_font)self.t12=fig.text(0.55,0.90,f'',**normal_font)self.t13=fig.text(0.55,0.86,'额(亿元):',**normal_label_font)self.t14=fig.text(0.55,0.86,f'',**normal_font)self.t15=fig.text(0.70,0.90,'涨停:',**normal_label_font)self.t16=fig.text(0.70,0.90,f'',**small_red_font)self.t17=fig.text(0.70,0.86,'跌停:',**normal_label_font)self.t18=fig.text(0.70,0.86,f'',**small_green_font)self.t19=fig.text(0.85,0.90,'均价:',**normal_label_font)self.t20=fig.text(0.85,0.90,f'',**normal_font)self.t21=fig.text(0.85,0.86,'昨收:',**normal_label_font)self.t22=fig.text(0.85,0.86,f'',**normal_font)fig.canvas.mpl_connect('button_press_event',self.on_press)fig.canvas.mpl_connect('button_release_event',self.on_release)fig.canvas.mpl_connect('motion_notify_event',self.on_motion)fig.canvas.mpl_connect('key_press_event',self.on_key_press)fig.canvas.mpl_connect('scroll_event',self.on_scroll)defrefresh_plot(self,idx_start,idx_range):"""根据最新的参数,重新绘制整个图表"""all_data=self.dataplot_data=all_data.iloc[idx_start:idx_start+idx_range]ap=[]#添加K线图重叠均线,根据均线类型添加移动均线或布林带线ifself.avg_type=='ma':ap.append(mpf.make_addplot(plot_data[['MA5','MA10','MA20','MA60']],ax=self.ax1))elifself.avg_type=='bb':ap.append(mpf.make_addplot(plot_data[['bb-u','bb-m','bb-l']],ax=self.ax1))#添加指标,根据指标类型添加MACD或RSI或DEMAifself.indicator=='macd':ap.append(mpf.make_addplot(plot_data[['macd-m','macd-s']],ylabel='macd',ax=self.ax3))bar_r=np.where(plot_data['macd-h']>0,plot_data['macd-h'],0)bar_g=np.where(plot_data['macd-h']<=0,plot_data['macd-h'],0)ap.append(mpf.make_addplot(bar_r,type='bar',color='red',ax=self.ax3))ap.append(mpf.make_addplot(bar_g,type='bar',color='green',ax=self.ax3))elifself.indicator=='rsi':ap.append(mpf.make_addplot([75]*len(plot_data),color=(0.75,0.6,0.6),ax=self.ax3))ap.append(mpf.make_addplot([30]*len(plot_data),color=(0.6,0.75,0.6),ax=self.ax3))ap.append(mpf.make_addplot(plot_data['rsi'],ylabel='rsi',ax=self.ax3))else:#indicator=='dema'ap.append(mpf.make_addplot(plot_data['dema'],ylabel='dema',ax=self.ax3))#绘制图表mpf.plot(plot_data,ax=self.ax1,volume=self.ax2,addplot=ap,type='candle',style=self.style,datetime_format='%Y-%m',xrotation=0)print("show")plt.draw()plt.show()defrefresh_texts(self,display_data):"""更新K线图上的价格文本"""#display_data是一个交易日内的所有数据,将这些数据分别填入figure对象上的文本中self.t3.set_text(f'{np.round(display_data["open"],3)}/{np.round(display_data["close"],3)}')self.t4.set_text(f'{np.round(display_data["change"],3)}')self.t5.set_text(f'[{np.round(display_data["pct_chg"],3)}%]')self.t6.set_text(f'{display_.date()}')self.t8.set_text(f'{np.round(display_data["high"],3)}')self.t10.set_text(f'{np.round(display_data["low"],3)}')self.t12.set_text(f'{np.round(display_data["vol"]/10000,3)}')#self.t14.set_text(f'{display_data["value"]}')#self.t16.set_text(f'{np.round(display_data["upper_lim"],3)}')#self.t18.set_text(f'{np.round(display_data["lower_lim"],3)}')#self.t20.set_text(f'{np.round(display_data["average"],3)}')#self.t22.set_text(f'{np.round(display_data["last_close"],3)}')#根据本交易日的价格变动值确定开盘价、收盘价的显示颜色ifdisplay_data['change']>0:#如果今日变动额大于0,即今天价格高于昨天,今天价格显示为红色close_number_color='red'elifdisplay_data['change']<0:#如果今日变动额小于0,即今天价格低于昨天,今天价格显示为绿色close_number_color='green'else:close_number_color='black'self.t3.set_color(close_number_color)self.t4.set_color(close_number_color)self.t5.set_color(close_number_color)defon_press(self,event):ifnot(event.inaxes==self.ax1)and(notevent.inaxes==self.ax3):returnifevent.button!=1:returnself.pressed=Trueself.xpress=event.xdata#切换当前ma类型,在ma、bb、none之间循环ifevent.inaxes==self.ax1andevent.dblclick==1:ifself.avg_type=='ma':self.avg_type='bb'elifself.avg_type=='bb':self.avg_type='none'else:self.avg_type='ma'#切换当前indicator类型,在macd/dma/rsi/kdj之间循环ifevent.inaxes==self.ax3andevent.dblclick==1:ifself.indicator=='macd':self.indicator='dma'elifself.indicator=='dma':self.indicator='rsi'elifself.indicator=='rsi':self.indicator='kdj'else:self.indicator='macd'self.ax1.clear()self.ax2.clear()self.ax3.clear()self.refresh_plot(self.idx_start,self.idx_range)defon_release(self,event):self.pressed=Falsedx=int(event.xdata-self.xpress)self.idx_start-=dxifself.idx_start<=0:self.idx_start=0ifself.idx_start>=len(self.data)-100:self.idx_start=len(self.data)-100defon_motion(self,event):ifnotself.pressed:returnifnotevent.inaxes==self.ax1:returndx=int(event.xdata-self.xpress)new_start=self.idx_start-dx#设定平移的左右界限,如果平移后超出界限,则不再平移ifnew_start<=0:new_start=0ifnew_start>=len(self.data)-100:new_start=len(self.data)-100self.ax1.clear()self.ax2.clear()self.ax3.clear()self.refresh_texts(self.data.iloc[new_start])self.refresh_plot(new_start,self.idx_range)defon_scroll(self,event):#仅当鼠标滚轮在axes1范围内滚动时起作用scale_factor=1.0ifevent.inaxes!=self.ax1:returnifevent.button=='down':#缩小20%显示范围scale_factor=0.8ifevent.button=='up':#放大20%显示范围scale_factor=1.2#设置K线的显示范围大小self.idx_range=int(self.idx_range*scale_factor
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 指纹识别技术在移动支付领域的应用分析报告(2025年)
- 注塑主管目标责任协议书
- 银行促销活动协议书模板
- 自建房私下协议买卖合同
- 注册一家新公司合同范本
- 电信放弃安装协议书范本
- 瑜伽馆员工离职合同范本
- 水管道安装维修合同范本
- 防疫合同协议书模板模板
- 码头合作转让协议书模板
- 2025江西德安万年青环保有限公司市场部区域经理招聘4人笔试历年参考题库附带答案详解
- 怀特海《教育的目的》读书分享
- 2025年校长职级考试题及答案
- 统借统还资金管理办法
- 国家能源集团采购管理规定及实施办法知识试卷
- 2024年广州市南沙区社区专职招聘考试真题
- 山东医药技师学院招聘笔试真题2024
- 仓库超期物料管理制度
- DZ∕T 0289-2015 区域生态地球化学评价规范(正式版)
- 2022年养殖场动物疫情报告制度
- 贵港市国有建设用地改变土地使用条件方案
评论
0/150
提交评论