IEEE網(wǎng)日前登載馬塞爾·格羅特和賈斯汀·博格納的文章稱,研究人員開發(fā)了一個(gè)基于人工智能的系統(tǒng),使用機(jī)器學(xué)習(xí)模型預(yù)測(cè)股票價(jià)格,并根據(jù)結(jié)果自動(dòng)執(zhí)行交易。
許多系統(tǒng)使用人工智能(AI)來(lái)解決復(fù)雜的問題。雖然這通常會(huì)提高系統(tǒng)效率,但開發(fā)可用于生產(chǎn)的基于人工智能的系統(tǒng)是一項(xiàng)艱巨的任務(wù)。因此,需要扎實(shí)的人工智能工程實(shí)踐來(lái)確保最終系統(tǒng)的質(zhì)量并改進(jìn)開發(fā)過程。雖然已經(jīng)提出了一些用于開發(fā)基于人工智能的系統(tǒng)的實(shí)踐,但應(yīng)用這些實(shí)踐的詳細(xì)實(shí)踐經(jīng)驗(yàn)卻很少。
如今,越來(lái)越多的關(guān)鍵軟件系統(tǒng)基于人工智能(AI)和機(jī)器學(xué)習(xí)(ML),例如自動(dòng)駕駛汽車、電網(wǎng)管理軟件或自主股票交易系統(tǒng)。雖然這實(shí)現(xiàn)了以前不可能實(shí)現(xiàn)的功能,但基于人工智能的系統(tǒng)也帶來(lái)了額外的復(fù)雜性和新的工程挑戰(zhàn)。例如有效管理大量數(shù)據(jù)、確保系統(tǒng)安全性和可靠性、管理新型技術(shù)債務(wù)或選擇正確的架構(gòu)。由于關(guān)鍵系統(tǒng)的故障可能會(huì)產(chǎn)生嚴(yán)重的負(fù)面后果,因此確保所開發(fā)系統(tǒng)的質(zhì)量非常重要。為了實(shí)現(xiàn)這一目標(biāo),軟件工程研究和實(shí)踐為傳統(tǒng)軟件系統(tǒng)的開發(fā)提出了許多指南和最佳實(shí)踐,并且它們的使用在過去40年中大幅增加。
研究選擇的一個(gè)流行示例是使用機(jī)器學(xué)習(xí)來(lái)預(yù)測(cè)股票價(jià)格走勢(shì)以支持股票交易。有許多關(guān)于此用例的可行機(jī)器學(xué)習(xí)模型的論文、,這使得從更全面、以系統(tǒng)為中心的角度來(lái)看待這個(gè)主題變得特別有趣。此外,開發(fā)這樣一個(gè)自主股票交易系統(tǒng)非常復(fù)雜,不能被視為“玩具示例”,并且具有足夠的挑戰(zhàn)性,需要良好的工程實(shí)踐。對(duì)于這樣的系統(tǒng)有許多不同的投資策略。它們可以根據(jù)投資者在出售股票之前打算持有股票的時(shí)間進(jìn)行細(xì)分。研究主要考慮持有投資時(shí)間少于一天的情況。這被描述為日內(nèi)交易。在某些情況下,還考慮持有投資最多一周,這稱為短期投資。
為了保持評(píng)估實(shí)踐的數(shù)量可控,研究人員選擇了10個(gè)實(shí)踐進(jìn)行案例研究。目標(biāo)是提高多個(gè)類別的質(zhì)量,例如數(shù)據(jù)、培訓(xùn)、部署等,但也挑選了一些研究預(yù)計(jì)會(huì)對(duì)大多數(shù)開發(fā)過程產(chǎn)生影響的實(shí)踐。選擇了以下做法:
1. 標(biāo)準(zhǔn)化和自動(dòng)化數(shù)據(jù)質(zhì)量檢查程序,以確保僅使用有效數(shù)據(jù)進(jìn)行訓(xùn)練或測(cè)試。
2. 使用錯(cuò)誤驗(yàn)證和分類來(lái)深入了解ML模型何時(shí)以及為何失敗,從而提高其可靠性。
3. 以易于測(cè)量和理解的指標(biāo)來(lái)捕獲訓(xùn)練目標(biāo),以提高可解釋性并避免糾纏的測(cè)量。
4. 使用交叉驗(yàn)證來(lái)避免在已經(jīng)見過的數(shù)據(jù)上測(cè)試ML組件。
5. 持續(xù)測(cè)量模型質(zhì)量、性能和漂移,以便盡早發(fā)現(xiàn)并修復(fù)錯(cuò)誤。
6. 檢查模型訓(xùn)練腳本以確保其質(zhì)量。最初的做法是提出同行評(píng)審。由于研究案例研究中的大部分開發(fā)都是由一名開發(fā)人員完成的,因此研究概括了這種做法,以便同一開發(fā)人員稍后進(jìn)行審查。
7. 測(cè)試所有特征提取代碼,以確保轉(zhuǎn)換后的數(shù)據(jù)一致且準(zhǔn)確。
8. 自動(dòng)執(zhí)行超參數(shù)優(yōu)化和模型選擇,以節(jié)省探索時(shí)間并提高模型質(zhì)量。
9. 將預(yù)測(cè)結(jié)果與模型版本和輸入數(shù)據(jù)一起記錄,以提供有關(guān)如何改進(jìn)模型的見解。最初的做法建議在部署后記錄預(yù)測(cè)。因?yàn)檠芯肯M@種做法在其他地方有用,所以研究將其推廣到也可以在開發(fā)和測(cè)試期間使用。
10. 與多學(xué)科利益相關(guān)者合作,通過特定領(lǐng)域的知識(shí)簡(jiǎn)化開發(fā)并改進(jìn)最終的軟件。最初的實(shí)踐只考慮與團(tuán)隊(duì)成員的協(xié)作,但研究將這種實(shí)踐推廣到另外包括相關(guān)的外部利益相關(guān)者。
交易系統(tǒng)完全用Python編程。它由幾個(gè)從主文件調(diào)用的模塊化Python文件組成。對(duì)于智力創(chuàng)造而言,機(jī)器學(xué)習(xí)培訓(xùn)組件使用歷史股票數(shù)據(jù)的大型數(shù)據(jù)集訓(xùn)練ML模型。在此過程中,特征提取組件用于提供訓(xùn)練輸入。最終模型被嵌入到機(jī)器學(xué)習(xí)預(yù)測(cè)組件,對(duì)應(yīng)系統(tǒng)的智能實(shí)現(xiàn)。該組件是從主要的組件通過接收到的數(shù)據(jù)近期市場(chǎng)數(shù)據(jù)組件,該組件又從外部API獲取數(shù)據(jù)。然后將這一推斷的結(jié)果,即最有前途的股票交給商人組件,它再次使用外部API來(lái)投資這些股票。
Pandas用于存儲(chǔ)提取的特征,而ML訓(xùn)練的歷史庫(kù)存數(shù)據(jù)存儲(chǔ)在CSV文件中。對(duì)于每只股票,每個(gè)歷史日代表一個(gè)由七個(gè)特征組成的數(shù)據(jù)點(diǎn):前一天最高價(jià)和最低價(jià)之間的相對(duì)差異、收盤價(jià)和開盤價(jià)之間的相對(duì)差異、過去7、14和21日價(jià)格的移動(dòng)平均線天數(shù)、標(biāo)準(zhǔn)差除以過去7天的移動(dòng)平均線,最后是前一天的庫(kù)存量。此外,每個(gè)數(shù)據(jù)點(diǎn)都根據(jù)當(dāng)天的最高股價(jià)漲幅進(jìn)行標(biāo)記。在股市開盤前,運(yùn)行系統(tǒng)使用AlpacaAPI接收過去21天的股票數(shù)據(jù),以創(chuàng)建訓(xùn)練數(shù)據(jù)格式的數(shù)據(jù)點(diǎn)。
一組k最近鄰模型預(yù)測(cè)當(dāng)天最賺錢股票的排名。股市一開盤,系統(tǒng)就會(huì)買入前五只股票的股票,并根據(jù)預(yù)測(cè)設(shè)定止盈價(jià)格加上預(yù)先設(shè)定的止損價(jià)格。無(wú)需監(jiān)控投資,因?yàn)橐坏┻_(dá)到止盈或止損價(jià)格,交易平臺(tái)會(huì)自動(dòng)出售所購(gòu)買的股票。此外,系統(tǒng)會(huì)在股市收盤前三分鐘出售所有剩余股票。這避免了一天內(nèi)大量的API調(diào)用。研究決定該系統(tǒng)應(yīng)該投資于納斯達(dá)克股票市場(chǎng),因?yàn)檫@是全球最大的股票交易電子市場(chǎng)。

系統(tǒng)架構(gòu)圖
機(jī)器學(xué)習(xí)實(shí)施對(duì)系統(tǒng)設(shè)計(jì)的巨大影響
一開始的一個(gè)基本設(shè)計(jì)問題圍繞著系統(tǒng)如何選擇要投資的股票。最初,研究考慮預(yù)先過濾股票,例如基于價(jià)格的強(qiáng)勁上漲,以減少必要的預(yù)測(cè)數(shù)量。此外,研究不確定用于預(yù)測(cè)的具體庫(kù)存數(shù)據(jù)。日內(nèi)數(shù)據(jù)似乎是最有希望的,但在開發(fā)階段,使用這些數(shù)據(jù)訓(xùn)練的模型都沒有足夠的精度,這使研究也考慮了每日股票數(shù)據(jù)。其中許多問題強(qiáng)烈影響了系統(tǒng)的架構(gòu)和工作流程。例如,如果模型僅使用每日股票數(shù)據(jù),則可以在股市開盤前進(jìn)行預(yù)測(cè)。
解決方案:一旦研究意識(shí)到這種強(qiáng)大的影響力,研究就將重點(diǎn)放在機(jī)器學(xué)習(xí)組件上,通過實(shí)施和比較具有不同投資策略的各種機(jī)器學(xué)習(xí)模型來(lái)檢測(cè)最有效的股票預(yù)測(cè)方法。只有在研究找到了最有效的策略之后(使用每日股票數(shù)據(jù);只考慮前一天至少上漲10%的股票;開盤就買入股票;一旦預(yù)測(cè)盈利、預(yù)定損失就賣出股票),或者一天結(jié)束了),然后研究改變了整體系統(tǒng)設(shè)計(jì)和工作流程以匹配這一策略。
尋找機(jī)器學(xué)習(xí)訓(xùn)練的有效數(shù)據(jù)源
雖然Alpaca API非常適合在運(yùn)行時(shí)檢索最近的股票價(jià)格,但對(duì)歷史ML訓(xùn)練數(shù)據(jù)的要求卻截然不同。為了找到合適的來(lái)源,研究進(jìn)行了更系統(tǒng)的搜索,結(jié)果表明最流行的API是Alpha Vantage API。與其他選項(xiàng)相比,它提供了最佳的數(shù)據(jù)質(zhì)量、歷史記錄和粒度。
高效檢索ML訓(xùn)練數(shù)據(jù)
Alpha Vantage API提供過去720天的庫(kù)存數(shù)據(jù)。一只股票的數(shù)據(jù)分為24個(gè)CSV文件,每個(gè)文件代表30天,API每天允許500個(gè)請(qǐng)求(即文件)。因此,檢索所有4,927只納斯達(dá)克股票的數(shù)據(jù)需要237天。該API還限制每分鐘5個(gè)請(qǐng)求。
解決方案:由于這些限制,研究決定只關(guān)注市值至少為20億美元的股票。在納斯達(dá)克,共有707只股票。檢索他們的數(shù)據(jù)需要16,968個(gè)API請(qǐng)求,即500個(gè)請(qǐng)求花了34天。此外,檢索腳本需要在請(qǐng)求之間等待足夠長(zhǎng)的時(shí)間,以遵守每分鐘5個(gè)請(qǐng)求的限制。在收到大約400只股票的數(shù)據(jù)后,研究決定首先專注于開發(fā)有效的模型,然后再檢索更多股票。
特征提取
當(dāng)研究仍然使用日內(nèi)數(shù)據(jù)訓(xùn)練模型時(shí),訓(xùn)練數(shù)據(jù)大小為3.57GB。提取特征需要3到18分鐘,這大大減慢了調(diào)整過程。由于研究在調(diào)優(yōu)過程中經(jīng)常更改特征,因此存儲(chǔ)提取的特征并不能解決這個(gè)問題。
解決方案:作為一種解決方法,研究決定僅使用10只股票的數(shù)據(jù),其特征提取時(shí)間不到一分鐘。一旦使用這個(gè)小數(shù)據(jù)集的調(diào)整過程得到了令人滿意的模型,研究就開始在更大的數(shù)據(jù)集上測(cè)試模型。之后,研究靜態(tài)存儲(chǔ)提取的特征,因?yàn)榧虞d它們只需要不到一秒的時(shí)間。這完全解決了問題,但只有在特征選擇穩(wěn)定時(shí)才有效。當(dāng)研究后來(lái)切換到每日數(shù)據(jù)時(shí),特征提取時(shí)間減少到平均14秒,這也不再是問題。
數(shù)據(jù)質(zhì)量
許多檢索到的日內(nèi)文件包含空白。在大多數(shù)情況下,只缺失幾分鐘,但間隙有時(shí)可能長(zhǎng)達(dá)數(shù)小時(shí)、數(shù)天,甚至在極少數(shù)極端情況下長(zhǎng)達(dá)數(shù)月。很難估計(jì)這些差距的負(fù)面影響,這使得確定合理的閾值變得具有挑戰(zhàn)性。編寫復(fù)雜的腳本來(lái)檢查所有文件也需要額外的工作。
解決方案:自治系統(tǒng)需要基本級(jí)別的自動(dòng)數(shù)據(jù)質(zhì)量保證。因此,研究實(shí)施了自動(dòng)化質(zhì)量檢查程序。為了避免過于復(fù)雜的解決方案和較長(zhǎng)的運(yùn)行時(shí)間,研究使用每個(gè)文件的行數(shù)作為指標(biāo)。如果文件包含的行數(shù)少于100行,則將從訓(xùn)練集中刪除完整的關(guān)聯(lián)股票數(shù)據(jù)。事實(shí)證明,選擇一個(gè)簡(jiǎn)單的解決方案是正確的決定,因?yàn)檠芯亢髞?lái)還是轉(zhuǎn)向了每日數(shù)據(jù)。在開始模型開發(fā)之前為提高數(shù)據(jù)質(zhì)量付出更多努力會(huì)浪費(fèi)時(shí)間。早期,研究建議首先在一小部分高質(zhì)量數(shù)據(jù)上開發(fā)一個(gè)令人滿意的模型,然后再花費(fèi)大量時(shí)間來(lái)提高整體數(shù)據(jù)質(zhì)量。
文件管理
研究總共收到了412只股票的9,888個(gè)文件,這不僅難以管理,也使培訓(xùn)過程變得不必要的復(fù)雜。如果每個(gè)股票只有一個(gè)文件,訓(xùn)練腳本會(huì)簡(jiǎn)單得多。
解決方案:研究修改了股票數(shù)據(jù)檢索腳本,以便對(duì)每個(gè)收到的股票執(zhí)行此合并。這需要一些額外的工作,特別是因?yàn)樾枰匦屡判蛭募?nèi)容。盡管如此,這極大地簡(jiǎn)化了特征提取代碼,從而提高了代碼的可理解性并簡(jiǎn)化了剩余的開發(fā)。
選擇有效的機(jī)器學(xué)習(xí)算法
對(duì)文獻(xiàn)的初步調(diào)查顯示,許多專家建議使用支持向量機(jī)(SVM)來(lái)預(yù)測(cè)股票走勢(shì)。然而,這種類型的模型在研究的數(shù)據(jù)上表現(xiàn)不佳。因此,研究開始使用不同的數(shù)據(jù)集(日內(nèi)或每日數(shù)據(jù))手動(dòng)測(cè)試許多不同的模型,但最初無(wú)法確定明顯的獲勝者。
解決方案:研究創(chuàng)建了一種自動(dòng)模型選擇方法來(lái)以最高精度檢測(cè)模型。最初,決策樹取得了最好的結(jié)果,但隨著特征選擇的變化,其他模型表現(xiàn)最好。最后,模型選擇方法表明k近鄰具有最好的精度,因此研究更加注重改進(jìn)此類模型。