時(shí)間序列預(yù)測(cè)淘米股票:假如不退市幾日內(nèi)的股價(jià)變化


篇前話語(yǔ):
1.作者專業(yè)知識(shí)水平有限,如有不足還請(qǐng)各位大佬多多包涵,文章內(nèi)容僅供參考(應(yīng)該會(huì)特別水,所以就當(dāng)是寫著玩了吧)。
2.原本打算要做視頻的,但是因?yàn)閷?shí)在是太忙了,馬上就開(kāi)學(xué)了,所以視頻就咕了吧(畢竟我是個(gè)帥鴿)。
3.沒(méi)啥好說(shuō)的,就祝大家開(kāi)學(xué)快樂(lè)吧(然而我并沒(méi)有作業(yè))。
基本信息:
放一張?zhí)悦坠竟善保═AOM美股)的股價(jià)圖。我們平時(shí)最常見(jiàn)的就是這種紅紅綠綠的K線
圖。這種圖包含了股票的開(kāi)盤價(jià)、收盤價(jià)、最高價(jià)、最低價(jià),是最精華、最好用的股價(jià)圖表之一。

關(guān)于K線圖的顏色:在中國(guó),紅色代表上漲,綠色代表下跌;而在美國(guó),綠色代表上漲,紅色代表下跌。淘米公司是在美國(guó)上市的,因此K線圖的畫(huà)法就要用美國(guó)的標(biāo)準(zhǔn)咯。

至于為什么美國(guó)和中國(guó)用相反的顏色來(lái)表示股價(jià)的漲跌呢?這就是東西方文化的差異了。在西方,紅色代表“赤字”,意為財(cái)政虧本,因此用來(lái)表示下跌;而綠色是紅色的相反色,自然表示上漲。在中國(guó),紅色代表吉祥喜慶,因此用來(lái)表示上漲;而綠色嘛,你們自己體會(huì)咯。


上海淘米網(wǎng)絡(luò)科技有限公司,目前(2019年8月)的股權(quán)占比是這樣的。淘米公司注冊(cè)資金為1000萬(wàn)元,其中曾李青認(rèn)繳金額為300萬(wàn)元,占比30%,是這6為股東中占比最大的,因此他也就是現(xiàn)在淘米公司的實(shí)際控制人。

淘米網(wǎng) NYSE:TAOM
上市時(shí)間??2011年6月9日
開(kāi)盤價(jià)格??8.49美元
收盤價(jià)格??8.23美元
退市時(shí)間??2016年6月22日
開(kāi)盤價(jià)格??3.67美元
收盤價(jià)格??3.70美元
話說(shuō),你有沒(méi)有想過(guò)在2011年到2016年之間當(dāng)一下淘米公司的小股東呢?
2011年6月,美元兌人民幣匯率約為6.4900元/美元;2016年6月,美元兌人民幣匯率約為6.6500元/美元。2011年6月09日,TAMO(美股)收盤價(jià)為8.2300美元;2016年6月22日,TAMO(美股)收盤價(jià)為3.7000美元。
假設(shè)一直要做淘米公司的小股東,且以日收盤價(jià)為買賣價(jià)格,從上市一直持有10手(1000股)股票到退市。
2011年6月9日,買入1000股花費(fèi)1000×6.49×8.2300=53412.7000元;2016年6月22日,賣出1000股收入1000×6.65×3.7000=24605.0000元。
時(shí)間近似5年,將2016年6月22日的收入按照無(wú)風(fēng)險(xiǎn)利率1.5%以連續(xù)復(fù)利進(jìn)行貼現(xiàn),貼現(xiàn)到今日(2011年6月9日)得24605.0000×EXP(-5×1.5%)=22827.1285元。(為什么要貼現(xiàn)呢?因?yàn)槲覀兤毡檎J(rèn)為未來(lái)的錢更便宜,現(xiàn)在的錢更貴,把現(xiàn)在的錢存在銀行里還能到未來(lái)收利息。)
那么5年來(lái),持有10手股票,一直做淘米公司的小股東,假設(shè)不考慮分紅,你會(huì)盈利22827.1285-53412.7000 =?-30586.5715元。
正文開(kāi)始:
利用時(shí)間序列預(yù)測(cè)淘米公司股票(TAOM美股)
假如不退市,之后幾日的股價(jià)變化
編程語(yǔ)言? Python3
操作環(huán)境? 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')
【備注】 某些警告輸出沒(méi)有卵用,而且還特別煩人,于是無(wú)視掉它。
In??[2]:
#導(dǎo)入數(shù)據(jù)并預(yù)覽
data=pd.read_excel('TAOM.xlsx')
data.head(10)
Out??[2]:

【備注】 此處的數(shù)據(jù)是在萬(wàn)礦平臺(tái)通過(guò)API接口從Wind數(shù)據(jù)庫(kù)獲取的,在研究平臺(tái)輸出結(jié)果,之后復(fù)制到Excel表格,稍作處理,研究平臺(tái)代碼請(qǐng)見(jiàn)附件內(nèi)容。
In??[3]:
#繪制收盤價(jià)圖像,了解大體走勢(shì)
Clsprc=data['收盤價(jià)']
Date=data['日期']
plt.figure(figsize=(20,8))
plt.plot(Date,Clsprc)
plt.title('Clsprc')
plt.show()
Out??[3]:

【備注】 發(fā)現(xiàn)收盤價(jià)序列整體有下降趨勢(shì),初步判斷序列不平穩(wěn)。
In??[4]:
#對(duì)收盤價(jià)序列進(jìn)行白噪聲檢驗(yàn)
print(dia.acorr_ljungbox(Clsprc, lags=1)[1])
Out??[4]:
[1.08612937e-272]
【備注】 P值小于0.05,拒絕原假設(shè),認(rèn)為收盤價(jià)序列不是白噪聲序列,因此可以用來(lái)做分析。
In??[5]:
#繪制自相關(guān)系數(shù)圖與偏自相關(guān)系數(shù)圖,繼續(xù)判斷平穩(wěn)性
fig=plt.figure(figsize=(10,8))
ax1=fig.add_subplot(211)
fig=sm.graphics.tsa.plot_acf(data['收盤價(jià)'],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['收盤價(jià)'],lags=20,ax=ax2)
ax1.xaxis.set_ticks_position('bottom')
fig.tight_layout()
plt.show()
Out??[5]:

【備注】 從自相關(guān)系數(shù)圖可以看到,自相關(guān)系數(shù)收斂不明顯,序列非平穩(wěn),需要進(jìn)行差分處理。
In??[6]:
#將收盤價(jià)序列進(jìn)行差分
data['收盤價(jià)差分']=data['收盤價(jià)'].diff(1)
ClsprcDiff=data['收盤價(jià)差分'].loc[1:]
In??[7]:
#使用ADF檢驗(yàn)對(duì)差分后的序列進(jìn)行平穩(wěn)性檢測(cè)
arc.ADF(ClsprcDiff)
Out??[7]:

【備注】 P值小于0.05,拒絕原假設(shè),認(rèn)為收盤價(jià)差分序列已經(jīng)平穩(wěn)了。
In??[8]:
#繪制收盤價(jià)差分后序列的圖像,觀察趨勢(shì)
plt.figure(figsize=(20,8))
plt.plot(Date.loc[1:],ClsprcDiff)
plt.title('ClsprcDiff')
plt.show()
Out??[8]:

【備注】 序列圍繞均值0上下波動(dòng),大體可以認(rèn)為序列已經(jīng)平穩(wěn)了,但是不同階段波動(dòng)不一,可能存在異方差,這里為了簡(jiǎn)單,就直接忽略異方差了,當(dāng)然模型擬合的結(jié)果也僅供參考。
In??[9]:
#對(duì)收盤價(jià)差分序列進(jìn)行白噪聲檢驗(yàn)
print(dia.acorr_ljungbox(ClsprcDiff, lags=1)[1])
Out??[9]:
[1.68554125e-08]
【備注】 P值小于0.05,拒絕原假設(shè),認(rèn)為收盤價(jià)差分序列不是白噪聲序列,因此可以用來(lái)做分析。
In??[10]:
#繪制自相關(guān)系數(shù)圖與偏自相關(guān)系數(shù)圖,繼續(xù)判斷平穩(wěn)性
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]:

【備注】 從圖可以看到,自相關(guān)系數(shù)與偏自相關(guān)系數(shù)收斂迅速,序列已經(jīng)平穩(wěn),可以進(jìn)行模型擬合了。
In??[11]:
#依據(jù)BIC準(zhǔn)則擬合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)
【備注】 參數(shù)估計(jì)完畢,p=1,q=0,收盤價(jià)一階差分序列是ARMA(1,0)模型,即AR(1)模型。
In??[12]:
#對(duì)擬合后模型的殘差進(jìn)行白噪聲檢驗(yàn)
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,接受原假設(shè),認(rèn)為收盤價(jià)差分序列的殘差序列是白噪聲序列,因此收盤價(jià)差分序列已經(jīng)提取了全部有用的信息,不再需要進(jìn)行模型調(diào)整。
In??[13]:
#預(yù)測(cè)數(shù)值,對(duì)收盤價(jià)差分序列進(jìn)行預(yù)測(cè)
predict=result.predict(start=1267,end=1367)
fig,ax=plt.subplots()
ax=ClsprcDiff.plot(ax=ax)
predict.plot(ax=ax)
plt.show()
Out??[13]:

【備注】 圖中紅色的部分就是預(yù)測(cè)的數(shù)值了,這里我們只預(yù)測(cè)之后的100個(gè)交易日,畢竟時(shí)間序列分析只適合短期預(yù)測(cè)。
In??[14]:
#使用預(yù)測(cè)的差分序列,根據(jù)累加值還原收盤價(jià)序列
for i in np.arange(100):
? ? Clsprc[1268+i]=(Clsprc[1267]+predict.cumsum()[1268+i])
In??[15]:
#繪制預(yù)測(cè)后的圖像
plt.plot(np.arange(0,1267),Clsprc.values[0:1267])
plt.plot(np.arange(1266,1367),Clsprc.values[1266:1367])
plt.show()
Out??[15]:

【備注】 預(yù)測(cè)的大體趨勢(shì),股價(jià)還是要下降的。
In??[16]:
#截取一小段,放大看一下
plt.plot(np.arange(1217,1267),Clsprc.values[1217:1267])
plt.plot(np.arange(1266,1287),Clsprc.values[1266:1287])
plt.show()

【備注】 放大之后可以看清,預(yù)測(cè)之后股價(jià)可能會(huì)有回升,但隨后便是下降。
【總結(jié)】本次根據(jù)淘米公司5年的股票收盤價(jià)進(jìn)行數(shù)據(jù)預(yù)測(cè),主要預(yù)測(cè)的是,假如淘米不退市,之后幾天內(nèi)股價(jià)的變化。模型擬合結(jié)果是AR(1)模型,預(yù)測(cè)結(jié)果是股價(jià)稍有回升接著變回下跌。為了方便,并沒(méi)有考慮異方差因素,因此一定會(huì)存在偏差,僅供參考。
附件內(nèi)容:
獲取數(shù)據(jù)的代碼
#導(dǎo)入函數(shù)庫(kù)
from?WindPy?import?*
import?pandas?as?pd
#獲取TAOM股票的數(shù)據(jù)
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=["開(kāi)盤價(jià)","收盤價(jià)","最高價(jià)","最低價(jià)","成交量"],columns=data.Times).T
繪制K線圖的代碼
#導(dǎo)入函數(shù)庫(kù)
from matplotlib import pyplot as plt
import mpl_finance as mpf
from matplotlib.pylab import date2num
import pandas as pd
import datetime
#讀取數(shù)據(jù)
quotes = []
stock = pd.read_excel('E:/TAOM.xlsx')
#處理數(shù)據(jù)
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,'開(kāi)盤價(jià)']
? ? shigh = stock.loc[row,'最高價(jià)']
? ? slow = stock.loc[row,'最低價(jià)']
? ? sclose = stock.loc[row,'收盤價(jià)']
? ? 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()
繪制股權(quán)占比餅圖的代碼
#導(dǎo)入函數(shù)庫(kù)
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('上海淘米網(wǎng)絡(luò)科技有限公司股權(quán)占比')
plt.show()
篇尾話語(yǔ):
感謝你打開(kāi)了這篇無(wú)聊的文章,還能堅(jiān)持看到這里,謝謝。
最后,祝你生活愉快。