欢迎光临散文网 会员登陆 & 注册

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

2019-08-31 11:13 作者:摸鱼的橙汁  | 我要投稿



篇前话语:

1.作者专业知识水平有限,如有不足还请各位大佬多多包涵,文章内容仅供参考(应该会特别水,所以就当是写着玩了吧)。

2.原本打算要做视频的,但是因为实在是太忙了,马上就开学了,所以视频就咕了吧(毕竟我是个帅鸽)。

3.没啥好说的,就祝大家开学快乐吧(然而我并没有作业)。


基本信息:

放一张淘米公司股票(TAOM美股)的股价图。我们平时最常见的就是这种红红绿绿的K线

图。这种图包含了股票的开盘价、收盘价、最高价、最低价,是最精华、最好用的股价图表之一。

TAOM(美股)K线图

关于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()


篇尾话语:

感谢你打开了这篇无聊的文章,还能坚持看到这里,谢谢。

最后,祝你生活愉快。


时间序列预测淘米股票:假如不退市几日内的股价变化的评论 (共 条)

分享到微博请遵守国家法律