LSTM神经网络在证券市场分析上的应用
在前文中,我們利用tushare和python工具分析實(shí)現(xiàn)了對證券市場股票數(shù)據(jù)的獲取與保存。驗證了股票收益率符合正態(tài)分布,進(jìn)而驗證了股票走勢較好符合布朗運(yùn)動規(guī)律、維納過程和伊藤過程的這一基礎(chǔ)理論事實(shí)。此后,我們進(jìn)一步探究股票價格的運(yùn)動規(guī)律,引入基于神經(jīng)網(wǎng)絡(luò)的LSTM模型,通過學(xué)習(xí)以往的股票價格運(yùn)動對未來趨勢加以預(yù)測,實(shí)現(xiàn)了更為細(xì)致精確的擬合。
提示:本文內(nèi)容限于本人對相關(guān)技術(shù)的原創(chuàng)性思考和理解,僅供學(xué)習(xí)參考。
目錄
- 前言
- 一、神經(jīng)網(wǎng)絡(luò)是什么?
- 二、時間序列與神經(jīng)網(wǎng)絡(luò)
- 1.傳統(tǒng)神經(jīng)網(wǎng)絡(luò)的局限性
- 2.循環(huán)神經(jīng)網(wǎng)絡(luò)RNN
- 3.長短期記憶神經(jīng)網(wǎng)絡(luò)LSTM
- 4.采用LSTM模型研究的優(yōu)勢
- 三、滬深股指實(shí)證研究
- 1.導(dǎo)入相關(guān)包
- 2.讀入數(shù)據(jù)
- 3.數(shù)據(jù)預(yù)處理
- 4.LSTM模型訓(xùn)練
- 5.可視化繪制
- 四、預(yù)測結(jié)果
- 總結(jié)
前言
本文主要分為三部分,在第一部分主要是對機(jī)器學(xué)習(xí)中的人工神經(jīng)網(wǎng)絡(luò)技術(shù)作簡要的介紹和引入。第二部分,將簡要說明時間序列(也即隨機(jī)過程)數(shù)據(jù)所具有的特征,以及傳統(tǒng)神經(jīng)網(wǎng)絡(luò)對于時間序列的學(xué)習(xí)所具有的缺陷,并引出當(dāng)前較為時興和前沿的LSTM神經(jīng)網(wǎng)絡(luò)技術(shù),強(qiáng)調(diào)其在時間序列數(shù)據(jù)訓(xùn)練和處理上所具有的優(yōu)越性。最后,本文將以LSTM網(wǎng)絡(luò)在滬深股票指數(shù)上的學(xué)習(xí)與訓(xùn)練作為技術(shù)的應(yīng)用實(shí)例,從實(shí)際的代碼層面對LSTM神經(jīng)網(wǎng)絡(luò)的具體原理和工作機(jī)制進(jìn)行更為深入的講解。
一、神經(jīng)網(wǎng)絡(luò)是什么?
什么是神經(jīng)網(wǎng)絡(luò)呢?一說到神經(jīng)網(wǎng)絡(luò),根據(jù)我們在中學(xué)期間所學(xué)習(xí)的生物知識,我們會第一時間聯(lián)想到我們?nèi)祟惔竽X中所擁有的生物神經(jīng)網(wǎng)絡(luò)。作為計算機(jī)領(lǐng)域人工神經(jīng)網(wǎng)絡(luò)技術(shù)的原型,人類大腦中的生物神經(jīng)網(wǎng)絡(luò)具有極為強(qiáng)大的功能。
在大腦皮層中,約有10^11個神經(jīng)元通過神經(jīng)突觸與大約103個其它神經(jīng)元相連,形成了一個高度復(fù)雜高度靈活的動態(tài)網(wǎng)絡(luò)。正是這樣一個龐大而精密的神經(jīng)網(wǎng)絡(luò)系統(tǒng),讓人類得以從事各項復(fù)雜精巧的工作,從而開創(chuàng)了屬于人類的文化與歷史。
接下來,我們將神經(jīng)網(wǎng)絡(luò)細(xì)化至單個的神經(jīng)元細(xì)胞。在神經(jīng)元細(xì)胞中,外部刺激通過樹突輸入至細(xì)胞體。當(dāng)細(xì)胞體接收的信號量超過某個閾值時,細(xì)胞體就會被激活,產(chǎn)生電脈沖,并將電位信號沿著軸突并通過突觸傳遞到其它神經(jīng)元。神經(jīng)元細(xì)胞的工作機(jī)制,啟發(fā)軟件工程師設(shè)計出一種最為基本簡單的神經(jīng)網(wǎng)絡(luò)模型結(jié)構(gòu),也即右圖所示的感知器模型。
- 感知器模型包括了由兩個輸入神經(jīng)元組成的輸入層和一個輸出神經(jīng)元的輸出層,能夠完成基礎(chǔ)的與或非運(yùn)算。
此后,工程師們便在單個網(wǎng)絡(luò)模型基礎(chǔ)上不斷豐富完善,搭建多個信息處理層,構(gòu)建各種激勵和損失函數(shù),并用網(wǎng)絡(luò)相互關(guān)聯(lián)各層的多個細(xì)胞,組合構(gòu)成出一個龐大可觀的復(fù)雜神經(jīng)網(wǎng)絡(luò)決策模型。
其中,長短期記憶LSTM神經(jīng)網(wǎng)絡(luò)是以循環(huán)神經(jīng)網(wǎng)絡(luò)RNN為基礎(chǔ)算法模板的改進(jìn)算法。極大地優(yōu)化了對于長期依賴信息的學(xué)習(xí)過程,為長期隨機(jī)過程序列數(shù)據(jù)的機(jī)器學(xué)習(xí)提供了一份較好的解決方案。
二、時間序列與神經(jīng)網(wǎng)絡(luò)
1.傳統(tǒng)神經(jīng)網(wǎng)絡(luò)的局限性
傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)模型在對于某一類型的數(shù)據(jù)處理上顯得有些捉襟見肘。這便是所謂的隨機(jī)過程,也即傳統(tǒng)意義上所說的“時間序列數(shù)據(jù)”。這類數(shù)據(jù)相較于常規(guī)數(shù)據(jù)而言,其隨機(jī)變量的變化依賴于某一特定參數(shù)(通常自變量軸為時間),也即在時間軸上的不同時間點(diǎn)處具有不同的變化特征的一類數(shù)據(jù)。傳統(tǒng)神經(jīng)網(wǎng)絡(luò)只能單次處理孤立的輸入信息并產(chǎn)生輸出,但在輸入輸出的前后序列間卻沒有構(gòu)建充分的關(guān)聯(lián)。
- 打個比方,在英語完形填空的題目上,I grew up in China. There’s many delicious food…I speak(?)。此處根據(jù)邏輯判斷,很輕易便能依照前文的China聯(lián)想到“Chinese”。但是對于計算機(jī)的神經(jīng)網(wǎng)絡(luò)模型而言,卻是很難推測出這一缺失信息的。
- 另一個例子是,如今的拼音輸入法能夠根據(jù)前文的輸入內(nèi)容自動猜測后續(xù)內(nèi)容,在詞性推測、語義推斷和輸入習(xí)慣上都進(jìn)行了充分學(xué)習(xí)。但是以前常用的智能ABC輸入法,只能根據(jù)單個輸入預(yù)測下一詞,而不能從整體給出判斷建議,也是傳統(tǒng)神經(jīng)網(wǎng)絡(luò)短板的集中體現(xiàn)。
對于隨機(jī)過程的時間序列數(shù)據(jù)而言,其重要特征和意義,往往就蘊(yùn)含于序列的前后關(guān)聯(lián)性上,常常具備時間相關(guān)性。因此,傳統(tǒng)神經(jīng)網(wǎng)絡(luò)所采用的簡單分類劃分的策略,不再普遍適用于此類數(shù)據(jù)的學(xué)習(xí)與預(yù)測。
2.循環(huán)神經(jīng)網(wǎng)絡(luò)RNN
循環(huán)神經(jīng)網(wǎng)絡(luò)RNN是一類以序列數(shù)據(jù)為輸入,并在序列的演進(jìn)方向遞歸且所有節(jié)點(diǎn)按鏈?zhǔn)竭B接的遞歸神經(jīng)網(wǎng)絡(luò)。RNN的引入最初是為了解決時間序列數(shù)據(jù)的機(jī)器學(xué)習(xí)問題的,可被視為同一神經(jīng)網(wǎng)絡(luò)的多次復(fù)制和循環(huán)消息傳遞,其鏈?zhǔn)降奶卣髂軌蜉^好揭示序列的相關(guān)性。RNN的輸入和輸出能夠前后關(guān)聯(lián),便于存儲長期記憶,并隨時根據(jù)當(dāng)前的輸入對狀態(tài)進(jìn)行更新,克服了傳統(tǒng)神經(jīng)網(wǎng)絡(luò)的短板。
但是,當(dāng)RNN學(xué)習(xí)的序列間隔不斷增大時,其對信息的學(xué)習(xí)能力會不斷衰減至0,從而產(chǎn)生了長期記憶的依賴問題,也即RNN對于長記憶依賴關(guān)系的學(xué)習(xí)能力趨近于0。
3.長短期記憶神經(jīng)網(wǎng)絡(luò)LSTM
長短期記憶神經(jīng)網(wǎng)絡(luò)LSTM是在RNN的循環(huán)神經(jīng)網(wǎng)絡(luò)上加以改造和優(yōu)化的神經(jīng)網(wǎng)絡(luò)模型,通過在RNN的重復(fù)神經(jīng)網(wǎng)絡(luò)模塊基礎(chǔ)上引入四層神經(jīng)網(wǎng)絡(luò)交互層,極大地優(yōu)化了對于長期依賴信息的學(xué)習(xí)過程,為長期隨機(jī)過程序列數(shù)據(jù)的機(jī)器學(xué)習(xí)提供了一份較好的解決方案。
在LSTM中,其關(guān)鍵在于細(xì)胞狀態(tài)。類似于傳送帶,細(xì)胞狀態(tài)呈水平線在整個鏈圖上貫穿運(yùn)行,而LSTM則通過精心設(shè)計的三大門層結(jié)構(gòu),控制信息在細(xì)胞上的傳遞與交互,從而影響對序列數(shù)據(jù)的學(xué)習(xí)效果。
三大門層是LSTM神經(jīng)網(wǎng)絡(luò)的核心,包括決定從細(xì)胞狀態(tài)中丟棄信息的忘記門層、確定添加至細(xì)胞狀態(tài)中信息的輸入門層和確認(rèn)過濾后輸出信息內(nèi)容的輸出門層。三大門層的核心內(nèi)涵如下:
- 忘記門層:對于前一狀態(tài)矩陣中每個輸入值都會產(chǎn)生一個對應(yīng)的向量,該向量中的0-1值表示細(xì)胞狀態(tài)中的信息遺忘的程度。具體邏輯如圖所示。
- 輸入門層:在輸入邏輯上,首先利用輸入門層篩選所需要更新的信息,然后利用內(nèi)部的一個tanh層得到新的候選細(xì)胞信息。接下來,通過忘記門層篩選忘記舊細(xì)胞信息的一部分(σ),再通過輸入門層選擇添加候選細(xì)胞信息的一部分(忘記后剩下的部分與新添加信息的權(quán)重加和),從而更新得到新的細(xì)胞信息。
- 輸出門層:細(xì)胞狀態(tài)更新完畢后,將輸入信息經(jīng)過輸出門層的sigmoid層得到判斷條件,然后將細(xì)胞狀態(tài)經(jīng)過tanh層激活得到一個-1~1之間值的向量。該向量再與輸出門得到的判斷條件相乘,便得到了該層LSTM網(wǎng)絡(luò)的輸出結(jié)果。
整體流程:遺忘→根據(jù)現(xiàn)有的輸入和上一個細(xì)胞的輸出更新狀態(tài)→根據(jù)現(xiàn)有的狀態(tài)輸出預(yù)測值。
在上述所列示的圖中,有幾個要點(diǎn):
-
LSTM模塊當(dāng)中的線就是狀態(tài)矩陣C和輸出h的流動,一般來說變動很少,主線是最上面那條直線,其他的線都是對這條主要流動線進(jìn)行微加工。
-
里面有一些黃色方塊代表層:σ激活層輸出0到1的值,代表權(quán)重;tanh層表示對輸入進(jìn)行激活,輸出新的候選值。
-
粉色的部分代表操作,x號代表矩陣點(diǎn)乘,+代表添加,tanh代表運(yùn)算。
概括來說,LSTM上細(xì)胞狀態(tài)信息流動過程的主要特征可總結(jié)為以下三點(diǎn):
- 基于RNN,更好適應(yīng)刻畫時間序列長記憶依賴關(guān)系。具有更多的神經(jīng)網(wǎng)絡(luò)重復(fù)模塊鏈結(jié)構(gòu)層數(shù),構(gòu)建門層方式用以交互。相較于BP神經(jīng)網(wǎng)絡(luò)和傳統(tǒng)RNN模型具有更高的預(yù)測準(zhǔn)確度。
- LSTM具備優(yōu)異的特征,包括時間序列特性、選擇記憶特性以及信息門層邏輯的架構(gòu)。
- LSTM作為一種模型本身,自然也具備一些短板和不足。其中最大的缺陷便是“時滯效應(yīng)”,也即預(yù)測值可能在時間軸上相較真實(shí)值具備滯后性。這一現(xiàn)象產(chǎn)生的原因可追溯至?xí)r間序列本身所存在的自相關(guān)特性,可通過對時間序列數(shù)據(jù)采用廣義差分法等消減自相關(guān)性,或者調(diào)整優(yōu)化模型訓(xùn)練參數(shù)來較好規(guī)避。
通過上述基本邏輯,LSTM模型便可初步實(shí)現(xiàn)通過充分利用過往時間序列信息對未來時點(diǎn)信息進(jìn)行預(yù)測的機(jī)制。
4.采用LSTM模型研究的優(yōu)勢
在金融數(shù)據(jù)等時間序列數(shù)據(jù)的研究中廣泛應(yīng)用LSTM模型進(jìn)行學(xué)習(xí)訓(xùn)練和預(yù)測,已逐漸成為當(dāng)下數(shù)據(jù)分析和機(jī)器學(xué)習(xí)的熱點(diǎn)話題。這是由于LSTM對于這一類數(shù)據(jù)的學(xué)習(xí)上,具有諸多獨(dú)特的優(yōu)勢和特點(diǎn):
- LSTM模型能便利地利用已有現(xiàn)成封裝的包keras、廣泛應(yīng)用于機(jī)器學(xué)習(xí)算法中的數(shù)據(jù)流編程符號數(shù)學(xué)系統(tǒng)TensorFlow,對于初學(xué)者較為友好。
- 在目前的實(shí)證研究中,綜合比較類似模型而言,LSTM模型對于時間序列分析的擬合優(yōu)度較高,能較好解決梯度消失和梯度爆炸的問題,從而規(guī)避在實(shí)證研究和預(yù)測中,資產(chǎn)價格出現(xiàn)大幅度偏離實(shí)際的極端情況。
- LSTM模型的構(gòu)建和使用過程能較好對接tushare接口所導(dǎo)出的數(shù)據(jù)格式,也能較好發(fā)揮python這一高級編程語言及其配套環(huán)境的資源稟賦優(yōu)勢。
三、滬深股指實(shí)證研究
利用前文的tushare和python工具獲取并保存證券市場股票數(shù)據(jù),在接下來的代碼中采用lstm神經(jīng)網(wǎng)絡(luò)對本地保存的金融序列數(shù)據(jù)進(jìn)行預(yù)測分析并生成圖片。
1.導(dǎo)入相關(guān)包
在代碼中引入了keras包,采用該神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)庫提供的現(xiàn)成LSTM模型,對所獲取的股票時間序列數(shù)據(jù)加以學(xué)習(xí)與訓(xùn)練,可為模型訓(xùn)練提供充足便利。此外,還引入了一個強(qiáng)力的機(jī)器學(xué)習(xí)庫sklearn(scikit-learn),用于進(jìn)行數(shù)據(jù)預(yù)處理,能夠極大節(jié)省編程時間和代碼量。讓用戶得以擁有更多的精力去分析數(shù)據(jù)分布,調(diào)整模型和修改超參。
import numpy as np import matplotlib.pyplot as plt import pandas as pd import warnings import os os.environ["CUDA_VISIBLE_DEVICES"]="-1"#限于各驅(qū)動程序差異,此處禁止GPU運(yùn)算處理 from keras.models import Sequential from keras.optimizers import Adam from keras.layers import Dense, LSTM, LeakyReLU, Dropout from sklearn.preprocessing import MinMaxScaler2.讀入數(shù)據(jù)
將待獲取的股票代碼存為列表,通過遍歷的方式將此前存儲的股票數(shù)據(jù)文件加以讀取。
stock=['601318','601988','601939','600519','002230','000858','002594','601099','600019','600036']for i in stock:filepath="D:/Documents/finance/data/"+str(i)ds = pd.read_csv(filepath+".csv",index_col="ts_code")[["pct_chg","close","open","high","low"]]#讀取表格中的各項數(shù)據(jù)3.數(shù)據(jù)預(yù)處理
通過sklearn包中MinMaxScaler()的fit_transform()對數(shù)據(jù)進(jìn)行歸一化和訓(xùn)練轉(zhuǎn)化處理。
min_max_scaler = MinMaxScaler()#對數(shù)據(jù)進(jìn)行均一化處理close_price = ds[['close']]close_norm_data = min_max_scaler.fit_transform(close_price.values)open_price = ds[['open']]open_norm_data = min_max_scaler.fit_transform(open_price.values)high_price = ds[['high']]high_norm_data = min_max_scaler.fit_transform(high_price.values)low_price = ds[['low']]low_norm_data = min_max_scaler.fit_transform(low_price.values)4.LSTM模型訓(xùn)練
根據(jù)所選時間序列數(shù)據(jù)的實(shí)際特征,設(shè)置相應(yīng)的訓(xùn)練和測試參數(shù),用于對數(shù)據(jù)進(jìn)行更好的預(yù)處理。例如此處將past_history設(shè)為5,future_target設(shè)為0,并按TRAIN_SPLIT取了模型的前80%進(jìn)行訓(xùn)練,后20%用于模型測試。按上述參數(shù)調(diào)用univariate_data函數(shù),分別獲取預(yù)處理后的訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集。
past_history = 5future_target = 0# 取 80%數(shù)據(jù)進(jìn)行訓(xùn)練 20%進(jìn)行測試TRAIN_SPLIT = int(len(close_norm_data) * 0.8)# 訓(xùn)練數(shù)據(jù)集x_train, y_train = univariate_data(close_norm_data,open_norm_data,high_norm_data,low_norm_data,0,TRAIN_SPLIT,past_history,future_target)# 測試數(shù)據(jù)集x_test, y_test = univariate_data(close_norm_data,open_norm_data,high_norm_data,low_norm_data,TRAIN_SPLIT,len(close_norm_data),past_history,future_target)配置神經(jīng)網(wǎng)絡(luò)相關(guān)的參數(shù),按照數(shù)據(jù)與模型特征和訓(xùn)練實(shí)際要求,以達(dá)到更為優(yōu)越的訓(xùn)練與擬合結(jié)果。相關(guān)參數(shù)在機(jī)器學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)的訓(xùn)練中具有通用意義。
- num_units:LSTM網(wǎng)絡(luò)輸出結(jié)果向量的維度。
- learning_rate:學(xué)習(xí)率,控制模型學(xué)習(xí)進(jìn)度。
- activation_function:激活函數(shù),定義神經(jīng)網(wǎng)絡(luò)節(jié)點(diǎn)在給定輸入或輸入集合下輸出。
- loss_function:損失函數(shù),估量模型的預(yù)測值與真實(shí)值的不一致程度,表征魯棒性。
- batch_size:一次訓(xùn)練所選取的樣本數(shù)。
- num_epochs:樣本批次的訓(xùn)練迭代次數(shù)。
- Input_shape(x,y):規(guī)定了時間上展開框的個數(shù)以及每個時刻輸入樣本向量的維度。
上述參數(shù)指定完畢后,即可開始編譯模型并指定相應(yīng)參數(shù)變量。采用model.fit()函數(shù)訓(xùn)練LSTM模型,并返回一個名為history的對象,用于在周期結(jié)束時記錄跟蹤的損失和所指定的參數(shù)。
# Initialize the RNNmodel = Sequential()# input_shape 時間步,每個時間步的特征長度(dim)model.add(LSTM(units=num_units, activation=activation_function, input_shape=(4, 5)))model.add(LeakyReLU(alpha=0.5))model.add(Dropout(0.2))model.add(Dense(units=1))# Compiling the RNNmodel.compile(optimizer=adam, loss=loss_function)# 訓(xùn)練模型# Using the training set to train the modelhistory = model.fit(x_train,y_train,validation_split=0.1,batch_size=batch_size,epochs=num_epochs,shuffle=False)- validation_split:指定一部分訓(xùn)練數(shù)據(jù)作為驗證集
- shuffle:指定每個epoch開始前是否打亂訓(xùn)練集數(shù)據(jù)順序(由于時間序列相關(guān)數(shù)據(jù)的特性恰恰體現(xiàn)在其順序相關(guān)性上,因此在時間序列的訓(xùn)練中該參數(shù)應(yīng)被禁用)
5.可視化繪制
模型訓(xùn)練完畢后,將數(shù)據(jù)格式處理為pd.DataFrame,并調(diào)用matplotlib.pyplot對結(jié)果進(jìn)行可視化繪圖,便于直觀衡量模型的訓(xùn)練和測試結(jié)果,分析并比較模型的擬合優(yōu)度和有效性。
#繪圖并加入標(biāo)簽original_value = min_max_scaler.inverse_transform(y_test).flatten()predictions_value = min_max_scaler.inverse_transform(model.predict(x_test)).flatten()df_result = pd.DataFrame({"key": pd.Series(range(0, len(original_value))), "original": original_value, "predictions": predictions_value})df_result["original"].plot(label="original")df_result["predictions"].plot(label="predictions")plt.xlabel('time')plt.ylabel('index')plt.title('Stock:'+i+'\'s chart')plt.legend()plt.savefig(filepath+"lstm.png")plt.close()四、預(yù)測結(jié)果
我們在python中編譯運(yùn)行上述代碼,將10只股票1318個交易日內(nèi)的開盤價(open)、最高價(high)、最低價(low)、收盤價(close)進(jìn)行歸一化處理后導(dǎo)入LSTM模型,取其中80%的數(shù)據(jù)(約1055個交易日的股票數(shù)據(jù))對神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練,并用剩余的數(shù)據(jù)對模型加以驗證。利用matplotlib包提供的可視化工具將進(jìn)行訓(xùn)練預(yù)測后10只股票真實(shí)值和預(yù)測值折線圖繪制如下:
上圖中,藍(lán)色線為原始數(shù)據(jù),橙色線為預(yù)測線。我們可以明顯觀察得出,經(jīng)由LSTM神經(jīng)網(wǎng)絡(luò)訓(xùn)練后的預(yù)測曲線和原始數(shù)據(jù)曲線走勢的重合度較高,證明該模型能夠較好預(yù)測擬合證券市場股票的價格走勢。
不過,從圖中仍可看出LSTM的些許弊端,例如預(yù)測值存在時滯效應(yīng),預(yù)測效果仍較差強(qiáng)人意等,可通過改進(jìn)模型算法、參數(shù)調(diào)整、數(shù)據(jù)預(yù)處理等方式進(jìn)一步優(yōu)化模型的擬合精度。
總結(jié)
總而言之,LSTM是一種基于RNN的長短期記憶神經(jīng)網(wǎng)絡(luò),通過精心設(shè)計的“三大門層”架構(gòu),對細(xì)胞狀態(tài)中的數(shù)據(jù)加以選擇性過濾,能夠更好刻畫時間序列的長記憶依賴關(guān)系。相較于BP、RNN等傳統(tǒng)神經(jīng)網(wǎng)絡(luò)模型而言,LSTM對于時間序列的學(xué)習(xí)具有更高的預(yù)測準(zhǔn)確度。盡管LSTM模型本身也具備“時滯效應(yīng)”的短板,不過隨著模型的不斷豐富和優(yōu)化,LSTM的優(yōu)勢正被不斷挖掘和凸顯。各種在LSTM基礎(chǔ)上衍生而出的變種算法也不斷涌現(xiàn)。相信在不遠(yuǎn)的將來,LSTM模型的應(yīng)用領(lǐng)域?qū)訌V泛。
總結(jié)
以上是生活随笔為你收集整理的LSTM神经网络在证券市场分析上的应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ios 热更新可行性分析
- 下一篇: 上海音乐学院计算机考研难吗,上海音乐学院