股市技術面操作的量化交易--量化交易2-投資方法
行業輪動發展理論
根據產業鏈進行股市的劃分,在上中下游進行利潤和週期的排序,並根據發展規律,相關性排序,進行行業選擇。
如下圖是2017年到2020年11月的相關性,根據t分佈計算出的行業行業相關置信度大於99%的行業。
績優成分股投資方法
從成分股選股,如滬深300
找出股息最高的10家
每年一次調倉。在2018-2020目前Alpha還在基準以上。
地址:https://uqer.datayes.com/labs/notebooks/6.4.1%E5%A4%A7%E5%B8%88%E7%B1%BB%E7%AD%96%E7%95%A51.nb
藍籌股投資法
選股:同時滿足類似以下的優質股條件:
股本大於市場均值,為成分股,大於10家基金公司持有,5年內3年淨利潤大於0,過去三年不間斷派息,過去三年股息成長0.5倍,股息率大於4%。
調倉:
可以每年三次調倉即可。
效果一般,並沒有獲取良好的Alpha。
Smart Beta策略
Beta表示風險溢價的大小,Smart Beta採用不同的標準對選股資訊進行評價。以下為近三年的測試資料,其中,刪除線部分表示低於基準。
優化權重的方式評價進行選股。
根據權重:等權重選股,最小方差選股,平價選股,最大多元化選股。
市盈率、市淨率
來構建價值因子,等權合成。
營業收入增長率、總資產增長率、歸屬於母公司所有者淨利潤增長率
來構建成長因子,等權合成
流動比率、營業利潤率、權益收益率、總資產週轉率
來構建質量因子,等權合成
現金流市值比、5年平均現金流市值比
來構建股息因子,等權合成
對數總市值
來構建規模因子
技術類指標策略
根據指標的變化進行投資
布林線指標BOLL
優礦平臺提供的程式碼如下:
import numpy as np import pandas as pd start = '2019-01-01' end = '2020-10-31' benchmark = 'HS300' universe = DynamicUniverse('HS300') capital_base = 1000000 freq = 'd' refresh_rate = 1 signalperiod = 9 # Signal平滑週期 accounts = { 'fantasy_account': AccountConfig(account_type='security', capital_base=10000000) } # 利用優礦的Signal框架來計算指標 # 優礦的BollUp和BollDown的引數是N=20, k=2,如果需要用到中軌,則直接使用MA20因子 def cross_situation(data, dependencies=['closePrice', 'BollUp', 'MA20', 'BollDown'], max_window=2): cross = {} for sec in data['closePrice'].columns: # 收盤價上穿BOLL上軌 if data['closePrice'][sec][0] < data['BollUp'][sec][0] and data['closePrice'][sec][1] < data['BollUp'][sec][1]: cross[sec] = 1 # 收盤價下穿BOLL中軌 elif data['closePrice'][sec][0] > data['MA20'][sec][0] and data['closePrice'][sec][1] < data['MA20'][sec][1]: cross[sec] = -1 else: cross[sec] = 0 return pd.Series(cross) # 定義並註冊Signal模組 def initialize(context): up = Signal('BollUp') down = Signal('BollDown') cross = Signal('CRX', cross_situation) context.signal_generator = SignalGenerator(up, down, cross) def handle_data(context): current_universe = context.get_universe(exclude_halt=True) boll_up, boll_down, crx = context.signal_result['BollUp'], context.signal_result['BollDown'], context.signal_result['CRX'] buylist = [] account = context.get_account('fantasy_account') cash = account.cash current_positions = account.get_positions() for stock in current_universe: # 收盤價上穿BOLL上軌,且無持倉 if crx[stock] == 1 and stock not in current_positions: buylist.append(stock) # 收盤價下穿BOLL中軌,且有持倉 elif crx[stock] == -1 and stock in current_positions: order_to(stock, 0) # 全部賣出 cash += current_positions[stock].amount * context.current_price(stock) # 估計買入金額 if len(buylist)==0: weight = 0 else: weight = min(1.0/len(buylist), 0.1) # 可以買入的股票數量,如果資金不夠,只買入部分 for sec in buylist: order_pct_to(sec, weight)
CII順勢指標
CMO動量擺動指標
Chaikin Oscillator指標
資產配置方法
有效邊界
投資者偏好
馬科維茨均值方差模型最早提出將數理統計的方法應用到投資組合選擇上,並將資產的期望收益率的波動率定義為風險。這種定義下,我們使用收益率的均值(E®)和標準差(σ®)來刻畫 “收益”和“風險”。
通常,我們認為人們是“風險厭惡”的,並構造如下形式的效用函式來代表投資者的投資偏好: U®=E®- 1/2 Aσ^2 ® 其中E®表示投資組合的預期收益率,σ^2 ®表示投資組合的方差;
預期收益率越高,效用值越高,收益方差越大,效用值越小。
這表明投資者喜歡更高的E®,而不喜歡高的σ^2 ®。
由於不同的投資者對於風險和收益有不同的偏好,因此效用函式中加入風險厭惡係數引數A表示投資者不同偏好,A越大,則投資者為追求更高的收益願意承擔更大的風險,或者說該投資者要求更高的收益補償面臨的風險。
U同時是E和σ的函式,所以在σ-E圖上,對於確定的A,不同的U表現為一組不相交的拋物線,這就是效用的無差異曲線,越往左上方的無差異曲線,代表越高的效用,因此投資者總是偏好位於左上方的無差異曲線上面的投資組合。
資產組合
假設有兩種資產E_1和E_2,其預期收益率和方差分別為r_1、σ_1^2和r_2、σ_2^2,收益率相關係數為ρ。另有,r_1<r_2、〖0<σ〗_1<σ_2。如果同時投資於兩種資產,權重分別為w_1、1-w_1,
則組合的期望收益率和方差可表示為: r=w_1 r_1+(1-w_1)r_2 σ^2= w_1^2 σ_1^2+〖(1-w_1)〗^2 σ_2^2+2w_1 (1-w_1)ρσ_1 σ_2 容易證明,當且僅當ρ=1時資產組合標準差與預期收益呈線性關係。
由於ρ的取值範圍在-1和1之間,因此通常情況下σ^2= w_1^2 σ_1^2+〖(1-w_1)〗^2 σ_1^2+2w_1 (1-w_1 )ρσ_1 σ_2<〖(w_1 σ_1+(1-w_1 )σ_2)〗^2,即組合標準差小於兩種資產標準差的加權平均,收益-標準差點在兩種資產收益-標準差點連線的左側。
甚至在大多數情況下,當把波動率更大的資產2開始引入組合時,其收益波動甚至比只投資於資產1時更小,當經過最小方差臨界點時才會慢慢增大。
這也體現了投資組合的重要性——通過分散投資以更小的組合風險獲得更高的收益。如下程式碼顯示了當投資產品只有兩種時,不同相關係數對應的不同有效邊界。
有效邊界和投資組合選擇
當投資者面臨的可選資產大於2種時,標準差和收益的關係就不僅僅侷限於一條曲線了,通過權重的選取,投資者可選的收益-標準差點構成一個有邊界的面。
人們趨利避險的心理決定了理性投資人在面臨同樣風險時,會選擇預期收益率更高的組合;而在預期收益相同時,會選擇風險較低的組合。
在所有可選的預期收益-標準差點中,位於最左側的部分構成了一條邊界線,其中從最小方差點往上的部分構成了有效邊界。
在該邊界線右下方的所有點是無效的投資組合,沒有人會選擇;在該邊界線左上的所有點是不可能達到的投資組合。
Black-Litterman模型概述
基於馬科維茨均值-方差模型的資產組合分析需要獲取各類資產預期收益和方差。通常有兩種方法可以用來得到預期收益和收益率方差的估計,情景分析法和歷史資料法。
情景分析法主要根據當前行情和巨集觀經濟環境等因素形成主觀的預期,這種方法顯然主觀性、隨意性過強。歷史資料法則完全根據過去的歷史收益率計算收益均值和方差,用來代替對未來的預期,這也是目前主流的做法。
這種做法存在幾個問題,
一是歷史資料往往由於歷史的一些巨集觀環境或隨機因素而存在比較大的波動性,這也意味著歷史的收益率和方差在未來有可能由於巨集觀環境和隨機因素的改變而不會重演;
二是根據採取的歷史資料的時間段不同,估算出的預期收益率和方差也會有較大差別,從而導致得出的最優資產配置比例也會有較大差別。
高盛的Black F.和Litterman R.在其1991年的一篇論文中提到,在對全球債券投資組合的研究中,他們發現,當對德國債券預期報酬率做0.1%小幅修正後,該類資產的投資比例竟由原來的10.0%提高至55.0%。
這也意味著馬科維茨的均值-方差模型得到的投資組合對於輸入的引數過於敏感。 Black和Litteraman在前述均值方差模型的基礎上,通過歷史資料估計基準預期和方差,匯入投資者主觀預期,把歷史資料法和情景分析法結合起來,形成新的市場收益預期,從而解決了前述模型中預期收益和方差估計中存在的問題。
B-L模型在均衡收益基礎上通過投資者觀點修正了期望收益,使得均值方差組合優化中的期望收益更為合理,而且還將投資者觀點融入進了模型,在一定程度上是對馬科維茨均值方差組合理論的改進。
B-L模型假設各資產收益率R服從聯合正態分佈,R~N(μ,Σ),其中μ和Σ是各資產預期收益率和協方差的估計值。現在假設估計向量μ本身也是隨機的,且服從正態分佈:μ~N(π,τΣ),其中π為先驗期望收益率的期望值,通常由歷史平均收益率表示。
模型引入投資者個人觀點的方式是用線性方程組表示,每一個方程表示一個觀點。例如,投資者認為未來第三種資產會比第一種資產收益率高2%,就可以表示為: -1×μ_1+0×μ_2+1×μ_3+⋯+0×μ_N=2% 投資者認為未來第二種資產收益率應該為5%,那麼可以表示為: 0×μ_1+1×μ_2+0×μ_3+⋯+0×μ_N=5% 用P來表示該觀點線性方程組的係數矩陣,觀點方程組可表示為:Pμ = q。
由於投資人觀點也存在不確定性,因此在q的基礎上還可以加上一個隨機誤差項:Pμ = q+ ϵ,其中ϵ~N(0, Ω),因而Pμ~N(q, Ω)。這裡,P被稱為Pick Matrix,為K×N矩陣,表示對於N種資產的K個觀點;
q為K×1看法向量;Ω為看法向量誤差項的K×K協方差矩陣,表示投資者觀點的不確定程度。通常對於Ω,採用Ω=diag(τPΣP^T)的方式構造。 前面我們討論過市場的看法:μ~N(π,τΣ),用P調整後的市場看法可表示為:Pμ~N(Pπ,τPΣP^T)。
投資人觀點和市場看法的差距服從分佈:N(q-Pπ, Ω+τPΣP^T) 然後根據貝葉斯法則,結合先驗資訊和投資者觀點,可以計算調整後的預期收益率和收益率方差分別為: Π ̂=Π+τΣP^T 〖(Ω+τPΣP^T)〗^(-1) (q-Pπ) M=τΣ-τΣP^T 〖(Ω+τPΣP^T)〗^(-1) PτΣ Σ_P=Σ+M 其中,Π為先驗的期望收益,通過歷史平均年化收益得到;
Π ̂為個人觀點調整後的期望收益;Σ為資產收益率之間的協方差矩陣;M為後驗分佈預期收益率的方差;Σ_P為調整後預期收益率方差;τ為均衡收益方差的刻度值,體現了對個人觀點在總體估計中的權重,通常取值在0.025~0.05; P、q、Ω為觀點矩陣。
得到調整後的期望收益率和方差後,就可以根據馬科維茨均值方差模型計算最優權重。
Black-Litterman模型應用 在實踐中應用該模型,簡要來說主要有如下步驟:
(1) 計算得到先驗的期望收益; (2) 個人觀點模型化,觀點可以涉及單個資產,也可以有多個資產,最後按照一定的規則將所有觀點構建成矩陣P、Q和Ω; (3) 計算調整後的預期收益率、調整後的收益率方差; (4) 根據調整後的期望收益,利用均值方差模型計算最優權重。 下面的程式碼提供了若干應用B-L模型進行優化的函式。
其中get_BL_efficient_frontier()用於獲取根據調整後的收益率期望和方差得到的有效邊界;draw_efficient_frontier()用於繪製有效邊界圖形;get_BL_minimum_variance_portfolio()用於獲取最小方差投資組合;get_BL_maximum_utility_portfolio()用於獲取基於給定效用函式的最大化效用投資組合;get_maximum_sharpe_portfolio()用於獲取最大夏普率投資組合。