时间序列预测淘米股票:假如不退市几日内的股价变化


篇前话语:
1.作者专业知识水平有限,如有不足还请各位大佬多多包涵,文章内容仅供参考(应该会特别水,所以就当是写着玩了吧)。
2.原本打算要做视频的,但是因为实在是太忙了,马上就开学了,所以视频就咕了吧(毕竟我是个帅鸽)。
3.没啥好说的,就祝大家开学快乐吧(然而我并没有作业)。
基本信息:
放一张淘米公司股票(TAOM美股)的股价图。我们平时最常见的就是这种红红绿绿的K线
图。这种图包含了股票的开盘价、收盘价、最高价、最低价,是最精华、最好用的股价图表之一。

关于K线图的颜色:在中国,红色代表上涨,绿色代表下跌;而在美国,绿色代表上涨,红色代表下跌。淘米公司是在美国上市的,因此K线图的画法就要用美国的标准咯。

至于为什么美国和中国用相反的颜色来表示股价的涨跌呢?这就是东西方文化的差异了。在西方,红色代表“赤字”,意为财政亏本,因此用来表示下跌;而绿色是红色的相反色,自然表示上涨。在中国,红色代表吉祥喜庆,因此用来表示上涨;而绿色嘛,你们自己体会咯。


上海淘米网络科技有限公司,目前(2019年8月)的股权占比是这样的。淘米公司注册资金为1000万元,其中曾李青认缴金额为300万元,占比30%,是这6为股东中占比最大的,因此他也就是现在淘米公司的实际控制人。

淘米网 NYSE:TAOM
上市时间 2011年6月9日
开盘价格 8.49美元
收盘价格 8.23美元
退市时间 2016年6月22日
开盘价格 3.67美元
收盘价格 3.70美元
话说,你有没有想过在2011年到2016年之间当一下淘米公司的小股东呢?
2011年6月,美元兑人民币汇率约为6.4900元/美元;2016年6月,美元兑人民币汇率约为6.6500元/美元。2011年6月09日,TAMO(美股)收盘价为8.2300美元;2016年6月22日,TAMO(美股)收盘价为3.7000美元。
假设一直要做淘米公司的小股东,且以日收盘价为买卖价格,从上市一直持有10手(1000股)股票到退市。
2011年6月9日,买入1000股花费1000×6.49×8.2300=53412.7000元;2016年6月22日,卖出1000股收入1000×6.65×3.7000=24605.0000元。
时间近似5年,将2016年6月22日的收入按照无风险利率1.5%以连续复利进行贴现,贴现到今日(2011年6月9日)得24605.0000×EXP(-5×1.5%)=22827.1285元。(为什么要贴现呢?因为我们普遍认为未来的钱更便宜,现在的钱更贵,把现在的钱存在银行里还能到未来收利息。)
那么5年来,持有10手股票,一直做淘米公司的小股东,假设不考虑分红,你会盈利22827.1285-53412.7000 = -30586.5715元。
正文开始:
利用时间序列预测淘米公司股票(TAOM美股)
假如不退市,之后几日的股价变化
编程语言 Python3
操作环境 Jupiter Notebook;Google Chrome
In [1]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.stats.diagnostic as dia
import statsmodels.api as sm
import arch.unitroot as arc
import warnings
warnings.filterwarnings('ignore')
【备注】 某些警告输出没有卵用,而且还特别烦人,于是无视掉它。
In [2]:
#导入数据并预览
data=pd.read_excel('TAOM.xlsx')
data.head(10)
Out [2]:

【备注】 此处的数据是在万矿平台通过API接口从Wind数据库获取的,在研究平台输出结果,之后复制到Excel表格,稍作处理,研究平台代码请见附件内容。
In [3]:
#绘制收盘价图像,了解大体走势
Clsprc=data['收盘价']
Date=data['日期']
plt.figure(figsize=(20,8))
plt.plot(Date,Clsprc)
plt.title('Clsprc')
plt.show()
Out [3]:

【备注】 发现收盘价序列整体有下降趋势,初步判断序列不平稳。
In [4]:
#对收盘价序列进行白噪声检验
print(dia.acorr_ljungbox(Clsprc, lags=1)[1])
Out [4]:
[1.08612937e-272]
【备注】 P值小于0.05,拒绝原假设,认为收盘价序列不是白噪声序列,因此可以用来做分析。
In [5]:
#绘制自相关系数图与偏自相关系数图,继续判断平稳性
fig=plt.figure(figsize=(10,8))
ax1=fig.add_subplot(211)
fig=sm.graphics.tsa.plot_acf(data['收盘价'],lags=20,ax=ax1)
ax1.xaxis.set_ticks_position('bottom')
fig.tight_layout()
ax2=fig.add_subplot(212)
fig=sm.graphics.tsa.plot_pacf(data['收盘价'],lags=20,ax=ax2)
ax1.xaxis.set_ticks_position('bottom')
fig.tight_layout()
plt.show()
Out [5]:

【备注】 从自相关系数图可以看到,自相关系数收敛不明显,序列非平稳,需要进行差分处理。
In [6]:
#将收盘价序列进行差分
data['收盘价差分']=data['收盘价'].diff(1)
ClsprcDiff=data['收盘价差分'].loc[1:]
In [7]:
#使用ADF检验对差分后的序列进行平稳性检测
arc.ADF(ClsprcDiff)
Out [7]:

【备注】 P值小于0.05,拒绝原假设,认为收盘价差分序列已经平稳了。
In [8]:
#绘制收盘价差分后序列的图像,观察趋势
plt.figure(figsize=(20,8))
plt.plot(Date.loc[1:],ClsprcDiff)
plt.title('ClsprcDiff')
plt.show()
Out [8]:

【备注】 序列围绕均值0上下波动,大体可以认为序列已经平稳了,但是不同阶段波动不一,可能存在异方差,这里为了简单,就直接忽略异方差了,当然模型拟合的结果也仅供参考。
In [9]:
#对收盘价差分序列进行白噪声检验
print(dia.acorr_ljungbox(ClsprcDiff, lags=1)[1])
Out [9]:
[1.68554125e-08]
【备注】 P值小于0.05,拒绝原假设,认为收盘价差分序列不是白噪声序列,因此可以用来做分析。
In [10]:
#绘制自相关系数图与偏自相关系数图,继续判断平稳性
fig=plt.figure(figsize=(10,8))
ax1=fig.add_subplot(211)
fig=sm.graphics.tsa.plot_acf(ClsprcDiff,lags=20,ax=ax1)
ax1.xaxis.set_ticks_position('bottom')
fig.tight_layout()
ax2=fig.add_subplot(212)
fig=sm.graphics.tsa.plot_pacf(ClsprcDiff.loc[1:],lags=20,ax=ax2)
ax1.xaxis.set_ticks_position('bottom')
fig.tight_layout()
plt.show()
Out [10]:

【备注】 从图可以看到,自相关系数与偏自相关系数收敛迅速,序列已经平稳,可以进行模型拟合了。
In [11]:
#依据BIC准则拟合ARMA模型
results=sm.tsa.arma_order_select_ic(ClsprcDiff,ic=['aic','bic'],max_ar=3,max_ma=3)
results['bic_min_order']
Out [11]:
(1, 0)
【备注】 参数估计完毕,p=1,q=0,收盘价一阶差分序列是ARMA(1,0)模型,即AR(1)模型。
In [12]:
#对拟合后模型的残差进行白噪声检验
model=sm.tsa.ARMA(ClsprcDiff,order=(1,0))
result=model.fit()
resid=result.resid
predict=result.predict(start=1,end=1267)
print(dia.acorr_ljungbox(resid, lags=1)[1])
Out [12]:
[0.64717705]
【备注】 P值大于0.05,接受原假设,认为收盘价差分序列的残差序列是白噪声序列,因此收盘价差分序列已经提取了全部有用的信息,不再需要进行模型调整。
In [13]:
#预测数值,对收盘价差分序列进行预测
predict=result.predict(start=1267,end=1367)
fig,ax=plt.subplots()
ax=ClsprcDiff.plot(ax=ax)
predict.plot(ax=ax)
plt.show()
Out [13]:

【备注】 图中红色的部分就是预测的数值了,这里我们只预测之后的100个交易日,毕竟时间序列分析只适合短期预测。
In [14]:
#使用预测的差分序列,根据累加值还原收盘价序列
for i in np.arange(100):
Clsprc[1268+i]=(Clsprc[1267]+predict.cumsum()[1268+i])
In [15]:
#绘制预测后的图像
plt.plot(np.arange(0,1267),Clsprc.values[0:1267])
plt.plot(np.arange(1266,1367),Clsprc.values[1266:1367])
plt.show()
Out [15]:

【备注】 预测的大体趋势,股价还是要下降的。
In [16]:
#截取一小段,放大看一下
plt.plot(np.arange(1217,1267),Clsprc.values[1217:1267])
plt.plot(np.arange(1266,1287),Clsprc.values[1266:1287])
plt.show()

【备注】 放大之后可以看清,预测之后股价可能会有回升,但随后便是下降。
【总结】本次根据淘米公司5年的股票收盘价进行数据预测,主要预测的是,假如淘米不退市,之后几天内股价的变化。模型拟合结果是AR(1)模型,预测结果是股价稍有回升接着变回下跌。为了方便,并没有考虑异方差因素,因此一定会存在偏差,仅供参考。
附件内容:
获取数据的代码
#导入函数库
from WindPy import *
import pandas as pd
#获取TAOM股票的数据
w.start()
data=w.wsd("TAOM.N", "open,high,low,close,volume", "2011-06-09", "2019-06-22", "TradingCalendar=NYSE", usedf=True)
#显示所有列与行
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)
pd.DataFrame(data.Data,index=["开盘价","收盘价","最高价","最低价","成交量"],columns=data.Times).T
绘制K线图的代码
#导入函数库
from matplotlib import pyplot as plt
import mpl_finance as mpf
from matplotlib.pylab import date2num
import pandas as pd
import datetime
#读取数据
quotes = []
stock = pd.read_excel('E:/TAOM.xlsx')
#处理数据
for row in range(1268):
if row == 0:
sdate = str(stock.loc[row,'日期']).replace(' ','').replace('00:00:00','')
sdate_num = date2num(datetime.datetime.strptime(sdate,'%Y-%m-%d'))
sdate_plt = sdate_num
else:
sdate_plt = sdate_num + row
sopen = stock.loc[row,'开盘价']
shigh = stock.loc[row,'最高价']
slow = stock.loc[row,'最低价']
sclose = stock.loc[row,'收盘价']
datas = (sdate_plt,sopen,shigh,slow,sclose)
quotes.append(datas)
#绘制图像
fig, ax = plt.subplots(figsize=(12,8))
fig.subplots_adjust(bottom=0.1)
ax.xaxis_date()
plt.xticks(rotation=45)
plt.rcParams['font.sans-serif']='SimHei'
plt.title('TAOM美股')
plt.xlabel('time')
plt.ylabel('price')
mpf.candlestick_ohlc(ax,quotes,width=0.7,colorup='g',colordown='r')
plt.show()
绘制股权占比饼图的代码
#导入函数库
import matplotlib.pyplot as plt
#绘制图像
plt.rcParams['font.sans-serif']='SimHei'
plt.rcParams['font.size']=14
label=['曾李青','汪海兵','魏震','程云鹏','王滨','冯玉亮']
values=[300,237.5,173.75,157.5,81.25,50]
plt.pie(values,labels=label,autopct='%1.3f%%')
plt.title('上海淘米网络科技有限公司股权占比')
plt.show()
篇尾话语:
感谢你打开了这篇无聊的文章,还能坚持看到这里,谢谢。
最后,祝你生活愉快。