用数据解读摩羯智投
用IT技術玩金融系列文章,將介紹如何使用IT技術,處理金融大數據。在互聯網混跡多年,已經熟練掌握一些IT技術。單純地在互聯網做開發,總覺得使勁的方式不對。要想靠技術養活自己,就要把技術變現。通過“跨界”可以尋找新的機會,創造技術的壁壘。
金融是離錢最近的市場,也是變現的好渠道!今天就開始踏上“用IT技術玩金融”之旅!
關于作者:
- 張丹(Conan), 程序員R,Nodejs,Java
- weibo:@Conan_Z
- blog:?http://blog.fens.me
- email: bsspirit@gmail.com
轉載請注明出處:
http://blog.fens.me/finance-mojie
前言
進入2016年,伴隨世界經濟危機的到來,中國互聯網創業,也在經歷長時間的寒冬,有不少的公司都因資金鏈斷裂,停止了運營。與寒冬反差很大的是,AI技術卻火了起來,受到資本的追捧。智能投顧作為金融領域的AI熱點,一直在持續升溫。
到2016年底,招商銀行發布了一個名為“摩羯智投”的應用,一下子吸引了眾多人的眼球,打開了銀行進軍智能投顧領域的大門。本文將用數據來解讀“摩羯智投”的到底是怎么玩的。
目錄
1. 摩羯智投介紹
摩羯智投,是招商銀行在2016年12月6日發布的一款手機端應用,嵌入在招商銀行的APP中,加入了FinTech理念,把金融和人工智能進行了結合。
按招商銀行發布的文章中介紹,摩羯智投是運用機器學習算法,構建的以公募基金為基礎的、全球資產配置的“智能基金組合配置服務”。在客戶進行投資期限和風險收益選擇后,摩羯智投會根據客戶自主選擇的“目標—收益”要求、構建基金組合,由客戶進行決策、“一鍵購買”并享受后續服務。
摩羯智投并非一個單一的產品,而是一套資產配置服務流程,它包含了目標風險確定、組合構建、一鍵購買、風險預警、調倉提示、一鍵優化、售后服務報告等,涉及基金投資的售前、售中、售后全流程服務環節。比如,摩羯智投會實時進行全球市場掃描,根據最新市場狀況,去計算最優組合比例,如果客戶所持組合偏離最優狀態,摩羯智投將為客戶提供動態的基金組合調整建議,在客戶認可后,即可自主進行一鍵優化。
摩羯智投的開機畫面。
看完招商銀行官方的介紹,接下來我們從數據進行分析,看看“摩羯智投”到底有多智能。
2. 數據收集
要做數據分析,我們就要以數據來思考。我的思路,要先收集數據,把應用所有的輸入項和輸出項的數據進行整理,然后我們通過統計的方法和金融知識來找到數據之間的關系。
注:由于應用中沒有明確的字段定義,下面字段我按照字面意思進行解讀。
數據輸入項只有2個字段,包括
- 大致投資期限:從投資開始到投資結束的期限。
- 風險承受能力:承擔多大的風險,以及風險帶來的損失。
數據輸出項,字段就比較多,包括
- 模擬歷史年化收益(%):對歷史數據回測,所獲得的年化收益率。
- 模擬歷史年化波動率(%):對歷史數據回測,所獲得的年化波動率。
- 模擬歷史收益(元):在投資10000元,并持有一年,所獲得的收益金額。
- 95%的概率下虧損(元):在95%概率下最大虧損金額。
- 固定收益(%):固定收益類基金的配置比例。
- 現金及貨幣(%):現金貨幣類基金的配置比例。
- 股票類(%):股票類基金的配置比例。
- 另類及其他(%):另類投資的類基金的配置比例。
- 投資組合收益率曲線:按比例構成的組合,生成的收益率曲線。
- 投資組合配置詳情:4類資產對應的具體基金品種和配置比例
對應到“摩羯智投”的操作界面上,我標出了輸入數據和輸出數據的提取點。
根據界面來收集到的數據,整理為CSV格式,便于之后的分析。數據收集,我分別存儲到了3個CSV文件中。
- a.csv:用于收集第1-2個界面的數據,用戶直接輸入和輸出數據,包括:大致投資期限(term),風險承受能力(rick),模擬歷史年化收益(ret),模擬歷史年化波動率(vol),模擬歷史收益(gains),虧損(loss),固定收益(fixed),現金及貨幣(cash),股票類(stock),另類及其他(alter)
- b.csv:用于收集所有標的基金所對應的市場數據,從wind中采集,包括:基金名稱(name),基金代碼(code),基金成立時間(create),基金類型(type),凈值20140101(first2014),凈值20150101(first2015),凈值20160101(first2016),凈值20161208(last)
- c.csv:用于收集第3個界面的數據,每個組合的標的基金的配置比例,包括:大致投資期限(term),風險承受能力(rick),基金類型(type),基金代碼(code),配置比例(weight)
a.csv的數據樣例前10條,如下:
b.csv的數據樣例前10條,如下:
c.csv的數據樣例前20條,如下:
這里還需要特別說明的事,由于應用的數據,可能會動態的發生變化,我是采集的2016年12月8日的“摩羯智投”應用中的數據。
多說一句,數據花點時間誰都可以在應用中拿到,雖然我已經整理了數據,但請大家不要太隨意地張嘴要數據和代碼,畢竟寫一篇文章非常辛苦。如果你想直接用我的數據和代碼,請掃文章下面二維碼,請作者喝杯咖啡吧。 :_D
3. 數據建模分析
收集好了數據,接下來就可以進行數據分析了。當然,分析的角度有很多種,可以從金融、統計、數據挖掘等專業方向,也可以計算一些簡單的指標,最大值,最小值,平均值等等。我思考的出發點,主要在金融和統計上面,如果存在片面性,還請大家給予指正。
下面將從6個知識點,對“摩羯智投”進行分析。
3.1 分析一:只有2個輸入項。
由于只有2個輸入項,大致投資期限和風險承受能力。大致投資期限有3個選項,風險承受能力有10個選項,那么實際的組合個數就是3*10=30個。對于只有30個組合來說,并不能完全實現個性化,當有31個用戶使用產品時,就會有2個人購買的組合是是重復的。
3.2 分析二:只有17只標的基金
我們對30個組合進行配置嘗試后,發現詳細持倉方案中,只有17只基金,配置比例不同而矣。標的過少,可能導致風險不能足夠的分散化,遇到極端行情會導致大的回撤。17只基金分別是
> paste(dfb$name,"(",dfb$code,")",sep="")[1] "工銀純債B(OF000403)" "易增強回報B(OF110018)" "建信穩定增利C(OF530008)"[4] "工銀天頤B(OF485014)" "南方量化成長(OF001421)" "中歐潛力價值(OF001810)" [7] "大成500(OF096001)" "黃金接連C類(OF000217)" "亞洲美元債C(OF002401)" [10] "大摩收益C(OF233013)" "博時信用債C(OF050111)" "興權可轉債(OF340001)" [13] "創金多因子(OF002210)" "招商現金增值A(OF217004)" "富國中小盤(OF100061)" [16] "工銀瑞信全球(OF486002)" "南方成份(OF202005)"3.3 分析三:相關性分析
直接利用a.csv的數據集,查看輸入項和輸出項的相關性,發現相關關系。
通過R語言程序實現
# 加載數據 > dfa names(dfa) pairs(df)把數據變成可視化來顯示,對于我們理解數據非常有幫助。
- term列,和其他列的散點圖,完全呈現離散的分布,說明term列與其他列并沒有相關性的關系。
- risk列,除了和alter列沒有線性關系,和其他列呈現明顯的線性關系。
我們把上面相關性圖,再加上一些元素,如相關系數、擬合曲線、分布圖等,重新畫出相關性圖,如下所示。
這樣就清晰了多了。
- risk列,與模擬歷史年化收益(ret),模擬歷史年化波動率(vol),擬歷史收益(gains),呈現極度正相關,輸出項的數字完全受risk值影響。
- risk列,與固定收益(fixed)和現金及貨幣(cash),極度負相關;與股票類(stock),極度正相關;另類及其他(alter),負相關。這種情況,與資產的風險收益屬性是匹配。
- vol列,與虧損(loss),是100%線性相關。
- ret列,與擬歷史收益(gains),是100%線性相關,這里可以獲得公司:gains = 10000 * ret 。
3.4 分析四:線性回歸
通過相關性的檢查,我們可以發現risk與很多列都是極度相關的。
那么我們可以用線性回歸的方法,把risk與有相關性的列的參數估計出來。如果不太了解,一元線性回歸的可以參考文章,R語言解讀一元線性回歸模型。
由于vol和loss是100%線性相關,以vol為x,loss為y,構建一元線性回歸方程。
# 回歸方程 > lv summary(lv) Call: lm(formula = loss ~ vol, data = dfa)Residuals:Min 1Q Median 3Q Max -36.119 -31.491 -6.621 27.884 67.305 Coefficients:Estimate Std. Error t value Pr(>|t|) (Intercept) -447.514 13.056 -34.28 <2e-16 *** vol 149.109 1.707 87.34 <2e-16 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Residual standard error: 34.2 on 28 degrees of freedom Multiple R-squared: 0.9963, Adjusted R-squared: 0.9962 F-statistic: 7629 on 1 and 28 DF, p-value: < 2.2e-16進行線性回歸的統計檢查:T檢查,F檢查都非常顯著,同時R-squared為0.9963,具有極度相關性。
# 畫出散點圖和擬合曲線 > plot(loss~vol,data=dfa) > abline(lv)從圖中看到,擬合效果非常好,可以整理出公式:loss = -447.514 + 149.109*vol。
另外,由于risk決定vol,再讓我們算一下risk和loss的關系,以risk為x,loss為y,構建一元線性回歸方程。
# 構建一元線性回歸方程 > lm(loss~risk,data=dfa) Call: lm(formula = loss ~ risk, data = dfa)Coefficients: (Intercept) risk -435.8 180.0 # 詳細指標 > summary(lr) Call: lm(formula = loss ~ risk, data = dfa)Residuals:Min 1Q Median 3Q Max -219.88 -136.93 -59.26 100.69 508.31 Coefficients:Estimate Std. Error t value Pr(>|t|) (Intercept) -435.84 72.38 -6.021 1.73e-06 *** risk 179.95 11.67 15.426 3.23e-15 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Residual standard error: 183.5 on 28 degrees of freedom Multiple R-squared: 0.8947, Adjusted R-squared: 0.891 F-statistic: 238 on 1 and 28 DF, p-value: 3.232e-15T檢查和F檢查,非常顯著;R-squared 也比較高。
下面進行殘差檢查,發現30號點,是偏離比較大,可能是離群值。
我們把30號點去掉,再做顯著性檢查和殘差分析。
> dfa2 lr2 summary(lr2) Call: lm(formula = loss ~ risk, data = dfa2)Residuals:Min 1Q Median 3Q Max -203.00 -100.98 -58.98 83.53 327.46 Coefficients:Estimate Std. Error t value Pr(>|t|) (Intercept) -397.55 62.23 -6.389 7.64e-07 *** risk 169.51 10.32 16.431 1.39e-15 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Residual standard error: 155.3 on 27 degrees of freedom Multiple R-squared: 0.9091, Adjusted R-squared: 0.9057 F-statistic: 270 on 1 and 27 DF, p-value: 1.391e-15在去掉30號點后,R-squared為0.9091,比之前的0.8947,有所提升。
從殘差圖中,我們看到沒有明顯的離群值點,所以去掉30號點,是符合統計提升標準的。
3.5 分析五:關于30號點的金融思考
從數據中,我們發現30號點的最大虧損已經超過了收益,也就是說你可能承擔了過大了風險,但是沒有獲得風險所給你帶來的收益。
按照資本資產定價模型的理解,我們投資組合的收益來自2部分,無風險收益和風險收益。無風險收益可以用現金或貨幣類的基金獲得,風險收益主要來自股票基金,債券基金,另類投資最基金。直觀上理解,風險收益比至少是1:1,即損失100元時,要獲得100元風險補償。對于私募業務來說,投資人可能會要求更高,比如 風險:收益=1:2。
從另外一個角度分析,上面我所說的風險收益比并沒有涉及到概率的部分,我猜95%是通過VaR值來做的概率計算。
3.6 分析六:通過標的基金計算收益率
在“摩羯智投”的應用中,我們可以獲得各個基金的配置比例,基金凈值的數據又可以在公開市場中獲得,所以對于預期收益率,我們也可以自己計算一下,看看是不是與“摩羯智投”提供的結果是一致的。
接下來,就利用到上文介紹的數據集,b.csv和c.csv。
# 加載數據 > dfb names(dfb) dfb$ret2014 dfb$ret2015 dfb$ret2016 dfb$ret2014[c(which(is.na(dfb$ret2014)),which(is.infinite(dfb$ret2014)))] dfb$ret2015[c(which(is.na(dfb$ret2015)),which(is.infinite(dfb$ret2015)))] dfb$ret2016[c(which(is.na(dfb$ret2016)),which(is.infinite(dfb$ret2016)))] head(dfb)name code create type first2014 first2015 first2016 last ret2014 ret2015 ret2016 1 工銀純債B OF000403 20140516 fixed 0.0000 1.0850 1.2200 1.2520 0.00000000 0.12442396 0.026229508 2 易增強回報B OF110018 20080319 fixed 1.4403 1.8124 2.1180 2.1693 0.25834896 0.16861620 0.024220963 3 建信穩定增利C OF530008 20080625 fixed 1.4529 1.8030 2.0304 2.0608 0.24096634 0.12612313 0.014972419 4 工銀天頤B OF485014 20110810 fixed 1.2090 1.7300 1.9740 1.9680 0.43093466 0.14104046 -0.003039514 5 南方量化成長 OF001421 20150629 stock 0.0000 0.0000 1.2300 1.3400 0.00000000 0.00000000 0.089430894 6 中歐潛力價值 OF001810 20150930 stock 0.0000 0.0000 1.1010 1.2170 0.00000000 0.00000000 0.105358765由于基金中,招商現金增值A(OF217004)為現金類基金,所以收益率需要直接取年化收益,而不是按上面的計算方法。
#現金類,收益率從wind查年化收益率,進行賦值 dfb[which(dfb$code=='OF217004'),]$ret2014再加載c.csv基金的詳細配置方案。
> dfc names(dfc) head(dfc)term risk type code weight 1 1 1 fixed OF000403 0.20 2 1 1 fixed OF110018 0.14 3 1 1 fixed OF530008 0.11 4 1 1 fixed OF233013 0.10 5 1 1 fixed OF050111 0.05 6 1 1 fixed OF485014 0.05把數據變型,以type列轉置為橫表,去掉code列,以weight值進行填充,得到新數據集為r1。
> head(r1)term risk alter cash fixed stock 1 1 1 0.1000 0.2000 0.6500 0.0500 2 1 2 0.1500 0.1965 0.5491 0.1044 3 1 3 0.1562 0.1842 0.4881 0.1715 4 1 4 0.1011 0.1490 0.5162 0.2337 5 1 5 0.1137 0.1416 0.4943 0.2504 6 1 6 0.1143 0.1208 0.4655 0.2994我們生成plan1的配置方案,當term=1,risk=1時。
# 只保留term=1,risk=1時數據 > plan1 plan1m plan1m$ret2014w plan1m$ret2015w plan1m$ret2016w plan1mcode term risk type weight ret2014 ret2015 ret2016 ret2014w ret2015w ret2016w 1 OF000217 1 1 alter 0.05 0.01590909 -0.06711409 0.194844125 0.0007954545 -0.003355705 0.0097422062 2 OF000403 1 1 fixed 0.20 0.00000000 0.12442396 0.026229508 0.0000000000 0.024884793 0.0052459016 3 OF001810 1 1 stock 0.05 0.00000000 0.00000000 0.105358765 0.0000000000 0.000000000 0.0052679382 4 OF002401 1 1 alter 0.05 0.00000000 0.00000000 0.000000000 0.0000000000 0.000000000 0.0000000000 5 OF050111 1 1 fixed 0.05 0.87631433 0.12603844 0.034050727 0.0438157167 0.006301922 0.0017025363 6 OF110018 1 1 fixed 0.14 0.25834896 0.16861620 0.024220963 0.0361688537 0.023606268 0.0033909348 7 OF217004 1 1 cash 0.20 0.04520000 0.03600000 0.023700000 0.0090400000 0.007200000 0.0047400000 8 OF233013 1 1 fixed 0.10 0.24233716 0.20354665 0.047405509 0.0242337165 0.020354665 0.0047405509 9 OF485014 1 1 fixed 0.05 0.43093466 0.14104046 -0.003039514 0.0215467328 0.007052023 -0.0001519757 10 OF530008 1 1 fixed 0.11 0.24096634 0.12612313 0.014972419 0.0265062977 0.013873544 0.0016469661把數據進行合并,分別計算plan1方案的收益率,和plan1方案不同資產的收益率貢獻。
# plan1方案的收益率 > plan1r plan1rterm risk ret2016 ret2015 ret2014 1 1 1 0.03632506 0.09991751 0.1621068#計算3年的累積收益率曲線 > plan1r$cumret plan1rterm risk ret2016 ret2015 ret2014 cumret 1 1 1 0.03632506 0.09991751 0.1621068 0.2983493# plan1方案不同資產的收益率貢獻 > plan1rm plan1rmterm risk type ret2016 ret2015 ret2014 1 1 1 alter 0.009742206 -0.003355705 0.0007954545 2 1 1 cash 0.004740000 0.007200000 0.0090400000 3 1 1 fixed 0.016574914 0.096073214 0.1522713174 4 1 1 stock 0.005267938 0.000000000 0.0000000000用我計算的結果,分別對比“摩羯智投”中,近1年和近3年的收益率曲線。
近1年對應plan1r$ret2016=0.03632506=3.63%,近3年對應plan1r$cumret=0.2983493=29.83%。我發現計算結果存在差異,從最終結果的數字上來看差異并不大。但對于近3年的收益率曲線的走勢來看,差異還是非常明顯的。“摩羯智投”給出的近3年收益率曲線是,均勻平穩上升的,而我算出來的,3年數據2014年漲了16%,2015年漲了9%,2016年漲了3%,逐年收益率在遞減。所以不應該呈現均勻平穩上升的形狀。
究其原因,再來看plan1的組合數據,發現股票基金只有配了一只中歐潛力價值(OF001810),而這只基金在2015年09月30日才成立,所以并不能構建出該基金在2014,2015的年度收益率組合。以此來判斷,這個組合勢必存在著中間調倉的過程,而“摩羯智投”的收益率曲線,并沒有展示出調倉過程的數據,所以收益率曲線是不透明的,不能夠直接做為用戶購買決策的依據。
接下來,我們把30種組合的收益率,都計算出來。再與“摩羯智投”給出的收益率進行比較。
上圖中,ret列為“摩羯智投”界面上采集的數據;ret2016,ret2015,ret2014分別為我們根據基金的公開市場的數據,計算出來的百分比結果;mean為ret2016,ret2015,ret2014算數平均數。從數據上看,ret列和mean列,有部分值接近。我們再做一次相關性分析。
這樣解讀結果就容易多了,ret與2016年的收益率是線性相關的,而mean與2014年的收益率是線性相關的,我猜2014底的“股債雙牛”使均值發生了偏離。所以,ret和mean沒有關系,“摩羯智投”對于收益率的預期,對于近1年的組合收益可能有更大的權重分配。
所以對于“摩羯智投”給出預期收益和凈值曲線,我們并不能通過已知的數據計算出來,這些可能就涉及到它背景的算法,我們就無從知曉了。
4. 結論
以上從數據的角度給對“摩羯智投”進行了分析,首先摩羯構建的組合是線性組合,符合風險收益為基礎資本資產定價模型(CAPM)。但由于組合數量有限,基金標的有限,算法不夠透明、無法利用已知數據重現結果,缺少客戶持續跟蹤等部分,所以我把“摩羯智投”理解為是基于金融專業性架構,結合快速上線為目標的試水。可以實現對散戶的簡單、高效的財富管理體驗,部分解放理財經理的壓力。但對于專業的投資經理來說,這還僅僅是個玩具,還有相當大的提升空間。
本文只是人個出于興趣,對“摩羯智投”應用的從數據角度的分析,不代表任何公司或其他第三方機構的立場。由于所獲得數據有限,以及個人知識能力有限,如有片面的理解,還指大家指正。
轉載請注明出處:
http://blog.fens.me/finance-mojie
總結
- 上一篇: 巧用 Prometheus 监控 Kub
- 下一篇: 华为暂缓校招,解散校招群,冲上热搜,引发