国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
用Python做證券指數(shù)的三種策略分析


這兩天恰好看到一本比較有趣的書,《FOF組合基金》。講的是Fund of Fund,講的是組合基金的理論,架構(gòu)和實(shí)踐。可以說是有既有理論高度,又有實(shí)踐的策略。

其中有段話比較值得玩味?!翱尚屑邪o數(shù)個(gè)可供投資者選擇的證券投資組合。投資者可通過有效集定理來找到最佳的投資組合。所謂最佳投資組合。。。。。滿足兩個(gè)條件:

1、相同風(fēng)險(xiǎn)下具有最大收益率的投資組合

2、同樣收益率的水平下具有最小風(fēng)險(xiǎn)的投資組合

實(shí)踐中還有另外一個(gè)很重要的因子,資金容量

所有人都在尋找高收益率,低風(fēng)險(xiǎn),大容量的策略。但遺憾的是三者不可兼得。。。。共有8種類型的策略。其中比較有代表性的是相對價(jià)值策略,事件驅(qū)動(dòng)策略,宏觀因素策略。

上周股市大漲,本周股市大跌。那么,現(xiàn)在以2月1日的收盤數(shù)據(jù)來看,指數(shù)中有哪些符合中三種策略的指數(shù)?

我嘗試用Python和手中的數(shù)據(jù)做了一個(gè)簡單基于Z值的分析,自我學(xué)習(xí)和分享討論。

1 、相對價(jià)值策略。(低收益,低風(fēng)險(xiǎn),高容量)

書中談的相對價(jià)值策略主要是類固定收益(銀行理財(cái),貨幣基金,債卷,對沖套利等),代價(jià)是犧牲”收益率“,從而保證風(fēng)險(xiǎn)可控,和規(guī)模擴(kuò)大。

書中談的方法?;旧闲枰ㄟ^期貨,期限套利,跨期套利,分級基金折價(jià),溢價(jià),ETF套利,可轉(zhuǎn)債,波動(dòng)率,期權(quán)等方式。也許這種方式就是雪球上 低風(fēng)險(xiǎn)投資的策略吧。

相對價(jià)值策略需要擁有廣闊的知識面和大額的資金。而且2015年后,卷商的ETF交易系統(tǒng)接口已經(jīng)關(guān)閉,ETF套利很難運(yùn)行。未來發(fā)展有賴于接口系統(tǒng)重新開放。

既然那么復(fù)雜,我就把問題簡單化。

1.容量: 設(shè)為 500億以上~5000億日交易額規(guī)模。(盤子必須要大,流動(dòng)性要好)

2.風(fēng)險(xiǎn): 設(shè)為該日市盈率和市凈率為Z值之和最小的5個(gè)指數(shù)。(風(fēng)險(xiǎn)要低)

3.收益率: 無所謂,可以犧牲。

結(jié)果如下: 找到的這5個(gè)指數(shù)的凈資產(chǎn)收益率較低(小于10%),相對風(fēng)險(xiǎn)釋放比較多(市盈率和市凈率的Z值都是歷史中的非常低位置),(盤子比較大(超過500億)。其中以中證1000為最甚。

不過這里的風(fēng)險(xiǎn)最小,只是指數(shù)自己和自己歷史比較的Z值。Z值可以衡量相對風(fēng)險(xiǎn)。絕對風(fēng)險(xiǎn),也許只有FOF組合基金中講的對沖,和組合等策略才能做到。

2、宏觀因素策略。(高收益,高風(fēng)險(xiǎn),高容量)

以犧牲風(fēng)險(xiǎn)為代價(jià)。。。也稱擇時(shí)策略。。。做對,自然收益會(huì)搞;但是如果做錯(cuò),則損失也會(huì)很大。。。總的來說可以分成兩類:拐點(diǎn)擇時(shí)和趨勢擇時(shí)。

注: 這種策略應(yīng)該就是人們常說的”投機(jī)“。

這些策略是技術(shù)流。利用了SVM(支持向量機(jī))挖掘歷史模型,Hurst指數(shù),情緒指數(shù),噪聲指數(shù)等或者是各種均線等。

技術(shù)流暫且不研究,我們可以先看看市場中那些是宏觀因素策略指數(shù)。把問題簡化為:

1.高收益:ROE(PB/PB) 等級為高(15%~21%)(收益率必須要高。注:這里的收益率是長期的)

2.高容量: 50億~500億日交易額 (盤子必須要大,流動(dòng)性要好)

3.高風(fēng)險(xiǎn):(風(fēng)險(xiǎn)無所謂,可以適當(dāng)放寬)

結(jié)果如下:

消費(fèi),食品,飲料等凈資產(chǎn)回報(bào)率很高在20%左右,但是相對價(jià)格,市盈率,市凈率的Z值有的都已經(jīng)超過了3,或者4. 當(dāng)這些指數(shù)回歸均值時(shí),估計(jì)要“疑似銀河落九天”

不過創(chuàng)業(yè)成長指數(shù),近資產(chǎn)匯報(bào)率19%,但是PB,PE的Z值都非常地。日后好好研究,看看是否是一支被錯(cuò)殺的創(chuàng)業(yè)板指數(shù)。

3、事件驅(qū)動(dòng)策略(低風(fēng)險(xiǎn),高收益,資金容量比較?。?/strong>

把問題簡化為:

1.低風(fēng)險(xiǎn):當(dāng)市凈率,市盈率Z值最低

2.高收益: ROE(PB/PB) 較高的5只指數(shù)(收益率必須要高。注:這里的收益率是長期的)

3.容量: 不設(shè)限制

他們分別是創(chuàng)業(yè)成長,新能源車,和文化類指數(shù)。

新能源車由于補(bǔ)貼政策的變化,不斷的估值調(diào)整,下滑。

文化類指數(shù),由于樂視這個(gè)老鼠屎,整個(gè)系列都在過去兩年墊底。

不過創(chuàng)業(yè)成長指數(shù)凈資產(chǎn)回報(bào)率非常高,卻估值很低,風(fēng)險(xiǎn)釋放充分。

代碼在后面:

1、初始化環(huán)境 主要用到了Python numpy,Pandas, Scipy.stats, Matplotlib,還有seaborn 等包. 證券投資的機(jī)器學(xué)習(xí)預(yù)測,通常需要準(zhǔn)備大量數(shù)據(jù)進(jìn)行回測。 本文不包含預(yù)測和回測部分。

注:預(yù)測和回測也沒用??戳薋OF組合基金一書才知道,2015年卷商交易接口已經(jīng)關(guān)閉。估計(jì)ETF高頻套利也不能做了。 此處如果理解有誤,還請高人指點(diǎn)。

  1. import pandas as pd

  2. import numpy as np

  3. from scipy import stats

  4. import matplotlib.pyplot as plt

  5. import seaborn as sns

  6. %matplotlib inline

  7. !free -h

  8. # 以下代碼是為了顯示正文正常

  9. import matplotlib as mpl

  10. import matplotlib.font_manager as font_manager

  11. path_eng = '/usr/share/fonts/chinese/REFSAN.TTF'

  12. path_CHN = '/usr/share/fonts/chinese/simhei.ttf'

  13. prop = font_manager.FontProperties(fname=path_CHN)  #Set the microsoft sans serief as default font family. if show chinese test, set path_CHN instead.

  14. #prop.set_weight = 'light'

  15. mpl.rcParams['font.family'] = prop.get_name()

  16. Today = '2018-02-01'

數(shù)據(jù)概覽

  1. def view_data():

  2.    print('數(shù)據(jù)載入中...')

  3.    sec_map = pd.read_hdf('uqer/sec_map.h5','map') # sec_map 包含了約2800多個(gè)指數(shù),實(shí)際指數(shù)約550只

  4.    history = pd.read_hdf('uqer/uq_history.h5','history') #hisotry 包含了從2004年到2017年11月16日的指數(shù)數(shù)據(jù)( 大約86萬條數(shù)據(jù)).

  5.    #history = history.sort_index(level=0)

  6.    ntickers = history.index.levshape[0]

  7.    nTradeDate =history.index.levshape[1]/250

  8.    nRecords = history.shape[0]/10**4

  9.    print('交易歷史數(shù)據(jù)庫包含了:\n\t{1:,.0f}萬條日交易數(shù)據(jù).\n\t{0}只指數(shù),\n\t單只指數(shù)最長交易記錄為{2:.1f}年.'.format(ntickers,nRecords,nTradeDate))

  10.    print('\n注 : 數(shù)據(jù)源基于Uqer,作了初步校對和修正,后存儲(chǔ)在 History_fixed.h5 。例如:中證傳媒2017年12月~1月的市盈率數(shù)據(jù)修正為choice的數(shù)據(jù)。\n\n')

  11.    print('歷史交易數(shù)據(jù):\n   特征列表:{0}'.format(history.columns.tolist()))

  12.    print('股指名稱數(shù)據(jù):\n   特征列表:{0}'.format(sec_map.columns.tolist()))

  13. view_data()

  14. map_E2C = {'ticker':'指數(shù)代碼','secShortName':'指數(shù)名稱',

  15.            'tradeDate':'日期', 'Close':'收盤價(jià)-Close',

  16.             'PB1':'市凈率-PB', 'PE1':'市盈率-PE',

  17.             'TurnoverValue':'成交額', 'TurnoverVol':'成交量','ROE':'凈資產(chǎn)回報(bào)率-ROE'}

  18. print('\n本文使用的特征為:{0}'.format(list(map_E2C.values())))

數(shù)據(jù)載入中... 交易歷史數(shù)據(jù)庫包含了: 91萬條日交易數(shù)據(jù). 550只指數(shù), 單只指數(shù)最長交易記錄為10.8年.

注 : 數(shù)據(jù)源基于Uqer,作了初步校對和修正,后存儲(chǔ)在 History_fixed.h5 。例如:中證傳媒2017年12月~1月的市盈率數(shù)據(jù)修正為choice的數(shù)據(jù)。

歷史交易數(shù)據(jù): 特征列表:['secID', 'Close', 'PB1', 'PB2', 'PE1', 'PE2', 'TurnoverValue', 'TurnoverVol'] 股指名稱數(shù)據(jù): 特征列表:['baseDate', 'basePoint', 'endDate', 'indexType', 'indexTypeCD', 'porgFullName', 'pubOrgCD', 'publishDate', 'secID', 'secShortName']

本文使用的特征為:['指數(shù)代碼', '指數(shù)名稱', '日期', '收盤價(jià)-Close', '市凈率-PB', '市盈率-PE', '成交額', '成交量', '凈資產(chǎn)回報(bào)率-ROE']

特征工程

1.2.1 篩選有效數(shù)據(jù)

  • 數(shù)據(jù)中存在缺失,故只篩選截至2018年1月25日有交易記錄的數(shù)據(jù)。

  • 歷史交易數(shù)據(jù)過少,沒有統(tǒng)計(jì)意義(暫定至少3年)

  1. def filter_history():

  2.    def ticker_filter(x):

  3.        ntradedays_annual = 250  # 假設(shè)一年交易日為250天

  4.        nyear=3                 # 假設(shè)至少需要3年數(shù)據(jù)

  5.        checkday=Today          # Checkday是設(shè)定有效的交易日期。默認(rèn)為Today, 全局變量

  6.        mask_years    = x.shape[0]>(ntradedays_annual*nyear)

  7.        mask_checkday = x.index.isin([checkday],level='tradeDate').any()

  8.        mask = mask_years & mask_checkday

  9.        return mask

  10.    history = pd.read_hdf('uqer/uq_history.h5','history') #hisotry 包含了從2004年到2017年11月16日的指數(shù)數(shù)據(jù)( 大約86萬條數(shù)據(jù)).

  11.    history= history.loc(axis=0)[:,:Today]

  12.    history_filtered= history.groupby(level=0).filter(ticker_filter)

  13.    ntickers = len(history_filtered.groupby(level=0).groups)

  14.    print('{0}只指數(shù)交易時(shí)間超過了3年 且在{1}日有交易記錄'.format(ntickers,Today))

  15.    return history_filtered

  16. history =filter_history()

483只指數(shù)交易時(shí)間超過了3年 且在2018-02-01日有交易記錄

1.2.2 添加ROE(凈資產(chǎn)回報(bào)率)特征

  1. history['ROE'] = history['PB1']/history['PE1']

1.2.3 特征提取

  • 交易日最新數(shù)據(jù)匯總。 取指定交易日因子數(shù)據(jù)

  • 凈資產(chǎn)回報(bào)率特征。 取一年的數(shù)據(jù)平均值,然后按回報(bào)率分成4個(gè)級別。級別(超低,低,中,高)

  • 交易額規(guī)模特征。取一年的數(shù)據(jù)平均值,然后按日平均交易額分成4個(gè)級別(小于5億,小于50億,小于500億,小于5000億)

  • Z值(各個(gè)指標(biāo)的標(biāo)準(zhǔn)差倍數(shù))。 針對所有歷史數(shù)據(jù),計(jì)算Zscore(標(biāo)準(zhǔn)差倍數(shù))。

  1. def Check_summary():

  2.    def lastz(x):

  3.        freedom = 1 # it is sample, so the sample std degree of freedome should not be 0 but 1

  4.        Arry=x.values

  5.        zscore = stats.zmap(Arry[-1],Arry,ddof=freedom)

  6.        return zscore

  7.    def recent_mean(x):

  8.        mean = x.tail(250).sum()/250

  9.        return mean

  10.    grp = history.groupby(level=0)

  11.    grp_last = grp.agg({'Close':'last','PE1':'last','PB1':'last','ROE':'last','TurnoverValue':'last'})

  12.    grp_last['TurnoverValue'] =grp_last['TurnoverValue']

  13.    grp_rank = grp.agg({'ROE':recent_mean,'TurnoverValue':recent_mean})

  14.    grp_z = grp.agg({'Close':lastz,'PE1':lastz,'PB1':lastz,'ROE':lastz,'TurnoverValue':lastz})

  15.    ROE_rank = pd.cut(grp_rank.ROE,bins=4,labels=['超低','低','中','高'])

  16.    TV_rank = pd.cut(grp_rank.TurnoverValue,bins=5*np.logspace(7,11,5),labels=['5億','50億','500億','5000億'])

  17.    ROE_rank.name = '凈資產(chǎn)回報(bào)率等級'

  18.    TV_rank.name ='日交易額規(guī)模'    

  19.    sec_map = pd.read_hdf('uqer/sec_map.h5','map') # sec_map 包含了約2800多個(gè)指數(shù),實(shí)際指數(shù)約550只{}

  20.    #decimals = pd.Series([1,1,1,2,1 ], index=['Close','PE1','PB1','ROE','TurnoverValue'])

  21.    combined = sec_map[['secShortName']].join(grp_last,how='right').join(ROE_rank,rsuffix='_R').join(TV_rank,rsuffix='_R')

  22.    combined = combined.join(grp_z,rsuffix='_Z')

  23.    return combined

  24. checkday_summary = Check_summary()

  25. checkday_summary.columns

Index(['secShortName', 'Close', 'PE1', 'PB1', 'ROE', 'TurnoverValue', '凈資產(chǎn)回報(bào)率等級', '日交易額規(guī)模', 'CloseZ', 'PE1Z', 'PB1Z', 'ROEZ', 'TurnoverValue_Z'], dtype='object')

1.3 數(shù)據(jù)探索

1.3.1 不同日交易額的指數(shù)群中指數(shù)的數(shù)量

  1. tmp=sns.countplot('日交易額規(guī)模',data=checkday_summary)

  1. checkday_summary.groupby(by='日交易額規(guī)模')[['ROE']].mean().rename(columns={'ROE':'平均凈資產(chǎn)回報(bào)率'})

1.3.2 收盤價(jià)(Close)

  1. col='Close'

  2. fig,ax = plt.subplots(1,2,figsize=(10,5))

  3. sns.boxplot(x='日交易額規(guī)模',y=col,ax=ax[0],data=checkday_summary)

  4. ax[0].set_title('不同規(guī)模指數(shù) - {0}({1})箱體圖'.format(map_E2C[col],col))

  5. sns.boxplot(x='日交易額規(guī)模',y=col+'_Z',ax=ax[1],data=checkday_summary)

  6. ax[1].set_title('不同規(guī)模指數(shù) - {0}({1})-Z值 箱體圖'.format(map_E2C[col],col))

指定日收盤價(jià)匯總箱形圖 展現(xiàn)不同指數(shù)的收盤價(jià)差異: 左圖是絕對值:不同規(guī)模的指數(shù)在該日收盤價(jià)價(jià)值不同。 右圖是相對值:用Z值(即幾個(gè)標(biāo)準(zhǔn)差)來衡量不同規(guī)模指數(shù)群的收盤價(jià)和各指數(shù)自己歷史相比的差異。(500億規(guī)模的指數(shù)收盤價(jià)差異比較大,Z指在4和-1之間。 從右圖可以看出, 除了交易規(guī)模為50億的小盤指數(shù)外,其他指數(shù)的日收盤價(jià)的Z值均值都在1附近。 各個(gè)日交易規(guī)模的指數(shù)群都有些Z值在(-1,1)之外的指數(shù),這中間也許存在機(jī)會(huì)和風(fēng)險(xiǎn)。 Z值<-1, 有低估的可能。="" 可以考慮定投的方式逐步買入。="" z值="">1, 有高估的可能??梢钥紤]逐步買出。

注:考慮到通貨膨脹和指數(shù)內(nèi)股票的增長,通常指數(shù)收盤價(jià)會(huì)出現(xiàn)Z值小于-1的情況。收盤價(jià)Z值>1甚至大于2都是比較常見的情況。

1.3.3 市盈率(PE1)

  1. col='PE1'

  2. fig,ax = plt.subplots(1,2,figsize=(10,5))

  3. sns.boxplot(x='日交易額規(guī)模',y=col,ax=ax[0],data=checkday_summary)

  4. ax[0].set_title('不同規(guī)模指數(shù) - {0}({1})箱體圖'.format(map_E2C[col],col))

  5. sns.boxplot(x='日交易額規(guī)模',y=col+'_Z',ax=ax[1],data=checkday_summary)

  6. ax[1].set_title('不同規(guī)模指數(shù) - {0}({1})-Z值 箱體圖'.format(map_E2C[col],col))

指定日市盈率匯總箱形圖 展現(xiàn)不同指數(shù)的市盈率差異: 左圖是絕對值:不同規(guī)模的指數(shù)在該日市盈率估值不同。 注:由于市盈率計(jì)算方法不一樣,例如:加權(quán),等權(quán),算術(shù)平均等模式。故不同數(shù)據(jù)源的市盈率,市凈率差異比較大。指數(shù)官網(wǎng)的市盈率和市凈率比較權(quán)威。不過使用費(fèi)用比較高。本文使用的是免費(fèi)數(shù)據(jù)。因此可以看出這一天5億規(guī)模指數(shù)群中有一個(gè)指數(shù)的市盈率小于-150倍。這是明顯錯(cuò)誤的。需要過濾掉。

右圖是相關(guān)值:用Z值(即幾個(gè)標(biāo)準(zhǔn)差)來衡量不同規(guī)模指數(shù)的市盈率和各自歷史相比差異。 由于Z值計(jì)算是用全部歷史數(shù)據(jù)來計(jì)算,故歷史上的錯(cuò)誤數(shù)據(jù)(如果數(shù)量不大的話,例如小于1%),對整理影響不大。只要將異常點(diǎn)過濾即可。 從右圖可以看出,除了交易規(guī)模為50億的小盤指數(shù)外,其他指數(shù)的日收盤價(jià)的Z值均值都在0附近。但是也有一些指數(shù)群中有(-1,1)之外的Z值。 Z值<-1, 有低估的可能。="" 可以考慮定投的方式逐步買入。="" z值="">1, 有高估的可能??梢钥紤]逐步買出。 接下來,我們來看看都有哪些指數(shù)市盈率存在低估?

  1. def show_min_PE_Z():

  2.    col='PE1'

  3.    def get_max(x):

  4.        colz= col+'_Z'

  5.        index =x[colz].idxmax()

  6.        return x.loc[index][['secShortName',col,colz]]

  7.    def get_min(x):

  8.        colz= col+'_Z'

  9.        index =x[colz].idxmin()

  10.        return x.loc[index][['secShortName',col,colz]]

  11.    print(checkday_summary.groupby('日交易額規(guī)模').apply(get_max).round(1))

  12.    print(checkday_summary.groupby('日交易額規(guī)模').apply(get_min).round(1))

  13. show_min_PE_Z()

如上表中,所展示, 低估指數(shù): Z值小于-1。 例如:中證1000(000852),新能源車(399417),文化指數(shù)分別是日交易規(guī)模(大盤,中盤,小盤)中Z值最低的指數(shù)。 高估指數(shù):Z值大于2。 例如: 中經(jīng)GDP,央視50(399550),水電指數(shù)分別是日交易規(guī)模(大盤,中盤,小盤)中Z值最高的指數(shù)。 如果這些指數(shù)的歷史分布是正態(tài), 那么根據(jù)經(jīng)驗(yàn)法則,就存在較大的機(jī)會(huì)(針對低估)和風(fēng)險(xiǎn)(針對高估) 接下來,看看500億日交易額規(guī)模指數(shù)群中新能源車和央視50這兩個(gè)比較常見的指數(shù)歷史數(shù)據(jù)的市盈率的波動(dòng)。

  1. tickers=['399417','399550']

  2. sec_map = pd.read_hdf('uqer/sec_map.h5','map')

  3. for ticker in tickers:

  4.    print('{0} base day is {1}'.format(ticker,sec_map.loc[ticker].baseDate))

  5.    fig,ax = plt.subplots(1,2,figsize=(6,3))

  6.    fig.suptitle(ticker)

  7.    PE1 = history.loc[ticker]['PE1']

  8.    PE1_Z = history.loc[ticker][['PE1']].apply(stats.zscore)

  9.    PE1.plot(ax=ax[0])

  10.    sns.distplot(PE1_Z,ax=ax[1],vertical=True)

從上圖可以看出,2018年2月1日的市盈率圖 新能源市盈率為22倍,絕對值不算高。但是Z指接近-1.5,相對值比較低,未來有很大的機(jī)會(huì)。 央視50市盈率為13倍,絕對值比較低。但是Z值接近4,相對值極度高,未來存在回歸歷史均值的風(fēng)險(xiǎn)

1.3.4 市凈率 (PB1)

  1. col='PB1'

  2. fig,ax = plt.subplots(1,2,figsize=(10,5))

  3. sns.boxplot(x='日交易額規(guī)模',y=col,ax=ax[0],data=checkday_summary)

  4. ax[0].set_title('不同規(guī)模指數(shù) - {0}({1})箱體圖'.format(map_E2C[col],col))

  5. sns.boxplot(x='日交易額規(guī)模',y=col+'_Z',ax=ax[1],data=checkday_summary)

  6. ax[1].set_title('不同規(guī)模指數(shù) - {0}({1})-Z值 箱體圖'.format(map_E2C[col],col))

與市盈率數(shù)據(jù)類似 指定日市凈率匯總箱形圖 展現(xiàn)不同指數(shù)的市凈率差異: 左圖是絕對值:不同規(guī)模的指數(shù)在該日市凈率估值不同。 右圖是相關(guān)值:用Z值(即幾個(gè)標(biāo)準(zhǔn)差)來衡量不同規(guī)模指數(shù)的市凈率和各自歷史相比差異。 從右圖可以看出,除了交易規(guī)模為50億的小盤指數(shù)外,其他指數(shù)的日收盤價(jià)的Z值均值都在0附近。但是也有一些指數(shù)群中有(-1,1)之外的Z值。 Z值<-1, 有低估的可能。="" 可以考慮定投的方式逐步買入。="" z值="">1, 有高估的可能??梢钥紤]逐步買出。 接下來,我們來看看都有哪些指數(shù)市凈率存在低估?

  1. def show_min_PB_Z():

  2.    col='PB1'

  3.    def get_max(x):

  4.        colz= col+'_Z'

  5.        index =x[colz].idxmax()

  6.        return x.loc[index][['secShortName',col,colz]]

  7.    def get_min(x):

  8.        colz= col+'_Z'

  9.        index =x[colz].idxmin()

  10.        return x.loc[index][['secShortName',col,colz]]

  11.    print(checkday_summary.groupby('日交易額規(guī)模').apply(get_max).round(1))

  12.    print(checkday_summary.groupby('日交易額規(guī)模').apply(get_min).round(1))

  13. show_min_PB_Z()

從上圖可以看出,2018年2月1日的市盈率圖 新能源車市盈率為2.7倍,絕對值不算高。而且Z指接近-1.5,相對值比較低,未來有很大的機(jī)會(huì)。 國證食品市盈率為6.7倍,絕對值非常高。而且Z值接近3.2,相對值極度高,未來存在回歸歷史均值(3年歷史)的風(fēng)險(xiǎn)。 注:由于國證食品指數(shù)在2004年就成立,缺少之前近十年歷史數(shù)據(jù)。無法完全確定是否高估

1.3.5 凈資產(chǎn)回報(bào)率(ROE)

  1. col='ROE'

  2. fig,ax = plt.subplots(1,2,figsize=(10,5))

  3. sns.boxplot(x='日交易額規(guī)模',y=col,ax=ax[0],data=checkday_summary)

  4. ax[0].set_title('不同規(guī)模指數(shù) - {0}({1})箱體圖'.format(map_E2C[col],col))

  5. sns.boxplot(x='日交易額規(guī)模',y=col+'_Z',ax=ax[1],data=checkday_summary)

  6. ax[1].set_title('不同規(guī)模指數(shù) - {0}({1})-Z值 箱體圖'.format(map_E2C[col],col))

與市盈率數(shù)據(jù)類似 指定日凈資產(chǎn)回報(bào)率匯總箱形圖 展現(xiàn)不同指數(shù)的凈資產(chǎn)回報(bào)率差異: 左圖是絕對值:不同規(guī)模的指數(shù)在該日凈資產(chǎn)回報(bào)率估值不同。 右圖是相關(guān)值:用Z值(即幾個(gè)標(biāo)準(zhǔn)差)來衡量不同規(guī)模指數(shù)的凈資產(chǎn)回報(bào)率和各自歷史相比差異。 和市盈率與市凈率不同,凈資產(chǎn)回報(bào)率(ROE=PB/PE= profit/equity)排除了收盤價(jià)的短期波動(dòng)影響,是比較長期的指標(biāo)。我個(gè)人認(rèn)為,長期指標(biāo)穩(wěn)健比較好。即ROE>0.1 而且Z指在(-1,1)之間的指數(shù)。

1.3.6 綜合分析 - 流動(dòng)性 + 風(fēng)險(xiǎn) + 收益

前面已經(jīng)單獨(dú)對4個(gè)因子作了分析。他們分別代表了

  • 流動(dòng)性(日交易額規(guī)模),

  • 風(fēng)險(xiǎn)(市盈率和市凈率)

  • 收益(凈資產(chǎn)回報(bào))

現(xiàn)在,讓我們試著把這四個(gè)因子綜合起來看看。

  1. mask_scale= checkday_summary['日交易額規(guī)模'].isin(['50億','500億','5000億'])

  2. print('滿足流動(dòng)性規(guī)模的指數(shù)有{0}只'.format(mask_scale.sum()))

  3. risk_zscore= -1.4  #注 z值小于 -1 的 指數(shù)太少,故改設(shè)為-0.3

  4. mask_risk= (checkday_summary['PE1_Z']0) & (checkday_summary['PB1_Z']0)\

  5.    &((checkday_summary['PE1_Z'] + checkday_summary['PB1_Z']<>

  6. print('滿足低風(fēng)險(xiǎn)要求的指數(shù)有{0}只'.format(mask_risk.sum()))

  7. roe_score =['中','高']

  8. roe_zscore =[-2,2]

  9. mask_roe = checkday_summary['凈資產(chǎn)回報(bào)率等級'].isin(roe_score) & checkday_summary['ROE_Z'].between(roe_zscore[0],roe_zscore[-1])

  10. print('滿足收益率要求的指數(shù)有{0}只'.format(mask_roe.sum()))

  11. mask_all = mask_scale & mask_risk & mask_roe

  12. result =checkday_summary[mask_all].drop_duplicates(subset=['secShortName'])

  13. print('滿足高流動(dòng)性,低風(fēng)險(xiǎn),較好收益率要求的指數(shù)有{0}只'.format(result.shape[0]))

滿足流動(dòng)性規(guī)模的指數(shù)有478只 滿足低風(fēng)險(xiǎn)要求的指數(shù)有59只 滿足收益率要求的指數(shù)有310只 滿足高流動(dòng)性,低風(fēng)險(xiǎn),較好收益率要求的指數(shù)有24只

投資策略

  1. def strategy_tickers_today(strategy='customize',scale_score =None,risk_zscore =None,roe_score =None):

  2.    if strategy =='customize':

  3.        scale_score =['50億','500億','5000億']

  4.        scale_zscore=(-1,1)

  5.        risk_zscore= -1.4  #注 z值小于 -1 的 指數(shù)太少,故改設(shè)為-0.3

  6.        roe_score =['中','高']

  7.        roe_zscore =[-2,2]

  8.    elif strategy =='ROE':

  9.        scale_score =None

  10.        risk_zscore= None

  11.        roe_score =['高']

  12.    elif strategy =='RISK':

  13.         risk_zscore= -2 #PE & PB Z值小于-2, 如果是 正態(tài)分布,這風(fēng)險(xiǎn)小于95%

  14.    elif strategy =='TURNOVER':

  15.        scale_score =['5000億']

  16.        scale_zscore=(-1,1)

  17.    #交易規(guī)模過濾  

  18.    if scale_score ==None:

  19.        mask_scale =True

  20.    else:

  21.        mask_scale= (checkday_summary['日交易額規(guī)模'].isin(scale_score)) \

  22.        & ( checkday_summary['TurnoverValue_Z'].between(scale_zscore[0],scale_zscore[-1]))

  23.    #風(fēng)險(xiǎn)指標(biāo)過濾

  24.    if risk_zscore ==None:

  25.        mask_risk =True

  26.    else:

  27.        risk_zscore= -1.4

  28.        mask_risk= (checkday_summary['PE1_Z']0) & (checkday_summary['PB1_Z']0)\

  29.        &((checkday_summary['PE1_Z'] + checkday_summary['PB1_Z']<>

  30.    #投資回報(bào)率過濾

  31.    if roe_score ==None:

  32.        mask_roe=True

  33.    else:

  34.        mask_roe = checkday_summary['凈資產(chǎn)回報(bào)率等級'].isin(roe_score)

  35.    mask_all = mask_scale & mask_risk & mask_roe

  36.    result =checkday_summary[mask_all].drop_duplicates(subset=['secShortName'])

  37.    return result

  38. def show_tickers_color(tickers= None):

  39.    if (tickers is None) or (tickers.shape[0]==0):

  40.        print('Pls prepare the checkday_summary dataframe')

  41.        return

  42.    else:

  43.        html =tickers[['secShortName','Close', 'PE1', 'PB1', 'ROE','Close_Z', 'PE1_Z', 'PB1_Z', 'ROE_Z','凈資產(chǎn)回報(bào)率等級', '日交易額規(guī)模']]\

  44.     .round(2).rename(columns=map_E2C).style.bar(subset=['Close_Z', 'PE1_Z', 'PB1_Z'],\

  45.             align='zero', color=[ '#5fba7d','#d65f5f',],width=100/2)

  46.        return html

低風(fēng)險(xiǎn)策略

  1. tmp = strategy_tickers_today('RISK')

  2. tmp['RISK'] = tmp['PE1_Z'] + tmp['PB1_Z']+tmp['Close_Z']*0.2

  3. show_tickers_color(tmp.sort_values(by=['ROE'],ascending=False).head(5))

根據(jù)不同的Z值組合和因子組合,高收益策略或者高容量策略也很容易合成。

衡量市場,指數(shù)高低是一個(gè)難題! 價(jià)值投資者很難判斷,

現(xiàn)在是高估,還是低估?

買的是便宜還是,貴了?

應(yīng)該現(xiàn)在買/賣,還是再等等?

針對這個(gè)問題,我在網(wǎng)上看到了一些量化的處理方法。例如:平均數(shù)法,中位數(shù)法,比例法等等。這種方法往往過于簡單,只能衡量集中度。不能衡量離散度和概率。

也許統(tǒng)計(jì)方法中的標(biāo)準(zhǔn)差Z值法更加適合。既可以衡量某個(gè)指數(shù)的指標(biāo)的集中度,還可以衡量離散度,和風(fēng)險(xiǎn)情況。盡管指數(shù)的數(shù)據(jù)也不是完美的正態(tài)分布,但Z值法依然存在較大參考意義。

我的觀點(diǎn):

Z值越大,越高估。因?yàn)榇髷?shù)定理認(rèn)為:

Z>1, Z>2,意味著繼續(xù)變大的可能性小于16%, 5%。Z值越小,越低估。

因?yàn)榇髷?shù)定理認(rèn)為:Z<-1,><-2,意味著繼續(xù)變小的可能性小于16%,>

綜觀550多只指數(shù)的歷史數(shù)據(jù)。絕大部分指數(shù)的Z值都在-2,3之間。注:少數(shù)的能源,金屬類指數(shù)曾經(jīng)出現(xiàn)過短暫瘋狂的。Z值法就不太適用。

我使用Python的Pandas 和 Matplotlib 等工具,加上一些渠道獲得的指數(shù)數(shù)據(jù)(尤其是市盈率),發(fā)布熱門指數(shù)Z值表。 今天又結(jié)合了不可能三角形思路做了一些投資策略的基本探索。

主要目的是:

  • 方便自己定投使用。知道何時(shí)開始定投,何時(shí)停止定投,何時(shí)止盈。(目前還沒有止盈過)

  • 結(jié)合統(tǒng)計(jì)學(xué),熟悉Python的基本數(shù)據(jù)分析方法。

  • 網(wǎng)上分享給愿意參考的人,交流和學(xué)習(xí)

有不當(dāng)之處,歡迎指正

本文作者

王勇,Python中文社區(qū)專欄作者,雪球ID:快樂_爸,目前感興趣項(xiàng)目商業(yè)分析、Python、機(jī)器學(xué)習(xí)、Kaggle。17年項(xiàng)目管理,通信業(yè)干了11年項(xiàng)目經(jīng)理管合同交付,制造業(yè)干了6年項(xiàng)目管理:PMO,變革,生產(chǎn)轉(zhuǎn)移,清算和資產(chǎn)處理。MBA, PMI-PBA, PMP。


本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服