还在买白酒?算法工程师们,量化投资了解一下
文 | 阿財@知乎?
本文已獲作者授權,禁止二次轉載
賺取你認知中的Alpha
堅持用量化的觀點去看待宇宙的終極問題:買不買,賣不賣。
很多人的在互聯網這一片方寸之地,表現出來的行為是矛盾的。舉個例子,相信技術指標在交易實踐毫無用處的人(前面幾篇文章里評論者不乏這樣的觀點)應該不會看知乎上討論和教學量化的文章,他們就堅持主觀交易就好了,否則拿什么東西去量化因子,基本面因子都算是廣義上的技術指標。
量化交易者必須不能行為和認知產生割裂,很多人不明白,割裂了做不成量化,量化的過程其實就是:你本人價值觀 ——> 選擇策略方式 ——> 發掘因子 ——> 程序代碼 進行擬合的過程,所以必須 想法和行為合一,就是很多人愛掛在嘴邊的所謂的知行合一。
其實他們的知行并不合一,因為成人的世界非黑即白的,所以我們應該明白幾點:
策略反映價值觀,什么人選擇什么策略,是他們價值觀的體現。
既然是價值觀體現,那么就沒有所謂的絕對高下之分,也沒有什么絕對的有效無效之分,它們必然有適合的市場和適合的時間段,不要去隨便用特警判官式的口吻居高臨下的評判別人的策略不行。
總有初學者壓根不知道自己是什么價值觀,或者價值觀都尚未成型,瞎胡抄別人的策略咋呼。這種行為是沒用的,不是自己的認知賺來的錢,長久以往,他們的盈利最終會輸回去。
認知體現了你的價值觀,價值觀會投射到你的量化交易策略上。沒有自己認知的拿來主義的策略,是無法做演繹和迭代進化的。最終你會在連續的虧損迷茫和懷疑,在時間漫漫的推移中抄來的Alpha也就會鈍化和失效。
程序員都應該看過《人月神話》,人力有時窮,個人無法做完全部的idea,你要設定一個計劃,做自己的因子搜集,測試,優先級,能做的策略太多了,不可能全做。個人精力有限,比如我就放棄了基本面,用編制指數的金融專家幫我選股票基本面的方式圈定股票池。
別聽任何大V跟你講什么交易心態的雞湯,最多講一個月他就會轉移話題到拉群——貴金屬交易所開戶的正路上面了。交易靠心態的話,遲早要還回去,因為人的心態是不穩定的,女性性格缺陷中有大姨媽周期,男性普遍的性格缺陷是男性易有阿斯(比女性高4倍),雙向情感障礙和躁郁癥。從醫學統計上,有著各種各樣心理問題的可以達到人群中總數的35%以上。而且性格缺陷幾乎無解,心理醫生,精神科都解決不了,無論是雙相還是,吃藥也只能維持不能根治。
一個人母胎性格說白了是天生的。如果要靠天吃飯的老天賞個好心態才能解決交易一致性問題,那交易員豈不是比天賦異稟的劉翔還稀少?那大家都只能喝西北風去了。
所以在做交易之前,先確定你的對交易的認知,錢從哪里,怎么賺到的錢,賺錢以后想干什么,把它們都寫進程序里。而交易的一致性,靠的是程序,程序,程序;交易的確定性,來自于是回測統計和貝葉斯公式。
所以我可以在這里放肆的交底牌——我的量化策略來自于我的認知,也正是因為這個原因,我可以很大方的公開出來,因為不信的人就是不會信,他看不進去,這不屬于他的認知,也就不用擔心他會偷走我的策略,分享我的Alpha。
波浪理論
這只是我對量化投資的認知,你可以去尋找你的圣杯去。
波浪理論是證券技術分析的主要理論之一,由美國經濟學家艾略特提出。一些交易員用以分析金融市場周期,預測市場趨勢。拉爾夫·納爾遜·艾略特,專業會計師,于1930年提出分析方法,認為市場價格的走勢具有特定的形態。
艾略特波浪理論:
(https://zh.wikipedia.org/wiki/%E8%89%BE%E7%95%A5%E7%89%B9%E6%B3%A2%E6%B5%AA%E7%90%86%E8%AE%BA)
波浪理論更實踐化和具象化的交易指導思想就是道氏理論和纏論。不是我刻意引流,但是只要稍微研究深入一點,你總會發覺纏論就在不遠處向你招手,是回避不掉的。
教你炒股票1:不會贏錢的經濟人,只是廢人!
(http://blog.sina.com.cn/s/blog_486e105c01000461.html)
當然我對纏論持一種“酒肉穿腸過,佛主留心中”白目狀態:我知道它但我不鉆研它,也不妨礙我運用它。因為只要找到合適的程序代碼,自己改好成適配自己的量化平臺用的就行,原理我理解,所以實踐中能知道這個程序代碼是不是工作正確,這就夠了。
任何鉆研纏論的嘗試很容易導致“辯經”心態,這種現象這在知乎纏論話題下的討論中似乎極為常見。我認為這對我們推進量化交易學習進度是不利的,因為一個35歲程序員兼職做量化的時間并不算多到能拿來揮霍的程度,在某乎跟人討論纏論“辯經”辨贏了,并不能賺到錢的。
我目前使用的纏論筆段分割代碼:
(https://github.com/zengbin93/czsc/github.com)
ARIAM模型
證券市場是周期性重復的,也就是恒沙一樣無數的貪婪和人性,左右了市場的波動行動,最終導致了歷史總會一遍又一遍的重演。
時間序列中的預測模型是什么?
預測涉及使用其歷史數據點預測變量的值,或者還可以涉及在給定另一個變量的值的變化的情況下預測一個變量的變化。預測方法主要分為定性預測和定量預測。時間序列預測屬于定量預測的范疇,其中統計原理和概念應用于變量的給定歷史數據以預測同一變量的未來值。使用的一些時間序列預測技術包括:
自回歸模型(AR)
移動平均模型(MA)
季節回歸模型
分布式滯后模型
如何通俗易懂地解釋ARIMA模型:
(https://pic3.zhimg.com/v2-f2b41a923772474e80bb5955b33d9fd6_180x120.jpg)
這個知識點只需要了解就好了,因為根據實戰應用,它明顯沒有后面的一次九項式靈光。它只是幫助我們驗證一點:股票走勢行情是周期性的,人性撰寫的歷史是一再重演的。
周期分解算法
接上面的ARIAM模型,事實上我們只要稍加實踐,就會發現ARIAM模型在股票的走勢周期預測中擬合效果不好,為什么呢?它的分解級別不夠,它只是進行了一次差分計算,事實上,股票在走勢行情中大約包含了7~17個不同周期級別的分量信號。所以我們需要探索更多更有效的數學和算法途徑。
信號與系統取巧的方法——EEMD經驗模態分解
Mr.括號:這篇文章能讓你明白經驗模態分解(EMD)——基礎理論篇:
(https://pic3.zhimg.com/v2-983c8b1d17943f33cb7a4fc6e5e3d942_180x120.jpg)
實踐出真知,我拿滬深300指數作為范例,使用EEMD分解它的多次信號分量。
Python 代碼如下,我使用CCI進行分解而不是收盤價是因為長期主升浪的股票在單邊走勢中,起始點和最近日期和價格差距超過2倍以上,級別差距過大,會影響到分解指標判斷。
#?python?實現對滬深300的?EEMD分解?解析出不同級別的自回歸周期頻率 import?numpy?as?np from?PyEMD?import?EEMD,?EMD,?Visualisation import?pylab?as?pltfrom?GolemQ.fetch.kline?import?(get_kline_price,get_kline_price_min, ) from?GolemQ.fractal.v0?import?(maxfactor_cross_v2_func, ) from?GolemQ.utils.parameter?import?(AKA,?INDICATOR_FIELD?as?FLD,?TREND_STATUS?as?ST,FEATURES?as?FTR, )if?__name__?==?"__main__":kline,?display_name?=?get_kline_price_min('399300',?frequency='60min',)features?=?maxfactor_cross_v2_func(kline.data)max_imf?=?17S?=?features['CCI'].dropna().tail(480).valuesT?=?range(len(S))#?EEMD計算eemd?=?EEMD()eemd.trials?=?50eemd.noise_seed(12345)E_IMFs?=?eemd.eemd(S,?T,?max_imf)imfNo?=?E_IMFs.shape[0]tMin,?tMax?=?np.min(T),?np.max(T)#?Plot?results?in?a?gridc?=?np.floor(np.sqrt(imfNo?+?1))r?=?np.ceil((imfNo?+?1)?/?c)plt.ioff()plt.subplot(r,?c,?1)plt.plot(T,?S,?'r')plt.xlim((tMin,?tMax))plt.title("399300.XSHE:CCI(14)")for?num?in?range(imfNo):plt.subplot(r,?c,?num?+?2)plt.plot(T,?E_IMFs[num],?'g')plt.xlim((tMin,?tMax))plt.title("Imf?"?+?str(num?+?1))plt.show()運行程序,實際上EEMD算法有個缺點:跟K-Means聚類和隱馬爾科夫鏈HMM算法很像,就是它管分解,但是不管標注或者理解具體模態的含義。
模態的含義(代表主次,漲跌)必須程序員再次處理數據進行解讀,在自動分解出來的結果中,我們還需要寫更多的代碼匹配出我們的“主級別”周期和當前周期。但是因為實踐中并沒有使用這個算法,我就不再列出曾經寫過的主級別和當前周期適配代碼了。
第二個缺點——跟小波分析,聚類分析一樣,未來信息會反向傳播,前面一篇文章中提到的時候已經有網友評論說小波分解和EEMD分解的這個缺陷有專有叫法叫“端點漂移”(因為我一切自己研究,所以叫法有時會自創不同)。時移窗口會發生抖動,但是不影響對波浪所處相位象限區間和趨勢判斷。但是這終究是不好的。所以EEMD經驗模態分解我在量化交易中僅作為理論研究使用。EEMD算法再一次幫助我們驗證一點:股票走勢行情是周期性的,人性撰寫的歷史是一再重演的。
最終我真正量化交易實踐中運用的周期分解方法為
一次九項式擬合
本技巧的原始出處:
唐進民:多項式曲線擬合
(https://pic3.zhimg.com/v2-96702fac9fbdefb7d93aef386ee4d236_ipico.jpg)
這里使用了一個技巧就是滾動窗口計算。
直接上代碼。
def?strided_app(a,?L,?S):??'''Pandas?rolling?for?numpy#?Window?len?=?L,?Stride?len/stepsize?=?S'''nrows?=?((a.size?-?L)?//?S)?+?1n?=?a.strides[0]return?np.lib.stride_tricks.as_strided(a,?shape=(nrows,L),?strides=(S?*?n,n))def?rolling_poly9(s:np.ndarray,?w:int=252)?->?np.ndarray:'''一次九項式滾動分解擬合'''x_index?=?range(252)def?last_poly9(sx):p?=?np.polynomial.Chebyshev.fit(x_index,?sx,?9)return?p(x_index)[-1]if?(len(s)?>?w):x?=?strided_app(s,?w,?1)return?np.r_[np.full(w?-?1,?np.nan),?np.array(list(map(last_poly9,?x)))]else:x_index?=?range(len(s))p?=?np.polynomial.Chebyshev.fit(x_index,?s,?9)y_fit_n?=?p(x_index)return?y_fit_n#?用法示例 features['POLYNOMIAL9']?=?rolling_poly9(features['HMA10'].values,?252)通過一次九項式擬合,策略代碼自發性的尋找到周期規律——如果對象標的存在不符合周期性波動的規律(例如政策性很強的黃金股,紙黃金ETF),那么會在擬合中出現一種奇特的 ”與K線價格走勢,HMA10相關性偏低的現象“。
通過核驗特定指標的相關性,我就可以判斷這個標的適合或者不適合我的量化策略進行交易。同樣生效的算法還包括 最小遞增序列的OLS線性擬合和回歸樹轉折點算法,它們的組合,我稱為:”咸魚(波動性很差的股票)檢測算法“。關于實現這種1秒鐘判斷一個,5分鐘就可以從1700個超大股票池中判斷“咸魚”,“弱勢”,“持有”,“做多”,“做空”的Python代碼,我后面會寫專文討論。
就像這樣
print(u'分析和展示計算結果...') ret_codelist?=?featurs_printable_formatter(ret_codelist) codelist_saltedfish,?ret_codelist_saltedfish,?ret_codelist?=?find_fratcal_saltfish(ret_codelist) codelist_combo,?ret_codelist_combo,?ret_codelist?=?find_fratcal_bootstrap_combo(ret_codelist) codelist_action,?ret_codelist_action,?ret_codelist_combo?=?find_action_long(ret_codelist_combo) codelist_weak,?ret_codelist_weak,?ret_codelist?=?find_fratcal_weakshort(ret_codelist) codelist_short,?ret_codelist_short,?ret_codelist_unknown?=?find_action_sellshort(ret_codelist) #codelist_hyper_punch,?ret_stocklist_hyper_punch,?ret_codelist?= #find_action_hyper_punch(ret_codelist) codelist_unknown?=?[index[1]?for?index,?symbol?in?ret_codelist_unknown.iterrows()]#?將計算的標的分成四類?——?買入判斷'buy',持有判斷'long',做空判斷'short', #?'slatfish'是垃圾咸魚票,既沒有價格波動性也沒有想象空間 if?(eval_range?in?['etf',?'csindex']):full_etf_list?=?perpar_symbol_range('etf')full_csindex_list?=?perpar_symbol_range('csindex')ret_codelist?=?ret_features_pd.loc[(each_day[-1],?slice(None)),?:].copy()symbol_list?=?ret_codelist.index.get_level_values(level=1).unique()symbol_list_grouped?=?[(symbol,?'etf')?for?symbol?in?list(set(symbol_list).interp(set(full_etf_list)))]?+?\[(symbol,?'csindex')?for?symbol?in?list(set(symbol_list).interp(set(full_csindex_list)))]if?(eval_range?in?['etf']):symbol_list_grouped?=?[(symbol,?'etf')?for?symbol?in?symbol_list]elif?(eval_range?in?['csindex']):symbol_list_grouped?=?[(symbol,?'csindex')?for?symbol?in?symbol_list]symbol_list_grouped?=?list(set(symbol_list_grouped)) else:symbol_list_grouped?=?[(symbol,?'buy')?for?symbol?in?codelist_action]?+?\[(symbol,?'long')?for?symbol?in?list(set(codelist_combo).difference(set(codelist_action)))]?+?\[(symbol,?'weak')?for?symbol?in?codelist_weak]?+?\[(symbol,?'short')?for?symbol?in?codelist_short]?+?\[(symbol,?'saltedfish')?for?symbol?in?codelist_saltedfish]?+?\[(symbol,?'unknown')?for?symbol?in?codelist_unknown]經過它們快速分類。
后臺回復關鍵詞【入群】
加入賣萌屋NLP/IR/Rec與求職討論群
后臺回復關鍵詞【頂會】
獲取ACL、CIKM等各大頂會論文集!
總結
以上是生活随笔為你收集整理的还在买白酒?算法工程师们,量化投资了解一下的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 程 序 员 失 业 警 告
- 下一篇: 模型训练太慢?显存不够用?这个算法让你的