1 前言
某天,我的一個(gè)朋友告訴我說,實(shí)現(xiàn)經(jīng)濟(jì)自由的關(guān)鍵是股票投資。雖然這是市場(chǎng)繁榮時(shí)期的真理,但如今業(yè)余交易股票仍然是一個(gè)有吸引力的選擇。由于在線交易平臺(tái)的便利性,涌現(xiàn)了許多自主價(jià)值投資者或家庭主婦交易員。甚至還有一些成功的故事和廣告吹噓有“快速致富計(jì)劃”學(xué)習(xí)如何投資回報(bào)率高達(dá) 40% 甚至更高的股票。投資已成為當(dāng)今職場(chǎng)人士的福音。
現(xiàn)在的問題是:哪些股票?如何分析股票?與其他股票相比,所選股票的回報(bào)和風(fēng)險(xiǎn)是什么?
本文的目標(biāo)是讓你了解使用快速簡(jiǎn)單的 Python 代碼分析股票的一種方法。只需花 12 分鐘閱讀這篇文章——最好自己完成一下。然后你就可以快速瀏覽到你的第一份金融分析報(bào)告。
為了開始學(xué)習(xí)和分析股票,我們將從快速查看歷史股票價(jià)格開始。這將通過從 Pandas 網(wǎng)絡(luò)數(shù)據(jù)閱讀器和雅虎財(cái)經(jīng)中提取最新的股票數(shù)據(jù)來實(shí)現(xiàn)。然后,我們將嘗試通過探索性分析,如相關(guān)性熱圖、Matplotlib 可視化以及使用線性分析和k最近鄰(K Nearest Neighbor,KNN)的預(yù)測(cè)分析來查看數(shù)據(jù)。
在此推薦小編創(chuàng)建的Python學(xué)習(xí)交流群:835017344,這里是python學(xué)習(xí)者聚集地,有大牛答疑,有資源共享!有想學(xué)習(xí)python編程的,或是轉(zhuǎn)行,或是大學(xué)生,還有工作中想提升自己能力的,正在學(xué)習(xí)的小伙伴歡迎加入學(xué)習(xí)。
2 加載雅虎財(cái)經(jīng)數(shù)據(jù)集
Pandas 網(wǎng)絡(luò)數(shù)據(jù)閱讀器 (Pandas web data reader)是 Pandas 庫(kù)的一個(gè)擴(kuò)展,用于與大多數(shù)最新的金融數(shù)據(jù)進(jìn)行通信,包括雅虎財(cái)經(jīng)、谷歌財(cái)經(jīng)、Enigma 等資源。
我們將使用以下代碼提取 Apple 的股票價(jià)格:
import pandas as pd
import datetime
import pandas_datareader.data as web
from pandas import Series, DataFrame
start = datetime.datetime(2010, 1, 1)
end = datetime.datetime(2017, 1, 11)
df = web.DataReader("AAPL", 'yahoo', start, end)
df.tail()
來源于雅虎財(cái)經(jīng)的股票價(jià)格
這段代碼將提取從 2010 年 1 月到 2017 年 1 月的 7 年的數(shù)據(jù)。你可以根據(jù)需要調(diào)整開始和結(jié)束日期。接下來的分析過程,我們將使用收盤價(jià)格,即股票在一天交易結(jié)束時(shí)的最終價(jià)格。
3 探索股票的移動(dòng)平均值和收益率
在這個(gè)分析中,我們使用兩個(gè)關(guān)鍵的測(cè)量指標(biāo)來分析股票:移動(dòng)平均值和回報(bào)率。
3.1 移動(dòng)平均值:確定趨勢(shì)
滾動(dòng)平均 / 移動(dòng)平均(MA)通過不斷更新平均價(jià)格來平滑價(jià)格數(shù)據(jù),有助于降低價(jià)格表中的“噪音”。此外,該移動(dòng)平均線可能充當(dāng)“阻力”,代表著股票的下跌和上升趨勢(shì),你可以從中預(yù)期它的未來趨勢(shì),不太可能偏離阻力點(diǎn)。
讓我們開始寫代碼來得到滾動(dòng)平均值:
close_px = df['Adj Close']
mavg = close_px.rolling(window=100).mean()
最后 10 個(gè)移動(dòng)平均值
這將計(jì)算股票收盤價(jià)最后 100 個(gè)滑窗(100天)的移動(dòng)平均值,并取每個(gè)滑窗的移動(dòng)平均值。正如你所看到的,移動(dòng)平均線在滑窗上穩(wěn)步上升,并不遵循股票價(jià)格曲線的鋸齒線。為了更好地理解,讓我們用 Matplotlib 來繪制它。我們將用移動(dòng)平均線來繪制股票價(jià)格表。
%matplotlib inline
import matplotlib.pyplot as plt
from matplotlib import style
Adjusting the size of matplotlib
import matplotlib as mpl
mpl.rc('figure', figsize=(8, 7))mpl. version
Adjusting the style of matplotlib
style.use('ggplot')
close_px.plot(label='AAPL')
mavg.plot(label='mavg')
plt.legend()
蘋果股票移動(dòng)平均價(jià)格(mavg)
移動(dòng)平均使曲線平滑,顯示股票價(jià)格的漲跌趨勢(shì)。
在這張圖表中,移動(dòng)平均線顯示了股票價(jià)格上升或下降的趨勢(shì)。從邏輯上講,你應(yīng)該在股市低迷時(shí)買進(jìn),在股市上漲時(shí)賣出。
3.2 回報(bào)偏差:用于確定風(fēng)險(xiǎn)和收益
預(yù)期收益衡量投資收益概率分布的平均值或預(yù)期值。投資組合的預(yù)期回報(bào)是通過將每項(xiàng)資產(chǎn)的權(quán)重乘以其預(yù)期回報(bào),再加上每項(xiàng)投資的價(jià)值來計(jì)算的。(摘自投資百科,investopedia)
你可以參考以下公式:
收益公式
根據(jù)這個(gè)公式,我們可以畫出收益,如下。
rets = close_px / close_px.shift(1) - 1
rets.plot(label='return')
收益率
從邏輯上講,我們理想的股票收益應(yīng)該盡可能高且穩(wěn)定。如果你是風(fēng)險(xiǎn)規(guī)避者(像我一樣),你可能希望避開這種股票,因?yàn)槟憧吹?2013 年下跌了 10%。這個(gè)決定很大程度上取決于你對(duì)股票的總體看法和對(duì)其他競(jìng)爭(zhēng)對(duì)手股票的分析。
4 分析競(jìng)爭(zhēng)對(duì)手股票
在這部分中,我們將分析一家公司相對(duì)于其競(jìng)爭(zhēng)對(duì)手的表現(xiàn)。假設(shè)我們對(duì)科技公司感興趣,并想比較一下這些巨頭:蘋果(Apple)、通用電氣(GE)、谷歌(Google)、IBM 和微軟(Microsoft)。
dfcomp = web.DataReader(['AAPL', 'GE', 'GOOG', 'IBM', 'MSFT'],'yahoo',start=start,end=end)['Adj Close']
蘋果、通用電氣、谷歌、IBM 和微軟的股價(jià)
你將會(huì)從雅虎財(cái)經(jīng)的股票價(jià)格中得到一張相當(dāng)整潔平滑的收盤價(jià)表。
4.1 相關(guān)性分析:競(jìng)爭(zhēng)對(duì)手會(huì)互相影響嗎?
我們可以通過運(yùn)行 pandas 的百分比變化和相關(guān)函數(shù)來分析競(jìng)爭(zhēng)關(guān)系。百分比變化將定義收益 ,找出與前一天相比價(jià)格變化的程度。了解相關(guān)性將有助于我們理解收益是否受其他股票收益的影響。
retscomp = dfcomp.pct_change()
corr = retscomp.corr()
讓我們繪制散點(diǎn)圖來觀察 Apple 和 GE 的收益分布。
plt.scatter(retscomp.AAPL, retscomp.GE)
plt.xlabel('Returns AAPL')
plt.ylabel('Returns GE')
Apple 和 GE 的散點(diǎn)圖
我們可以看到,GE 的收益和 Apple 的收益之間存在著微弱的正相關(guān)關(guān)系。似乎在大多數(shù)情況下, Apple 的回報(bào)率越高,GE 的回報(bào)率也就越高。
讓我們通過繪制散點(diǎn)矩陣進(jìn)一步改進(jìn)我們的分析,以可視化競(jìng)爭(zhēng)股票之間可能的相關(guān)性。在對(duì)角點(diǎn),我們將運(yùn)行核密度估計(jì)(Kernel Density Estimate,KDE)。KDE 是一個(gè)基本的數(shù)據(jù)平滑問題,它基于有限的數(shù)據(jù)樣本對(duì)總體進(jìn)行推斷。它有助于生成對(duì)總體分布的估計(jì)。
pd.scatter_matrix(retscomp, diagonal='kde', figsize=(10, 10))
KDE 圖和散點(diǎn)矩陣
從這里我們可以得到大多數(shù)股票之間的分布近似正相關(guān)。
為了證明正相關(guān)關(guān)系,我們將使用熱圖來可視化競(jìng)爭(zhēng)股票之間的相關(guān)程度。注意顏色越淺代表這兩只股票的相關(guān)性越強(qiáng)。
plt.imshow(corr, cmap='hot', interpolation='none')
plt.colorbar()
plt.xticks(range(len(corr)), corr.columns)
plt.yticks(range(len(corr)), corr.columns)
競(jìng)爭(zhēng)股票之間相關(guān)性的熱圖
從散點(diǎn)矩陣和熱圖中我們可以發(fā)現(xiàn),競(jìng)爭(zhēng)股票之間有很大的相關(guān)性。然而,這可能并不能說明因果關(guān)系,只能說明科技行業(yè)的趨勢(shì)而不能說明相互競(jìng)爭(zhēng)的股票是如何相互影響的。
4.2 股票回報(bào)率和風(fēng)險(xiǎn)
除了相關(guān)性,我們還分析了每支股票的風(fēng)險(xiǎn)和回報(bào)。本例中我們提取的是回報(bào)的平均值(回報(bào)率)和回報(bào)的標(biāo)準(zhǔn)差(風(fēng)險(xiǎn))。
plt.scatter(retscomp.mean(), retscomp.std())
plt.xlabel('Expected returns')
plt.ylabel('Risk')
for label, x, y in zip(retscomp.columns, retscomp.mean(), retscomp.std()):
plt.annotate(label,xy = (x, y), xytext = (20, -20), textcoords = 'offset points', ha = 'right', va = 'bottom',
bbox = dict(boxstyle = 'round,pad=0.5', fc = 'yellow', alpha = 0.5),
arrowprops = dict(arrowstyle = '->', connectionstyle = 'arc3,rad=0'))
股票風(fēng)險(xiǎn)與收益的快速散點(diǎn)圖
現(xiàn)在你可以看到這張關(guān)于競(jìng)爭(zhēng)股票的風(fēng)險(xiǎn)和收益比較的清晰的圖表。從邏輯上講,你想要將風(fēng)險(xiǎn)最小化,并使收益最大化。因此,您需要為您的風(fēng)險(xiǎn)回報(bào)容忍度畫一條線(紅線)。然后,你將創(chuàng)建規(guī)則——購(gòu)買紅線以下的股票(微軟、通用電氣和 IBM),賣出紅線以上的股票(蘋果和谷歌)。這條紅線顯示了您的期望值閾值和買進(jìn)/賣出決策的基線。
5 預(yù)測(cè)股票價(jià)格
5.1 特征工程
我們將使用這三個(gè)機(jī)器學(xué)習(xí)模型來預(yù)測(cè)股票:簡(jiǎn)單線性分析、二次判別分析(Quadratic Discriminant Analysis,QDA)和 K近鄰(K Nearest Neighbor,KNN)。但首先我們需要設(shè)計(jì)一些特征:高-低百分比和百分比變化。
dfreg = df.loc[:,['Adj Close','Volume']]
dfreg['HL_PCT'] = (df['High'] — df['Low']) / df['Close'] * 100.0
dfreg['PCT_change'] = (df['Close'] — df['Open']) / df['Open'] * 100.0
生成的最終數(shù)據(jù)幀
5.2 預(yù)處理和交叉驗(yàn)證
在將數(shù)據(jù)放入預(yù)測(cè)模型之前,我們將按照以下步驟對(duì)數(shù)據(jù)進(jìn)行清洗和處理:
1.刪除缺失值
2.分離標(biāo)簽,我們要預(yù)測(cè) Adjclose
3.縮放 X ,使每個(gè)樣本都可以具有相同的線性回歸分布。
4.最后,我們要找到近期 X 和早期 X (用于訓(xùn)練)的數(shù)據(jù)序列,用于模型生成和評(píng)估。
5.分離標(biāo)簽并標(biāo)識(shí)為 Y。
6.分別通過交叉驗(yàn)證訓(xùn)練模型和測(cè)試
請(qǐng)參考以下的代碼。
# Drop missing value
dfreg.fillna(value=-99999, inplace=True)
We want to separate 1 percent of the data to forecast
forecast_out = int(math.ceil(0.01 * len(dfreg)))
Separating the label here, we want to predict the AdjClose
forecast_col = 'Adj Close'
dfreg['label'] = dfreg[forecast_col].shift(-forecast_out)X = np.array(dfreg.drop(['label'], 1))
Scale the X so that everyone can have the same distribution for linear regression
X = preprocessing.scale(X)
Finally We want to find Data Series of late X and early X (train) for model generation and evaluation
X_lately = X[-forecast_out:]
X = X[:-forecast_out]Separate label and identify it as y
y = np.array(dfreg['label'])
y = y[:-forecast_out]
5.3 模型生成-預(yù)測(cè)過程有意思的地方開始了
首先,讓我們?yōu)槲覀兊?SciKit-Learn 庫(kù) 的導(dǎo)入添加以下代碼:
from sklearn.linear_model import LinearRegression
from sklearn.neighbors import KNeighborsRegressor
from sklearn.linear_model import Ridge
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
5.4 簡(jiǎn)單線性分析和二次判別分析
簡(jiǎn)單線性分析給出兩個(gè)或多個(gè)變量之間的線性關(guān)系。當(dāng)我們?cè)趦蓚€(gè)變量中畫關(guān)系圖時(shí),我們會(huì)得到一條直線。二次判別分析類似于簡(jiǎn)單線性分析,只是模型允許多項(xiàng)式(例如: x 平方)的生成并會(huì)產(chǎn)生曲線。
線性回歸預(yù)測(cè)因變量(Y)為輸出而自變量(X)為輸入。在繪制過程中,我們會(huì)得到一條直線,如下圖所示:
簡(jiǎn)單線性回歸
以下是一篇相當(dāng)干貨的文章,它對(duì)線性回歸進(jìn)行了全面的回顧。
A beginner’s guide to Linear Regression in Python with Scikit-Learn https://towardsdatascience.com/a-beginners-guide-to-linear-regression-in-python-with-scikit-learn-83a8f7ae2b4f
我們將導(dǎo)入并使用現(xiàn)有的 SciKit 庫(kù),并通過選擇 X 和 Y 訓(xùn)練集來訓(xùn)練模型。代碼如下。
# Linear regression
clfreg = LinearRegression(n_jobs=-1)
clfreg.fit(X_train, y_train)
Quadratic Regression 2
clfpoly2 = make_pipeline(PolynomialFeatures(2), Ridge())
clfpoly2.fit(X_train, y_train)Quadratic Regression 3
clfpoly3 = make_pipeline(PolynomialFeatures(3), Ridge())
clfpoly3.fit(X_train, y_train)
5.5 K最近鄰(KNN)
KNN利用特征相似性來預(yù)測(cè)數(shù)據(jù)點(diǎn)的值。這保證了分配的新點(diǎn)與數(shù)據(jù)集中的點(diǎn)相似。為了找出相似點(diǎn),我們提取這些點(diǎn)間的最小距離(例如:歐氏距離)。
在 KNN 模型可視化中,你將會(huì)以 k 個(gè)數(shù)量的元素對(duì)問題元素進(jìn)行分組
有關(guān)模型的詳細(xì)資料,請(qǐng)參閱以下鏈接。這對(duì)加深你的理解非常有用。
Introduction to k-Nearest Neighbors: Simplified (with implementation in Python) https://www.analyticsvidhya.com/blog/2018/03/introduction-k-neighbours-algorithm-clustering/
# KNN Regression
clfknn = KNeighborsRegressor(n_neighbors=2)
clfknn.fit(X_train, y_train)
5.6 評(píng)估
一種簡(jiǎn)單、快速、粗略的評(píng)估方法是在每個(gè)訓(xùn)練過的模型中使用 score 方法。score 可以得到測(cè)試數(shù)據(jù)集的 self.predict(X) 與 y 的平均精度。
confidencereg = clfreg.score(X_test, y_test)
confidencepoly2 = clfpoly2.score(X_test,y_test)
confidencepoly3 = clfpoly3.score(X_test,y_test)
confidenceknn = clfknn.score(X_test, y_test)
results
('The linear regression confidence is ', 0.96399641826551985)
('The quadratic regression 2 confidence is ', 0.96492624557970319)
('The quadratic regression 3 confidence is ', 0.9652082834532858)
('The knn regression confidence is ', 0.92844658034790639)
結(jié)果顯示大多數(shù)模型的精確性評(píng)分(>0.95)。然而,這并不意味著我們可以盲目地持有這些股票。仍然有許多問題需要考慮,特別是對(duì)于不同的公司來說,隨著時(shí)間的推移,它們的價(jià)格走勢(shì)也會(huì)不同。
為了進(jìn)行全面的測(cè)試,讓我們輸出一些股票的預(yù)測(cè)。
forecast_set = clf.predict(X_lately)
dfreg['Forecast'] = np.nan
result
(array([ 115.44941187, 115.20206522, 116.78688393, 116.70244946,
116.58503739, 115.98769407, 116.54315699, 117.40012338,
117.21473053, 116.57244657, 116.048717 , 116.26444966,
115.78374093, 116.50647805, 117.92064806, 118.75581186,
118.82688731, 119.51873699]), 0.96234891774075604, 18)
6 繪制預(yù)測(cè)圖
根據(jù)預(yù)測(cè)值,我們將用現(xiàn)有的歷史數(shù)據(jù)來可視化繪圖。這將有助于我們可視化模型如何預(yù)測(cè)未來股票價(jià)格。
last_date = dfreg.iloc[-1].name
last_unix = last_date
next_unix = last_unix + datetime.timedelta(days=1)
for i in forecast_set:
next_date = next_unix
next_unix += datetime.timedelta(days=1)
dfreg.loc[next_date] = [np.nan for _ in range(len(dfreg.columns)-1)]+[i]dfreg['Adj Close'].tail(500).plot()
dfreg['Forecast'].tail(500).plot()
plt.legend(loc=4)
plt.xlabel('Date')
plt.ylabel('Price')
plt.show()
圖形表示預(yù)測(cè)值
如圖所示,藍(lán)線顯示了基于回歸的股票價(jià)格預(yù)測(cè)。預(yù)測(cè)表明,經(jīng)濟(jì)衰退不會(huì)持續(xù)太久,然后就會(huì)復(fù)蘇。因此,我們可以在經(jīng)濟(jì)低迷時(shí)買進(jìn)股票,在經(jīng)濟(jì)好轉(zhuǎn)時(shí)賣出。
7 未來的改進(jìn)/挑戰(zhàn)
為了進(jìn)一步分析股票,這里有一些你可以實(shí)現(xiàn)的想法。這些想法將有助于對(duì)股票進(jìn)行更全面的分析。如果需要更多的說明,請(qǐng)隨時(shí)通知我。
-
分析經(jīng)濟(jì)定性因素,如新聞(新聞來源和情感分析)
-
分析經(jīng)濟(jì)定量因素,如某個(gè)國(guó)家的HPI、公司起源之間的經(jīng)濟(jì)不平等
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
