【机器学习】数据挖掘实战:金融贷款分类模型和时间序列分析
今天給大家?guī)?lái)一個(gè)企業(yè)級(jí)數(shù)據(jù)挖掘?qū)崙?zhàn)項(xiàng)目,金融貸款分類模型和時(shí)間序列分析,文章較長(zhǎng),建議收藏!
如果本文對(duì)你有所幫助,記得文末點(diǎn)贊和在看,也可分享給你需要的朋友~
項(xiàng)目背景
銀行和其他金融貸款機(jī)構(gòu)經(jīng)常需要查看貸款申請(qǐng)人的信用歷史、經(jīng)濟(jì)狀況和其他因素,以確定貸款資格,但這些因素之間的關(guān)系通常不是明確定義的,但在本質(zhì)上可以得到啟發(fā)的。通常情況下,公司近況,如其近期的興衰,也被作為決定其財(cái)務(wù)穩(wěn)定性的考慮因素。因?yàn)檫@些因素考慮不當(dāng),或者被忽略了。這很可能會(huì)導(dǎo)致對(duì)公司拖欠貸款可能性的判斷錯(cuò)誤。
因此,我們可以使用有效的分類和時(shí)間序列分析,生成一個(gè)好的模型,不僅會(huì)更精確,而且會(huì)大大降低在解決這個(gè)問(wèn)題上的成本效益。有了這個(gè)目標(biāo),我們將分析數(shù)據(jù),并用來(lái)自其他集合的數(shù)據(jù)來(lái)補(bǔ)充它,并通過(guò)創(chuàng)建分類策略和分析模型所采取的步驟,試圖理解與公司財(cái)務(wù)狀況相關(guān)度最高的靜態(tài)因素。
目標(biāo)變量和預(yù)測(cè)變量
我們總共使用了42個(gè)特征來(lái)確定最終分類器中的目標(biāo),目標(biāo)本身是由SVM分類器輸出和ARIMA時(shí)間序列分析得到的復(fù)合變量。
使用的最重要的預(yù)測(cè)變量是:Accounts Payable, Capital Expenditures, Additional Income Expense Items, Accounts Receivable and After Tax Return on Equity(應(yīng)付帳款、資本支出、額外收入費(fèi)用項(xiàng)目、應(yīng)收帳款和稅后權(quán)益回報(bào))。
目標(biāo)變量是公司股票價(jià)格在兩年內(nèi)的變化百分比和公司在未來(lái)4年內(nèi)破產(chǎn)的可能性的總和。
問(wèn)題陳述
識(shí)別各種靜態(tài)特征,這些特征負(fù)責(zé)確定公司的增長(zhǎng)趨勢(shì),從而確定其獲得貸款的資格。
模型的類型
這些數(shù)據(jù)集包括申請(qǐng)破產(chǎn)的公司的數(shù)據(jù)、紐約證券交易所組織的6年股票趨勢(shì)和這些公司的財(cái)務(wù)數(shù)據(jù)。我們?cè)谄飘a(chǎn)公司數(shù)據(jù)集上嘗試了多種模型,包括決策樹、線性模型和Logistic回歸,并得出基于AUC值的支持向量機(jī)最適合于該數(shù)據(jù)集的結(jié)論。
采用ARIMA時(shí)間序列方法對(duì)股票走勢(shì)進(jìn)行了分析。使用這些值將一個(gè)復(fù)合標(biāo)簽添加到金融數(shù)據(jù)集中,最后在這個(gè)數(shù)據(jù)集上使用隨機(jī)森林分類器來(lái)解決上述問(wèn)題。因?yàn)椴煌镜臄?shù)據(jù)存在大量的特征和大的方差,隨機(jī)森林模型對(duì)數(shù)據(jù)的擬合最好,提供了最好的整體精度。
評(píng)價(jià)方法
評(píng)估數(shù)據(jù)的任務(wù)分4個(gè)步驟完成
數(shù)據(jù)清理
由于我們操作的數(shù)據(jù)來(lái)自不同來(lái)源的多個(gè)數(shù)據(jù)集,因此數(shù)據(jù)清理是確保這些數(shù)據(jù)集的數(shù)據(jù)表示一致所必需的一項(xiàng)主要操作。
破產(chǎn)預(yù)測(cè)
申請(qǐng)破產(chǎn)的公司的數(shù)據(jù)集不包含非破產(chǎn)公司的財(cái)務(wù)特征數(shù)據(jù),因此我們沒(méi)有一個(gè)可以用來(lái)直接訓(xùn)練模型的數(shù)據(jù)集。為了解決這個(gè)問(wèn)題,我們使用了來(lái)自紐約證券交易所上市公司的更大金融數(shù)據(jù)集的前幾年的數(shù)據(jù),并將其添加到這個(gè)數(shù)據(jù)集中,以確保該數(shù)據(jù)集符合通用規(guī)則。然后我們?cè)谶@個(gè)數(shù)據(jù)集上訓(xùn)練了一個(gè)SVM,并驗(yàn)證其AUC得分約為0.75。
時(shí)間序列分析
公司股票價(jià)格數(shù)據(jù)包含紐交所上市的約500家公司的每日收盤價(jià)。該數(shù)據(jù)被按比例縮小,以包含每周平均股價(jià)。由于時(shí)間序列對(duì)不同的公司會(huì)有不同的表現(xiàn),因此有必要分別為每個(gè)公司建模。
不出所料,在某些情況下數(shù)據(jù)顯示了強(qiáng)烈的趨勢(shì)和季節(jié)性,必須通過(guò)數(shù)據(jù)集的差分來(lái)刪除趨勢(shì)和季節(jié)性,然后執(zhí)行ARIMA模型。根據(jù)ACF和PACF繪圖分析和手工試驗(yàn),選擇的p值和q值分別為2和1。在建模時(shí),平均絕對(duì)誤差為~0.05,這表明時(shí)間序列分析是相當(dāng)準(zhǔn)確的。
用預(yù)測(cè)數(shù)據(jù)增強(qiáng)初始數(shù)據(jù)集
包含紐約證券交易所上市公司財(cái)務(wù)信息的數(shù)據(jù)集用預(yù)測(cè)破產(chǎn)價(jià)值和兩年內(nèi)各自股票價(jià)格變化百分比的復(fù)合標(biāo)簽進(jìn)行了增強(qiáng)。這個(gè)標(biāo)簽是連續(xù)的,我們將它四舍五入到小數(shù)點(diǎn)后一位,然后乘以10得到一個(gè)整數(shù)。這個(gè)標(biāo)簽用于訓(xùn)練隨機(jī)森林分類器,以確定模型認(rèn)為對(duì)預(yù)測(cè)公司的增長(zhǎng)趨勢(shì)最重要的特征。對(duì)特征進(jìn)行分析并找出特征與標(biāo)簽之間的相關(guān)關(guān)系。
隨機(jī)森林分類器本身的分析是通過(guò)觀察產(chǎn)生的混淆矩陣來(lái)評(píng)估的。由于標(biāo)簽是多類的,而不是二分類的,因此不能繪制ROC曲線來(lái)評(píng)價(jià)模型結(jié)果。然而馬修斯相關(guān)系數(shù)卻可以很好地衡量置信度。
假設(shè) / 限制
1、破產(chǎn)預(yù)測(cè)是機(jī)器學(xué)習(xí)研究的一個(gè)重要課題。關(guān)于這個(gè)話題有幾篇研究論文,其中幾篇使用了神經(jīng)網(wǎng)絡(luò)和先進(jìn)的機(jī)器學(xué)習(xí)技術(shù)來(lái)更加精確可靠地預(yù)測(cè)破產(chǎn)的可能性。我們發(fā)現(xiàn)一些屬性在這些模型中被普遍使用,因此并假設(shè)這些屬性與公司破產(chǎn)的概率高度相關(guān)。
當(dāng)然,如此決策另一個(gè)重要原因是,因?yàn)楸敬雾?xiàng)目無(wú)法獲得包含更多破產(chǎn)公司財(cái)務(wù)數(shù)據(jù)的公共數(shù)據(jù)集。因此,我們只使用這些相關(guān)度最高的特征來(lái)訓(xùn)練預(yù)測(cè)器,這是一個(gè)極其簡(jiǎn)單的破產(chǎn)預(yù)測(cè)模型。
2、發(fā)現(xiàn) ACF 和 PACF 圖非常模糊,并且不足以幫助確定 AR 和 MA 參數(shù)值。因此,我們嘗試了一些值,并假設(shè) (2,1) 組合最能預(yù)測(cè)數(shù)據(jù)。
3、增強(qiáng)步驟包括合并二進(jìn)制預(yù)測(cè)破產(chǎn)值和連續(xù)平均時(shí)間序列預(yù)測(cè)。我們假設(shè)這是一個(gè)很好的指標(biāo),可以判斷公司是上升還是下降,因此,向公司提供貸款是否安全。
類范圍問(wèn)題
使用多種分類策略并對(duì)時(shí)間序列進(jìn)行建模后,可以通過(guò)增加特征和數(shù)據(jù)點(diǎn)的數(shù)量來(lái)進(jìn)一步進(jìn)行這種分析,以實(shí)現(xiàn)更好的破產(chǎn)預(yù)測(cè),以及調(diào)整時(shí)間序列模型的 AR 和 MA 參數(shù)。
鑒于當(dāng)前的分析,我們發(fā)現(xiàn)了與目標(biāo)變量相關(guān)的多個(gè)特征,這種分析有助于補(bǔ)充組織的傳統(tǒng)啟發(fā)式知識(shí)。銀行和其他金融貸款機(jī)構(gòu)的信息存儲(chǔ)可以使用這種分析來(lái)更多地關(guān)注這些特征,這是通過(guò)代表性或推論分析可能無(wú)法實(shí)現(xiàn)的。
原始提案的變化及其原因:我們最初的提議包含一個(gè)策略,即只使用破產(chǎn)預(yù)測(cè)器來(lái)為金融數(shù)據(jù)集提供標(biāo)簽。然而,經(jīng)過(guò)仔細(xì)分析,我們發(fā)現(xiàn)它不能作為公司整體地位的一個(gè)足夠全面的指標(biāo)。因此,我們決定通過(guò)對(duì)公司股票趨勢(shì)的時(shí)間序列分析來(lái)增強(qiáng)它,這將是組織增長(zhǎng)/下降的更好指標(biāo)。
代碼
導(dǎo)入相關(guān)模塊
import?numpy?as?np import?pandas?as?pd import?re import?warnings from?matplotlib?import?pyplot?as?plt from?sklearn.model_selection?import?train_test_split from?sklearn?import?preprocessing?as?pp from?sklearn?import?svm from?sklearn.ensemble?import?RandomForestClassifier from?sklearn?import?metrics from?statsmodels.stats.stattools?import?durbin_watson from?statsmodels.graphics.tsaplots?import?plot_acf,?plot_pacf from?statsmodels.tsa?import?arima_model from?statsmodels.graphics.api?import?qqplot warnings.filterwarnings('ignore')數(shù)據(jù)預(yù)處理
定義了幾個(gè)函數(shù),這里包括數(shù)據(jù)清洗、時(shí)間解析、穩(wěn)定性檢測(cè)。
def?cleanColumnName(column):#刪除列名中的符號(hào)column?=?re.sub('\W+','?',?column.strip())#刪除列名末尾的所有空格column?=?column.strip()?#?用'_'替換單詞之間的空格return?column.lower().replace("?","_")?????????????????????????def?dateParse(dates):return?pd.datetime.strptime(dates,?'%Y-%m-%d')def?test_stationarity(ticker,?timeseries):#?確定滑動(dòng)窗口統(tǒng)計(jì)rolmean?=?timeseries.rolling(window=7,?center=False).mean()rolstd?=?timeseries.rolling(window=7,?center=False).std()#繪制滑動(dòng)窗口統(tǒng)計(jì)圖:orig?=?plt.plot(timeseries,?color='blue',label='Original')mean?=?plt.plot(rolmean,?color='red',?label='Rolling?Mean')std?=?plt.plot(rolstd,?color='black',?label?=?'Rolling?Std')plt.legend(loc='best')plt.title(ticker)plt.show(block=False)#?自相關(guān)的durbin_watson統(tǒng)計(jì)dftest?=?durbin_watson(timeseries)print(ticker)print("Durbin-Watson?statistic?for?"+ticker+":?",dftest)數(shù)據(jù)清洗
從數(shù)據(jù)集中刪除不必要的列。這完全是啟發(fā)式的,因?yàn)槲覀兺耆鶕?jù)自己對(duì)這些列的意義的理解來(lái)刪除它們。
#?讀取數(shù)據(jù) bankrupt_companies?=?pd.read_csv("public_company_bankruptcy_cases.csv") companies_stock_prices?=?pd.read_csv("prices-split-adjusted.csv",?parse_dates=True,?usecols=["date","symbol","close"],?date_parser=dateParse) nyse_data?=?pd.read_csv("fundamentals.csv",?index_col='Unnamed:?0')bankrupt_companies.drop(["DISTRICT",?"STATE",?"COMPANY?NAME"],?axis=1,?inplace=True) nyse_data.drop(["Deferred?Asset?Charges","Deferred?Liability?Charges","Depreciation","Earnings?Before?Tax","Effect?of?Exchange?Rate","Equity?Earnings/Loss?Unconsolidated?Subsidiary","Goodwill","Income?Tax","Intangible?Assets","Interest?Expense","Liabilities","Minority?Interest","Misc.?Stocks","Net?Cash?Flow-Operating","Net?Cash?Flows-Financing","Net?Cash?Flows-Investing","Net?Income?Adjustments","Net?Income?Applicable?to?Common?Shareholders","Net?Income-Cont.?Operations","Operating?Income","Operating?Margin","Other?Assets","Other?Current?Assets","Other?Current?Liabilities","Other?Financing?Activities","Other?Investing?Activities","Other?Liabilities","Other?Operating?Activities","Other?Operating?Items","Pre-Tax?Margin","Pre-Tax?ROE","Research?and?Development","Total?Current?Assets","Total?Current?Liabilities","Total?Liabilities?&?Equity","Treasury?Stock",?"For?Year"],?axis=1,?inplace=True)#?數(shù)據(jù)清理,使列名格式一致 bankrupt_companies.columns?=?map(cleanColumnName,?bankrupt_companies.columns) bankrupt_companies.columns?=?["total_assets",?"total_liabilities"] companies_stock_prices.columns?=?map(cleanColumnName,?companies_stock_prices.columns) nyse_data.columns?=?map(cleanColumnName,?nyse_data.columns)nyse_data.head()缺失值處理
從各自的數(shù)據(jù)集中刪除NaN值。
bankrupt_companies.dropna(axis=0,?subset=['total_assets',?'total_liabilities'],inplace=True)nyse_data.dropna(axis=1,?how='any',?inplace=True) nyse_data.dropna(axis=0,?how='any',?inplace=True)companies_stock_prices.dropna(axis=0,?how='any',?inplace=True)訓(xùn)練SVM作為破產(chǎn)預(yù)測(cè)器
創(chuàng)建包含2013年未破產(chǎn)公司數(shù)據(jù)的新dataframe。
nyse_2013?=?nyse_data.loc[nyse_data['period_ending'].str.contains("2013"),["total_assets",?"total_liabilities"]]nyse_2013?=?nyse_2013.sample(n=bankrupt_companies.shape[0],replace=False)隨機(jī)抽樣該數(shù)據(jù)集,以獲得一個(gè)數(shù)據(jù)幀,其中包含與其他數(shù)據(jù)集中破產(chǎn)公司數(shù)量相同的非破產(chǎn)公司的數(shù)據(jù)。
nyse_2013.set_index([[x?for?x?in?range(bankrupt_companies.index[-1]+1,?bankrupt_companies.index[-1]+nyse_2013.shape[0]+1)]],inplace=True)手動(dòng)將列“bankrupt”添加到要用作標(biāo)簽的數(shù)據(jù)集。
bankrupt_companies["stability"]?=?0 nyse_2013["stability"]?=?1合并破產(chǎn)數(shù)據(jù)和非破產(chǎn)數(shù)據(jù),生成一個(gè)可用于訓(xùn)練分類器的數(shù)據(jù)。
merged_bankruptcy_dataset?=?pd.concat([bankrupt_companies,?nyse_2013])#?縮放數(shù)據(jù)以確保資產(chǎn)和負(fù)債在相同的范圍內(nèi)scaler?=?pp.MinMaxScaler() scaler.fit(merged_bankruptcy_dataset[["total_assets",?"total_liabilities"]]) merged_bankruptcy_dataset[["total_assets",?"total_liabilities"]]?=?scaler.transform(merged_bankruptcy_dataset[["total_assets",?"total_liabilities"]])將合并的數(shù)據(jù)集隨機(jī)分割為訓(xùn)練數(shù)據(jù)集和測(cè)試數(shù)據(jù)集,用于訓(xùn)練決策樹。
train_bankruptcy_data,?test_bankruptcy_data,? train_bankruptcy_target,?test_bankruptcy_target?=?train_test_split(merged_bankruptcy_dataset.iloc[:,0:-1],?merged_bankruptcy_dataset.iloc[:,-1],test_size=0.25?)在訓(xùn)練數(shù)據(jù)上訓(xùn)練支持向量機(jī)。
Svm_model?=?svm.LinearSVC() Svm_model.fit(train_bankruptcy_data,?train_bankruptcy_target)print(train_bankruptcy_data.shape,?Svm_model.score(train_bankruptcy_data,?train_bankruptcy_target)) print(test_bankruptcy_data.shape,?Svm_model.score(test_bankruptcy_data,?test_bankruptcy_target))((190, 2), 0.83157894736842108) ((64, 2), 0.8125)計(jì)算和繪制ROC和面積下曲線,以了解分類器的準(zhǔn)確性
FPR,?TPR,?_?=?metrics.roc_curve(test_bankruptcy_target,?Svm_model.predict(test_bankruptcy_data)) auc?=?metrics.auc(FPR,?TPR)plt.plot(FPR,?TPR,?'b',?label?=?'AUC?for?SVM?=?%0.2f'?%auc) plt.title("AUC?For?SVM?Model") plt.legend(loc='best') plt.plot([0,1],?[0,1],?'r--') plt.xlabel('FPR') plt.ylabel('TPR') plt.show()只保留所有公司去年的數(shù)據(jù)。我們將只考慮最新的數(shù)據(jù),并在原始數(shù)據(jù)集中添加破產(chǎn)的預(yù)測(cè)值。
nyse_data.drop_duplicates(subset='ticker_symbol',?keep='last',?inplace=True)nyse_data["stability"]?=?Svm_model.predict(scaler.transform(nyse_data[["total_assets","total_liabilities"]])) print("Companies?predicted?to?go?bankrupt?over?a?4?year?period:?",len(nyse_data.loc[nyse_data["stability"]?!=?1,?"ticker_symbol"]))Companies predicted to go bankrupt over a 4 year period: 114時(shí)間序列分析
companies_stock_prices["date"]?=?pd.to_datetime(companies_stock_prices["date"],format="%Y-%m-%d") companies_stock_prices.dropna(axis=0,?how='any',?inplace=True)#?按股票代碼排序 companies_stock_prices.sort_values(by=["symbol",?"date"],?inplace=True)假設(shè)每個(gè)公司的股票趨勢(shì)是不同的,我們需要為每個(gè)公司建模不同的時(shí)間序列,方法是將每個(gè)公司的數(shù)據(jù)以單獨(dú)的鍵存儲(chǔ)在字典中。字典存儲(chǔ)每個(gè)公司的每周股票價(jià)格,將每個(gè)公司的數(shù)據(jù)添加到字典中的單獨(dú)鍵中,這樣就可以對(duì)每個(gè)公司分別進(jìn)行時(shí)間序列分析。
weekly_stock_prices?=?{}????????????for?i?in?np.unique(companies_stock_prices["symbol"].values):weekly_stock_prices[i]?=?companies_stock_prices.loc[companies_stock_prices["symbol"]?==?i,?:].copy()weekly_stock_prices[i]?=?weekly_stock_prices[i].reset_index(drop=True)通過(guò)每周只保留一天的數(shù)據(jù),將每日庫(kù)存數(shù)據(jù)轉(zhuǎn)換為每周。因?yàn)榇蠹s有450家公司,所以只顯示前10個(gè)地塊,而且繪制所有地塊需要大量時(shí)間。趨勢(shì)和季節(jié)性可以假定存在于所有這些。
count?=?0 for?i?in?weekly_stock_prices:weekly_mean?=?weekly_stock_prices[i]["close"].rolling(window=5,?center=False).mean()[4:]#?通過(guò)每周只保留一天的數(shù)據(jù),將每日庫(kù)存數(shù)據(jù)轉(zhuǎn)換為每周weekly_stock_prices[i]?=?weekly_stock_prices[i].loc[weekly_stock_prices[i].index?%?5?==?0,?:]weekly_stock_prices[i]["close"]?=?weekly_meanweekly_stock_prices[i].index?=?weekly_stock_prices[i]["date"]weekly_stock_prices[i].drop(["symbol",?"date"],?axis=1,?inplace=True)weekly_stock_prices[i].dropna(axis=0,?how='any',?inplace=True)count?+=?1????if?count?<=?10:test_stationarity(i,?weekly_stock_prices[i])AGN ('Durbin-Watson statistic for AGN: ', array([ 0.00106633]))EOG ('Durbin-Watson statistic for EOG: ', array([ 0.00104565]))CPB ('Durbin-Watson statistic for CPB: ', array([ 0.00042048]))EVHC ('Durbin-Watson statistic for EVHC: ', array([ 0.00806171]))IDXX ('Durbin-Watson statistic for IDXX: ', array([ 0.00094586]))QRVO ('Durbin-Watson statistic for QRVO: ', array([ 0.00290384]))JWN ('Durbin-Watson statistic for JWN: ', array([ 0.00088175]))JBHT ('Durbin-Watson statistic for JBHT: ', array([ 0.00059562]))TAP ('Durbin-Watson statistic for TAP: ', array([ 0.00062282]))VRTX ('Durbin-Watson statistic for VRTX: ', array([ 0.00270465]))正如可以預(yù)期的那樣,股票價(jià)格數(shù)據(jù)顯示了一個(gè)很容易看到的趨勢(shì),而且在許多情況下,更仔細(xì)的檢查也會(huì)顯示出季節(jié)性的存在。低的Durbin-Watson統(tǒng)計(jì)值是高正自相關(guān)的證據(jù),這也是可以理解的,因?yàn)楣善眱r(jià)格依賴于以前的值。因此,要對(duì)該數(shù)據(jù)進(jìn)行ARIMA分析,首先需要對(duì)其進(jìn)行操作,以得到一個(gè)平穩(wěn)的數(shù)據(jù)。
#?對(duì)數(shù)據(jù)進(jìn)行平穩(wěn)處理 count?=?0 weekly_stock_prices_log?=?{} for?i?in?weekly_stock_prices:#?對(duì)數(shù)據(jù)進(jìn)行差分來(lái)去除數(shù)據(jù)中的趨勢(shì)和季節(jié)性weekly_stock_prices_log[i]?=?weekly_stock_prices[i].copy()weekly_stock_prices_log[i]["first_difference"]?=?weekly_stock_prices_log[i]["close"]?-?weekly_stock_prices_log[i]["close"].shift(1)weekly_stock_prices_log[i]["seasonal_first_difference"]?=?weekly_stock_prices_log[i]["first_difference"]?-?weekly_stock_prices_log[i]["first_difference"].shift(12)count?+=?1if?count?<=10:test_stationarity(i,?weekly_stock_prices_log[i]["seasonal_first_difference"].dropna(inplace=False))AGN ('Durbin-Watson statistic for AGN: ', 1.8408166958817405)EOG ('Durbin-Watson statistic for EOG: ', 1.6299518594407623)CPB ('Durbin-Watson statistic for CPB: ', 1.5454599084578173)EVHC ('Durbin-Watson statistic for EVHC: ', 1.4213426917002945)IDXX ('Durbin-Watson statistic for IDXX: ', 1.7448077126902013)QRVO ('Durbin-Watson statistic for QRVO: ', 1.3805906045088099)JWN ('Durbin-Watson statistic for JWN: ', 1.6385737145457053)JBHT ('Durbin-Watson statistic for JBHT: ', 1.6966894515415203)TAP ('Durbin-Watson statistic for TAP: ', 1.8412354264794373)VRTX ('Durbin-Watson statistic for VRTX: ', 1.6067817382582221)現(xiàn)在從結(jié)果可以看出,這已經(jīng)失去了先前所具有的趨勢(shì)和季節(jié)性。Durbin-Watson統(tǒng)計(jì)量也顯示了一個(gè)值~2,因此我們可以得出殘差是平穩(wěn)的,可以繼續(xù)對(duì)其進(jìn)行分析操作。
#?通過(guò)繪制ACF和PACF圖來(lái)確定自回歸和移動(dòng)平均參數(shù)。 count?=?0 for?i?in?weekly_stock_prices_log:fig?=?plt.figure(figsize=(12,5))ax1?=?fig.add_subplot(121)plot_acf(weekly_stock_prices_log[i]["seasonal_first_difference"].iloc[13:],?lags=50,?title="Autocorrelation?for?"+i,?ax=ax1)ax2?=?fig.add_subplot(122)plot_pacf(weekly_stock_prices_log[i]["seasonal_first_difference"].iloc[13:],?lags=50,?title="Partial?Autocorrelation?for?"+i,?ax=ax2)count?+=?1if?count?==?5:break plt.show()ACF和PACF圖顯示在滯后1時(shí)出現(xiàn)峰值。然而,這些圖本身并不是決定性的,因?yàn)闆](méi)有一個(gè)可以說(shuō)是指數(shù)下降的,當(dāng)然,也顯示了一些異常值。使用不同p和q值的試驗(yàn)在(2,1)處顯示出顯著更好的結(jié)果。
對(duì)所有公司進(jìn)行ACF-PACF分析是不可能的,因此對(duì)于SVD不收斂于(2,1)的實(shí)例,使用了(1,0)的回退值。
count?=?0 stock_predictions?=?{} for?i?in?weekly_stock_prices_log:#?將可用數(shù)據(jù)分割為訓(xùn)練,使用剩余的數(shù)據(jù)點(diǎn)進(jìn)行準(zhǔn)確性檢查split_point?=?len(weekly_stock_prices_log[i])?-?20#?從數(shù)據(jù)集的最后日期到2018-12-31的周數(shù)加117num_of_predictions?=?len(weekly_stock_prices_log[i])?+?117training?=?weekly_stock_prices_log[i][0:split_point]model?=?{}#?首先嘗試使用p=2,?q=1建模,如果失敗,使用p=1,?q=0try:model?=?arima_model.ARMA(training["close"],?order=(2,1)).fit()except:model?=?arima_model.ARMA(training["close"],?order=(1,0)).fit()#?在dataframe中添加預(yù)測(cè)值,以便于進(jìn)一步的操作。daterange?=?pd.date_range(training.index[0],?periods=num_of_predictions,?freq?=?'W-MON').tolist()stock_predictions[i]?=?pd.DataFrame(columns=["date",?"prediction"])stock_predictions[i]["date"]?=?daterangestock_predictions[i]["prediction"]?=?model.predict(start=0,?end=num_of_predictions)stock_predictions[i].set_index("date",?inplace=True)#?繪制QQPlot來(lái)檢查殘差是否均勻分布if?count?<?5:resid?=?model.residprint("For?"+i+":?",stats.normaltest(resid))qqplot(resid,?line='q',?fit=True)plt.show()count?+=?1('For AGN: ', NormaltestResult(statistic=472.93123930305205, pvalue=2.0150518495630914e-103))('For EOG: ', NormaltestResult(statistic=120.49648362661878, pvalue=6.8315780758386102e-27))('For CPB: ', NormaltestResult(statistic=339.86796767404019, pvalue=1.579823361925116e-74))('For EVHC: ', NormaltestResult(statistic=69.17501926644907, pvalue=9.5243516902465695e-16))('For IDXX: ', NormaltestResult(statistic=360.2101109972532, pvalue=6.0446092870173276e-79))上面這些圖顯示了合理的平等分布,因此我們可以得出結(jié)論,殘差分析是適當(dāng)?shù)摹?/p>
時(shí)間序列模型分析。
count?=?0 for?i?in?weekly_stock_prices_log:#?將實(shí)際值與預(yù)測(cè)值進(jìn)行對(duì)比weekly_stock_prices_log[i]["close"].plot()stock_predictions[i]["prediction"].plot()plt.show()#?計(jì)算驗(yàn)證數(shù)據(jù)點(diǎn)的平均絕對(duì)誤差和平均預(yù)測(cè)誤差split_point?=?len(weekly_stock_prices_log[i])?-?20forecastedValues?=?stock_predictions[i]["prediction"].iloc[split_point?:?len(weekly_stock_prices_log[i])]actualValues?=?weekly_stock_prices_log[i]["close"].iloc[split_point:]mfe?=?actualValues.subtract(forecastedValues).mean()mae?=?(abs(mfe)/forecastedValues).mean()display("Mean?Absolute?Error?for?"+i+":?"+str(mae))display("Mean?Forecast?Error?for?"+i+":?"+str(mfe))print?"-----"*50count?+=?1if?count?>?10:break'Mean Absolute Error for AGN: 0.00193187347291' 'Mean Forecast Error for AGN: 0.481341889454'-------------------------------------------------'Mean Absolute Error for EOG: 0.0798100720231' 'Mean Forecast Error for EOG: 6.73902186871'-------------------------------------------------'Mean Absolute Error for CPB: 0.00893546704868' 'Mean Forecast Error for CPB: 0.54092487694'-------------------------------------------------'Mean Absolute Error for EVHC: 0.143090575838' 'Mean Forecast Error for EVHC: -3.51053172619'-------------------------------------------------'Mean Absolute Error for IDXX: 0.0264690184111' 'Mean Forecast Error for IDXX: 2.85600695121'-------------------------------------------------'Mean Absolute Error for QRVO: 0.100785079934' 'Mean Forecast Error for QRVO: -5.95620693487'-------------------------------------------------'Mean Absolute Error for JWN: 0.158397127455' 'Mean Forecast Error for JWN: 6.89272442754'-------------------------------------------------'Mean Absolute Error for JBHT: 0.0206382415512''Mean Forecast Error for JBHT: 1.66385893237'-------------------------------------------------'Mean Absolute Error for TAP: 0.0115749676383' 'Mean Forecast Error for TAP: 1.14684278635'-------------------------------------------------'Mean Absolute Error for VRTX: 0.0246045992625' 'Mean Forecast Error for VRTX: 2.4170609498'-------------------------------------------------'Mean Absolute Error for BWA: 0.0334229670671' 'Mean Forecast Error for BWA: 1.09813003018'-------------------------------------------------平均絕對(duì)誤差值約等于0表明時(shí)間序列模型具有良好的預(yù)測(cè)精度。
使用預(yù)測(cè)數(shù)據(jù)增強(qiáng)初始數(shù)據(jù)集
創(chuàng)建新的列來(lái)存儲(chǔ)預(yù)測(cè)的股票價(jià)格,計(jì)算一個(gè)百分比度量來(lái)估計(jì)公司股票的上漲或下跌,進(jìn)而估計(jì)組織的增長(zhǎng),以便在所有組織中保持一個(gè)公平的范圍。
nyse_data["stock_pred"]?=?np.nan for?i?in?stock_predictions:perc=(stock_predictions[i]["prediction"].tail(105).mean()?-?stock_predictions[i]["prediction"].tail(105)[0])/stock_predictions[i]["prediction"].tail(105)[0]nyse_data.loc[nyse_data["ticker_symbol"]?==?i,?"stock_pred"]?=?perc將預(yù)計(jì)的破產(chǎn)價(jià)值加到預(yù)計(jì)的股價(jià)中,生成一個(gè)能有效代表公司成長(zhǎng)或衰退的復(fù)合標(biāo)簽。從數(shù)據(jù)集中刪除不必要的和非數(shù)字列,以方便建模。
nyse_data["stock_pred"]?+=?nyse_data["stability"]nyse_data.drop(["period_ending",?"stability",?"ticker_symbol"],?axis=1,?inplace=True) nyse_data.dropna(axis=0,?subset=["stock_pred"],?inplace=True)縮放數(shù)據(jù)集的特性。
nyse_data_scaled?=?nyse_data.iloc[:,0:-1] scaler?=?pp.StandardScaler() nyse_data_scaled[nyse_data_scaled.columns]?=?scaler.fit_transform(nyse_data_scaled[nyse_data_scaled.columns])將目標(biāo)變量縮放到值-1和1之間,四舍五入到最近的第十位,并乘以10,以生成一個(gè)非連續(xù)的多值標(biāo)簽。
scaler?=?pp.MinMaxScaler(feature_range=(-1,1)) nyse_data_target_scaled?=?scaler.fit_transform(nyse_data.iloc[:,-1].reshape(-1,1)).round(decimals=1)?*?10將增強(qiáng)數(shù)據(jù)集分割為訓(xùn)練集和測(cè)試集,用于訓(xùn)練分類器。
train_data,?test_data,?train_target,?test_target?=?train_test_split(nyse_data_scaled,?nyse_data_target_scaled,?test_size=0.25)訓(xùn)練隨機(jī)森林分類器。
RF?=?RandomForestClassifier() RF.fit(train_data,?train_target)model_predictions?=?RF.predict(test_data)print("Training:-->",train_data.shape,?RF.score(train_data,?train_target)) print("Testing:-->",test_data.shape,?RF.score(test_data,?test_target))('Training:-->', (334, 34), 0.98502994011976053) ('Testing:-->', (112, 34), 0.7410714285714286)分析隨機(jī)森林模型發(fā)現(xiàn)的特征,使其與增強(qiáng)標(biāo)簽高度相關(guān)。觀察數(shù)值相關(guān)性。
top_features?=?np.argsort(RF.feature_importances_[-5:]) top_features?=?np.append(top_features,?-1) display(nyse_data.iloc[:,?top_features].corr())生成一個(gè)混淆矩陣并計(jì)算Matthews相關(guān)系數(shù)作為訓(xùn)練的隨機(jī)森林分類器的評(píng)估指標(biāo)。
display("CONFUSION?MATRIX:?",metrics.confusion_matrix(test_target,?model_predictions)) display("MATTHEWS?CORRELATION?CO-EFFICIENT",?metrics.matthews_corrcoef(test_target,?model_predictions))'CONFUSION MATRIX: 'array([[ 1, 4, 0, 0, 0, 0, 0, 0, 0],[ 2, 17, 0, 0, 0, 0, 0, 0, 0],[ 1, 1, 0, 0, 0, 0, 0, 0, 0],[ 0, 1, 0, 0, 0, 0, 0, 0, 0],[ 0, 0, 0, 0, 0, 4, 0, 0, 0],[ 0, 0, 0, 0, 0, 64, 3, 0, 0],[ 0, 1, 0, 0, 0, 7, 1, 0, 0],[ 0, 0, 0, 0, 0, 3, 1, 0, 0],[ 0, 0, 0, 0, 0, 0, 1, 0, 0]])'MATTHEWS CORRELATION CO-EFFICIENT' 0.53348354519442676往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機(jī)器學(xué)習(xí)在線手冊(cè)深度學(xué)習(xí)筆記專輯《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載黃海廣老師《機(jī)器學(xué)習(xí)課程》視頻課黃海廣老師《機(jī)器學(xué)習(xí)課程》711頁(yè)完整版課件本站qq群955171419,加入微信群請(qǐng)掃碼:
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的【机器学习】数据挖掘实战:金融贷款分类模型和时间序列分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【知识图谱系列】人工智能经典图谱有哪些?
- 下一篇: 怎么解决机械革命笔记本蓝屏问题