量化相關性分析應用

阿布量化發表於2017-08-30

作者: 阿布

阿布量化版權所有 未經允許 禁止轉載

abu量化系統github地址 (歡迎+star)

本節ipython notebook

交易目標之間的相關性分析是量化交易中一個非常重要的工具,本節將示例abupy中相關分析模組的使用示例:

受限於沙盒中資料限制,本節示例的相關性分析只限制在abupy內建沙盒資料中,首先將內建沙盒中美股,A股,港股, 比特幣,萊特幣,期貨市場中的symbol都列出來:

us_choice_symbols = ['usTSLA', 'usNOAH', 'usSFUN', 'usBIDU', 'usAAPL', 'usGOOG', 'usWUBA', 'usVIPS', 'us.IXIC']
cn_choice_symbols = ['002230', '300104', '300059', '601766', '600085', '600036', '600809', '000002', '002594', '002739', 'sh000001']
hk_choice_symbols = ['hk03333', 'hk00700', 'hk02333', 'hk01359', 'hk00656', 'hk03888', 'hk02318', 'hkHSI']
tc_choice_symbols = ['btc', 'ltc']
# 期貨市場的直接從AbuFuturesCn().symbo中讀取
ft_choice_symbols = AbuFuturesCn().symbol.tolist()

all_choice_symbols = us_choice_symbols + cn_choice_symbols + hk_choice_symbols + tc_choice_symbols +ft_choice_symbols
len(all_choice_symbols)複製程式碼
75複製程式碼

如上所示abupy內建沙盒中的symbol共75個,下面組裝這75個symbol形成一個三維panel資料,摘取所有資料的p_change(漲跌幅)列形成二維dataframe物件,如下所示:

panel = ABuSymbolPd.make_kl_df(all_choice_symbols, start='2015-07-27', end='2016-07-26',
                               show_progress=True)
# 轉換panel軸方向,即可方便獲取所有金融時間資料的某一個列
panel = panel.swapaxes('items', 'minor')
net_cg_df = panel['p_change'].fillna(value=0)
net_cg_df.head()複製程式碼

1. 相關相似度的度量

機器學習與比特幣示例章節通過比特幣的資料特徵組成了學習資料,通過訓練資料來決策是否有大波動,對於機器學習來說獲取更多特徵,更多資料始終是優化的最重要且最有效的手段,如果你需要從其它市場找到和比特幣有相關性的品種,變換形成新的特徵,最簡單的方法可以使用corr_xy介面:

ABuCorrcoef.corr_xy(net_cg_df.btc, net_cg_df['601766'], similar_type=ECoreCorrType.E_CORE_TYPE_PEARS)複製程式碼
-0.048279527947480187複製程式碼

上面通過預設引數獲取601766與比特幣的相關度,數值為-0.04,可以通過關鍵子引數similar_type來切換相關的計算方法,如下使用E_CORE_TYPE_SPERM:

ABuCorrcoef.corr_xy(net_cg_df.btc, net_cg_df['601766'], similar_type=ECoreCorrType.E_CORE_TYPE_SPERM)複製程式碼
-0.097886272084964976複製程式碼

下面使用E_CORE_TYPE_SIGN,sign的相關度度量,只關注符號,不關心具體資料,即比如今天比特幣漲,那隻要601766今天也漲就正相關,不會理會具體漲多少,實際上這種度量方式更適合交易型別產品:

ABuCorrcoef.corr_xy(net_cg_df.btc, net_cg_df['601766'], similar_type=ECoreCorrType.E_CORE_TYPE_SIGN)複製程式碼
-0.067025116921873129複製程式碼

下面使用時間加權相關E_CORE_TYPE_ROLLING,進行計算,即時間上越早的相關值所佔權重越小,時間上越晚的相關值權重越大:

ABuCorrcoef.corr_xy(net_cg_df.btc, net_cg_df['601766'], similar_type=ECoreCorrType.E_CORE_TYPE_ROLLING)複製程式碼
-0.098124897642975412複製程式碼

上面的corr_xy的介面引數只能是兩個品種的相關度度量,如果想要從上面net_cg_df的75種品種中找到與比特幣最相關的品種很麻煩,使用corr_matrix介面可以一次輸出計算:

corr_df = ABuCorrcoef.corr_matrix(net_cg_df, )
corr_df.btc.sort_values()[::-1][:10]複製程式碼
btc       1.0000
ltc       0.7649
usTSLA    0.0991
000002    0.0877
B0        0.0853
002594    0.0816
AL0       0.0798
P0        0.0717
SR0       0.0709
AG0       0.0691
Name: btc, dtype: float64複製程式碼

corr_matrix介面同樣支援關鍵字引數similar_type,如下使用E_CORE_TYPE_SIGN:

corr_df = ABuCorrcoef.corr_matrix(net_cg_df, similar_type=ECoreCorrType.E_CORE_TYPE_SIGN)
corr_df.btc.sort_values()[::-1][:10]複製程式碼
btc       1.0000
ltc       0.7176
FB0       0.0852
usAAPL    0.0786
RS0       0.0676
000002    0.0645
BB0       0.0601
RI0       0.0599
usSFUN    0.0558
FU0       0.0483
Name: btc, dtype: float64複製程式碼

上面輸出的都是正相關的top10,發現除了ltc(萊特幣)外,其它的相關度也都在0附近,都沒有超過0.1,即都基本無關,實際上不管是正相關還是負相關都成為可以有用的素材,下面看一下時間加權相關的top10負相關的品種:

corr_df = ABuCorrcoef.corr_matrix(net_cg_df, ECoreCorrType.E_CORE_TYPE_ROLLING)
corr_df.btc.sort_values()[:10]複製程式碼
hk01359    -0.1803
hk02318    -0.1600
hkHSI      -0.1281
V0         -0.1254
300059     -0.1083
601766     -0.0981
hk00656    -0.0919
hk03888    -0.0857
us.IXIC    -0.0779
sh000001   -0.0697
Name: btc, dtype: float64複製程式碼

如上所示負相關的數值有幾個已經上到0.1以上了,但是由於沙盒資料中的交易品種所限,並沒有找到適合構成特徵(強正相關,或者強負相關)的品種。

備註:之後的章節在使用非沙盒資料的前提下,會編寫在完整的各個全市場中尋找與比特幣最強正相關,最強負相關的示例,以及通過它們構成特徵,實現策略的優化

2. 距離的度量與相似度

與相似度度量相反的是兩個向量之間距離的度量,如下示例在abupy中的距離度量介面使用:

ABuStatsUtil.euclidean_distance_xy(net_cg_df.btc, net_cg_df.ltc)複製程式碼
51.878666694509434複製程式碼

上面的介面度量了比特幣和萊特幣之間的歐式距離(L2範數),下面度量曼哈頓距離(L1範數):

ABuStatsUtil.manhattan_distances_xy(net_cg_df.btc, net_cg_df.ltc)複製程式碼
537.47800000000052複製程式碼

下面度量餘弦距離:

ABuStatsUtil.cosine_distances_xy(net_cg_df.btc, net_cg_df.ltc)複製程式碼
0.23673712776004519複製程式碼

上面介面cosine_distances_xy度量了比特幣和萊特幣之間的餘弦距離,0.23為距離的度量值,距離和相似度之間可以通過關鍵字引數to_similar=True將餘弦距離直接轉換為餘弦相似度,如下所示:

ABuStatsUtil.cosine_distances_xy(net_cg_df.btc, net_cg_df.ltc, to_similar=True)複製程式碼
0.76326287223995481複製程式碼

和相似度介面類似,xy介面只能兩個直接度量,通過matrix介面可實現矩陣的度量,如下所示:

euclidean_df = ABuStatsUtil.euclidean_distance_matrix(net_cg_df)
euclidean_df.btc.sort_values()[:10]複製程式碼
btc    0.0000
ltc    0.4318
WH0    0.5554
AL0    0.5571
AU0    0.5614
SR0    0.5621
PB0    0.5641
AG0    0.5644
CU0    0.5650
A0     0.5672
Name: btc, dtype: float64複製程式碼

可以看到與比特幣距離最短的是萊特幣,同時可以通to_similar=True將距離度量值轉換為相似度,如下所示:

manhattan_df = ABuStatsUtil.euclidean_distance_matrix(net_cg_df, to_similar=True)
manhattan_df.btc.sort_values()[::-1][:10]複製程式碼
btc    1.0000
ltc    0.5682
WH0    0.4446
AL0    0.4429
AU0    0.4386
SR0    0.4379
PB0    0.4359
AG0    0.4356
CU0    0.4350
A0     0.4328
Name: btc, dtype: float64複製程式碼

上面度量了歐式距離(L2範數),下面度量曼哈頓距離(L1範數)的matrix介面:

manhattan_df = ABuStatsUtil.manhattan_distance_matrix(net_cg_df, to_similar=True)
manhattan_df.btc.median()複製程式碼
0.37316382510050927複製程式碼

上面度量結果的中位數,值為0.37,很高,因為L1範數和L2範數針對相似度的度量只是相對的,只在資料範圍內,資料之間進行資料比較統計的意義不大,如上ltc的值和WHO差不多大,餘弦距離與它們不同,如下示例,可以看到ltc與usTSLA數值差別很大:

cosine_df = ABuStatsUtil.cosine_distance_matrix(net_cg_df, to_similar=True)
cosine_df.btc.sort_values()[::-1][:10]複製程式碼
btc       1.0000
ltc       0.8213
usTSLA    0.3191
000002    0.3130
B0        0.3129
002594    0.3077
AL0       0.3051
AG0       0.3021
SR0       0.3018
P0        0.2995
Name: btc, dtype: float64複製程式碼

備註:與上述介面的使用類似,通過ABuScalerUtil.scaler_xy針對兩組向量進行標準化,通過ABuScalerUtil.scaler_matrix針對矩陣進行標準化。

3. 相似相關介面的應用

下面示例在abupy中相關相似上層封裝的介面的使用,如下通過將市場設定為通過E_MARKET_TARGET_CN,獲取A股全市場資料與600036進行對比,視覺化最相關的top10個:

備註:由於使用的是沙盒資料,所以市場中本身資料就只有幾個,如果在非沙盒環境下,將從市場中幾千個symbol中度量相關性:

abupy.env.g_market_target = EMarketTargetType.E_MARKET_TARGET_CN
similar_dict = find_similar_with_cnt('600036', 252)複製程式碼
[('600036', 1.0), ('600085', 0.18746310519070053), ('601766', 0.16092010174236029), ('000002', 0.15201946573417266), ('002594', 0.090141541940086695), ('600809', 0.08546095455608782), ('300059', 0.058106113286564912), ('300104', 0.040346982734044065), ('002230', 0.039347445604041603), ('002739', -0.025313117068593773)]複製程式碼

上面的介面使用的是find_similar_with_cnt,引數252為天數,即度量最近一年的相關性,下面切換市場為港股市場,介面使用find_similar_with_se引數通過start,end進行設定時間,關鍵字引數corr_type代表度量相關演算法,使用檢視hk02333與港股市場的相關性:

abupy.env.g_market_target = EMarketTargetType.E_MARKET_TARGET_HK
_ = find_similar_with_se('hk02333', start='2016-07-26', end='2017-07-26', corr_type=ECoreCorrType.E_CORE_TYPE_PEARS)複製程式碼
[('hk02333', 1.0), ('hk00656', 0.24601704763153207), ('hk01359', 0.24203066017997449), ('hk02318', 0.23406013646744359), ('hk00700', 0.13924584542259066), ('hk03333', 0.11687041715770088), ('hk03888', 0.033580672103364573)]複製程式碼

下面的市場繼續在港股市場,但引數symbol使用比特幣,即度量的結果為比特幣與港股市場的相關性:

_ = find_similar_with_cnt('btc', 252, corr_type=ECoreCorrType.E_CORE_TYPE_PEARS)複製程式碼
[('btc', 1.0), ('hk03333', 0.087948053966186684), ('hk02318', 0.057208549474234399), ('hk00700', 0.027568472278148865), ('hk01359', 0.0047700609238161343), ('hk03888', -0.010501786826757909), ('hk00656', -0.032787443726602972), ('hk02333', -0.086537956413257899)]複製程式碼

下面的市場繼續在港股市場,但介面使用find_similar_with_folds,引數引數n_folds代表年數,symbol使用比特幣,corr_type使用時間加權相關度量,如下所示:

_ = find_similar_with_folds('btc', n_folds=1, corr_type=ECoreCorrType.E_CORE_TYPE_ROLLING)複製程式碼
[('btc', 0.999999999999999), ('hk00700', 0.10763164865060315), ('hk02318', 0.10660013960666159), ('hk03333', 0.074239098008015258), ('hk01359', 0.046902811046481439), ('hk03888', 0.024748563207458382), ('hk00656', -0.024429750776305867), ('hk02333', -0.056443723857550823)]複製程式碼

上面的介面通過corr_type來切好相關度度量演算法,如果想使用多種度量演算法,同時度量,可以使用calc_similar介面,使用如下所示:

abupy.env.g_market_target = EMarketTargetType.E_MARKET_TARGET_CN
rank_score, _ = tl.similar.calc_similar('600036', '601766', corr_jobs=(ECoreCorrType.E_CORE_TYPE_PEARS,
                                                                              ECoreCorrType.E_CORE_TYPE_SPERM), show=False)
rank_score複製程式碼
0.7272727272727273複製程式碼

上面使用E_CORE_TYPE_PEARS和E_CORE_TYPE_SPERM共同做為度量演算法,下面使用+-號相關和時間加權相關,如下所示:

abupy.env.g_market_target = EMarketTargetType.E_MARKET_TARGET_CN
rank_score, _ = tl.similar.calc_similar('600036', '601766', corr_jobs=(ECoreCorrType.E_CORE_TYPE_ROLLING, ECoreCorrType.E_CORE_TYPE_ROLLING), show=False)
rank_score複製程式碼
0.6363636363636364複製程式碼

觀察上面的輸出值都很高,通過corr_xy度量兩支股票的相關度只有0.458,如下所示:

ABuCorrcoef.corr_xy(net_cg_df['600036'], net_cg_df['601766'])複製程式碼
0.45800040483852272複製程式碼

實際上ABuTLSimilar.calc_similar()度量的是兩支股票相對整個市場的相關性評級,它不關心某一個股票具體相關性的數值的大小,calc_similar(a, b) 的工作流程如下:

  1. 計算a與市場中所有股票的相關性
  2. 將所有相關性進行rank排序
  3. 查詢股票b在rank序列中的位置,此位置值即為結果

即ABuTLSimilar.calc_similar返回值由0至1,這樣的好處是通過計算600036與601766在所有股票中的相似度水平,會更全域性客觀的體現相關性。

下面calc_similar的show=True進行視覺化,它視覺化了兩支股票的價格距離,如下所示:

rank_score, _ = tl.similar.calc_similar('600036', '601766', show=True)複製程式碼

4. 自然相關性

上面說的相關性都是通過走勢數值計算度量出的相關性,在股票市場中存在另一種自然相關性,即行業分類的相關。

如下示例abupy中行業分類的相關api,首先從市場中找到與600036處在一個行業中的所有股票,返回dataframe物件,返回中有公司的一些基本資訊和財務資料:

pd.options.display.max_rows = 100
pd.options.display.max_columns = 100
# 找到與600036處在一個行業中的所有股票, 返回dataframe物件
industries, _ = ABuIndustries.industries_df('600036')
# 輸出顯示後5個股票資訊
industries.tail()複製程式碼

自然相關性來自人為的對行業進行分類,可以通過industries_factorize獲取某個市場中所有行業分類資訊,如下獲取港股市場中所有行業:

ABuIndustries.industries_factorize(market=EMarketTargetType.E_MARKET_TARGET_HK)複製程式碼
0     電子商貿及網際網路服務
1        電訊及網路器材
2              -
3           其他零售
4      軟體及資訊科技顧問
5          紡織及成衣
6          賭場與賭博
7        電器部件及裝置
8        家居耐用消費品
9          中國房地產
10         電子消費品
11      飲品 (酒精類)
12     煤炭開採及相關貿易
13            製藥
14          百貨公司
15     醫療保健裝置及用品
16     金屬採礦及相關貿易
17       工業機械及裝置
18          美容護膚
19          影視娛樂
20           農產品
21      造紙、印刷及包裝
22        其他金融服務
23    石油/燃氣裝置及服務
24          地產投資
25          綜合科技
26     投資控股及資產管理
27        電力公用事業
28       環保產品及服務
29        綜合化工產品
30       個人及家居用品
31        綜合支援服務
32            海運
33            食肆
34       交易所買賣基金
35            林業
36            廣告
37          鐘錶珠寶
38            建築
39       成衣及服飾零售
40        環保公用事業
41          綜合地產
42          航空服務
43     消費信貸及貸款融資
44          綜合企業
45            --
46       電腦及周邊產品
47        證券及經紀業
48          汽車零售
49          鐵路基建
50            汽車
51            出版
52            玩具
53         海港與服務
54       包裝食品與肉類
55          電訊服務
56        燃氣公用事業
57         水公用事業
58            酒店
59            鞋類
60     房地產投資信託基金
61          體育用品
62       化肥與農用藥劑
63            旅遊
64        醫療保健服務
65           半導體
66          建築材料
67        綜合飲食製造
68    石油/燃氣加工及分銷
69    綜合旅遊、酒店及食肆
70          公路基建
71       物業管理及代理
72            陸運
73       石油/燃氣勘探
74            銀行
75          電視廣播
76     航空支援及其他服務
77            保險
78          殯儀服務
79          基建投資
80          工業用品
81     飲品 (非酒精類)
82       航空貨運與物流
83       綜合石油與燃氣
84          視力產品
85            基金
86        複合公用事業
87       衛星及航天科技
88       其他紡織及成衣
89    中國汽車與汽車零部件
90          生物科技
91          氣體供應複製程式碼

如果你對上面行業分類中的序號6:賭場與賭博,序號9:中國房地產,比較感興趣,可以使用如下方式查詢這兩個行業中的所有股票資訊:

# 6:賭場與賭博,序號9:中國房地產 只顯示後5支股票資訊
ABuIndustries.query_factorize_industry_df([6, 9], market=EMarketTargetType.E_MARKET_TARGET_HK).tail()複製程式碼

如果你在回測中想使用比如上面兩個分類中的所有股票進行回測,可以使用如下介面獲取行業中所有股票symbol序列:

ABuIndustries.query_factorize_industry_symbol([6, 9], market=EMarketTargetType.E_MARKET_TARGET_HK)[:5]複製程式碼
['hk00149', 'hk02007', 'hk00123', 'hk00272', 'hk00119']複製程式碼

如果已經有了想要查詢的具體行業目標,比如想要從A股市場中模糊查詢醫學相關的股票,可以使用如下介面:

# 從A股市場中查詢醫學相關的股票顯示前5個
ABuIndustries.query_match_industries_df('醫學', market=EMarketTargetType.E_MARKET_TARGET_CN).head()複製程式碼

如果從A股市場中模糊查詢醫學相關所有股票進行回測,可以使用如下介面獲取行業中所有股票symbol序列:

ABuIndustries.query_match_industries_symbol('醫學', market=EMarketTargetType.E_MARKET_TARGET_CN)[:5]複製程式碼
['sz002826', 'sh600645', 'sz300534', 'sh600080', 'sz300595']複製程式碼

小節:

  • 完整的應用相關性進行擇時選股的策略在之後的章節會陸續進行示例,請關注公眾號的更新提醒

abu量化文件目錄章節

  1. 擇時策略的開發
  2. 擇時策略的優化
  3. 滑點策略與交易手續費
  4. 多支股票擇時回測與倉位管理
  5. 選股策略的開發
  6. 回測結果的度量
  7. 尋找策略最優引數和評分
  8. A股市場的回測
  9. 港股市場的回測
  10. 比特幣,萊特幣的回測
  11. 期貨市場的回測
  12. 機器學習與比特幣示例
  13. 量化技術分析應用
  14. 量化相關性分析應用
  15. 量化交易和搜尋引擎
  16. UMP主裁交易決策
  17. UMP邊裁交易決策
  18. 自定義裁判決策交易
  19. 資料來源
  20. A股全市場回測
  21. A股UMP決策
  22. 美股全市場回測
  23. 美股UMP決策

abu量化系統文件教程持續更新中,請關注公眾號中的更新提醒。

更多關於abu量化系統請關注微信公眾號: abu_quant

相關文章