Python 做證券指數三種策略分析 - 最高收益,最大規模,最小風險
關鍵詞: Python, Pandas, Groupby, Scipy, FOF, 投資策略, 指數, Z值,不可能三角形,流動性,收益,風險。
預計閱讀時間:30分鐘
我本周已經在雪球發布了相關文章,策略的分析結果和思路,知乎發表的文章不同之處在於增加了Python的代碼。
大跌之後的三種機會 - 最高收益,最低風險,最大規模什麼值得定投- 有8個指數,滿足高流動性,低風險,中高收益1月31日熱門指數Z值表 - 盈虧同源。本周1000億走了,大跌。這兩天恰好看到一本比較有趣的書,《FOF組合基金》。講的是Fund of Fund,講的是組合基金的理論,架構和實踐。可以說是有既有理論高度,又有實踐的策略。
其中有段話比較值得玩味。「可行集中包括無數個可供投資者選擇的證券投資組合。投資者可通過有效集定理來找到最佳的投資組合。所謂最佳投資組合。。。。。滿足兩個條件:
1。相同風險下具有最大收益率的投資組合
2。同樣收益率的水平下具有最小風險的投資組合
實踐中還有另外一個很重要的因子,資金容量
所有人都在尋找高收益率,低風險,大容量的策略。但遺憾的是三者不可兼得。。。。共有8種類型的策略。其中比較有代表性的是相對價值策略,事件驅動策略,宏觀因素策略。
上周股市大漲,本周股市大跌。那麼,現在以2月1日的收盤數據來看,指數中有哪些符合中三種策略的指數?
我嘗試用Python 和 手中的數據做了一個簡單基於Z值的分析,自我學習和分享討論。
1 . 相對價值策略。(低收益,低風險,高容量)
書中談的相對價值策略主要是類固定收益(銀行理財,貨幣基金,債卷,對沖套利等),代價是犧牲」收益率「,從而保證風險可控,和規模擴大。
書中談的方法。基本上需要通過期貨,期限套利,跨期套利,分級基金折價,溢價,ETF套利,可轉債,波動率,期權等方式。也許這種方式就是雪球上 低風險投資的策略吧 @DAVID自由之路
相對價值策略需要擁有廣闊的知識面和大額的資金。而且2015年後,卷商的ETF交易系統介面已經關閉,ETF套利很難運行。未來發展有賴於介面系統重新開放。
既然那麼複雜,我就把問題簡單化。
1.容量: 設為 500億以上~5000億日交易額規模。(盤子必須要大,流動性要好)
2. 風險: 設為該日市盈率和市凈率為Z值之和最小的5個指數。(風險要低)
3. 收益率: 無所謂,可以犧牲。
結果如下: 找到的這5個指數的凈資產收益率較低(小於10%),相對風險釋放比較多(市盈率和市凈率的Z值都是歷史中的非常低位置),(盤子比較大(超過500億)。其中以中證1000為最甚。
不過這裡的風險最小,只是指數自己和自己歷史比較的Z值。Z值可以衡量相對風險。絕對風險,也許只有FOF組合基金中講的對沖,和組合等策略才能做到。
2. 宏觀因素策略。(高收益,高風險,高容量)
以犧牲風險為代價。。。也稱擇時策略。。。做對,自然收益會搞;但是如果做錯,則損失也會很大。。。總的來說可以分成兩類:拐點擇時和趨勢擇時。
註: 這種策略應該就是人們常說的」投機「。
這些策略是技術流。利用了SVM(支持向量機)挖掘歷史模型,Hurst指數,情緒指數,雜訊指數等或者是各種均線等。
技術流暫且不研究,我們可以先看看市場中那些是宏觀因素策略指數。把問題簡化為:
1. 高收益:ROE(PB/PB) 等級為高(15%~21%)(收益率必須要高。註:這裡的收益率是長期的)
2. 高容量: 50億~500億日交易額 (盤子必須要大,流動性要好)
3. 高風險:(風險無所謂,可以適當放寬)
結果如下:
消費,食品,飲料等凈資產回報率很高在20%左右,但是相對價格,市盈率,市凈率的Z值有的都已經超過了3,或者4. 當這些指數回歸均值時,估計要「疑似銀河落九天」
不過創業成長指數,近資產彙報率19%,但是PB,PE的Z值都非常地。日後好好研究,看看是否是一支被錯殺的創業板指數。
3. 事件驅動策略(低風險,高收益,資金容量比較小)
把問題簡化為:
1. 低風險:當市凈率,市盈率Z值最低
2. 高收益: ROE(PB/PB) 較高的5隻指數(收益率必須要高。註:這裡的收益率是長期的)
3.容量: 不設限制
他們分別是創業成長,新能源車,和文化類指數。
新能源車由於補貼政策的變化,不斷的估值調整,下滑。
文化類指數,由於樂視這個老鼠屎,整個系列都在過去兩年墊底。
不過創業成長指數凈資產回報率非常高,卻估值很低,風險釋放充分。
代碼在後面:
- 初始化環境
主要用到了Python numpy,Pandas, Scipy.stats, Matplotlib,還有seaborn 等包. 證券投資的機器學習預測,通常需要準備大量數據進行回測。 本文不包含預測和回測部分。
註:預測和回測也沒用。看了FOF組合基金一書才知道,2015年卷商交易介面已經關閉。估計ETF高頻套利也不能做了。 此處如果理解有誤,還請高人指點。
import pandas as pdimport numpy as npfrom scipy import statsimport matplotlib.pyplot as pltimport seaborn as sns%matplotlib inline!free -h# 以下代碼是為了顯示正文正常import matplotlib as mplimport matplotlib.font_manager as font_managerpath_eng = /usr/share/fonts/chinese/REFSAN.TTFpath_CHN = "/usr/share/fonts/chinese/simhei.ttf"prop = font_manager.FontProperties(fname=path_CHN) #Set the microsoft sans serief as default font family. if show chinese test, set path_CHN instead.#prop.set_weight = lightmpl.rcParams[font.family] = prop.get_name()Today = "2018-02-01"
數據概覽
def view_data(): print("數據載入中...") sec_map = pd.read_hdf("uqer/sec_map.h5","map") # sec_map 包含了約2800多個指數,實際指數約550隻 history = pd.read_hdf("uqer/uq_history.h5","history") #hisotry 包含了從2004年到2017年11月16日的指數數據( 大約86萬條數據). #history = history.sort_index(level=0) ntickers = history.index.levshape[0] nTradeDate =history.index.levshape[1]/250 nRecords = history.shape[0]/10**4 print("交易歷史資料庫包含了:
{1:,.0f}萬條日交易數據.
{0}只指數,
單只指數最長交易記錄為{2:.1f}年.".format(ntickers,nRecords,nTradeDate)) print("
注 : 數據源基於Uqer,作了初步校對和修正,後存儲在 History_fixed.h5 。例如:中證傳媒2017年12月~1月的市盈率數據修正為choice的數據。
") print("歷史交易數據:
特徵列表:{0}".format(history.columns.tolist())) print("股指名稱數據:
特徵列表:{0}".format(sec_map.columns.tolist()))view_data()map_E2C = {"ticker":"指數代碼","secShortName":"指數名稱", tradeDate:"日期", Close:"收盤價-Close", PB1:"市凈率-PB", PE1:"市盈率-PE", TurnoverValue:"成交額", TurnoverVol:"成交量","ROE":"凈資產回報率-ROE"}print("
本文使用的特徵為:{0}".format(list(map_E2C.values())))
數據載入中...
交易歷史資料庫包含了: 91萬條日交易數據. 550隻指數, 單只指數最長交易記錄為10.8年.注 : 數據源基於Uqer,作了初步校對和修正,後存儲在 History_fixed.h5 。例如:中證傳媒2017年12月~1月的市盈率數據修正為choice的數據。歷史交易數據:特徵列表:[secID, Close, PB1, PB2, PE1, PE2, TurnoverValue, TurnoverVol]
股指名稱數據: 特徵列表:[baseDate, basePoint, endDate, indexType, indexTypeCD, porgFullName, pubOrgCD, publishDate, secID, secShortName]本文使用的特徵為:[指數代碼, 指數名稱, 日期, 收盤價-Close, 市凈率-PB, 市盈率-PE, 成交額, 成交量, 凈資產回報率-ROE]
特徵工程
1.2.1 篩選有效數據
- 數據中存在缺失,故只篩選截至2018年1月25日有交易記錄的數據。
- 歷史交易數據過少,沒有統計意義(暫定至少3年)
def filter_history(): def ticker_filter(x): ntradedays_annual = 250 # 假設一年交易日為250天 nyear=3 # 假設至少需要3年數據 checkday=Today # Checkday是設定有效的交易日期。默認為Today, 全局變數 mask_years = x.shape[0]>(ntradedays_annual*nyear) mask_checkday = x.index.isin([checkday],level="tradeDate").any() mask = mask_years & mask_checkday return mask history = pd.read_hdf("uqer/uq_history.h5","history") #hisotry 包含了從2004年到2017年11月16日的指數數據( 大約86萬條數據). history= history.loc(axis=0)[:,:Today] history_filtered= history.groupby(level=0).filter(ticker_filter) ntickers = len(history_filtered.groupby(level=0).groups) print("{0}只指數交易時間超過了3年 且在{1}日有交易記錄".format(ntickers,Today)) return history_filteredhistory =filter_history()
483隻指數交易時間超過了3年 且在2018-02-01日有交易記錄
1.2.2 添加ROE(凈資產回報率)特徵?
history["ROE"] = history["PB1"]/history["PE1"]
1.2.3 特徵提取
- 交易日最新數據匯總。 取指定交易日因子數據
- 凈資產回報率特徵。 取一年的數據平均值,然後按回報率分成4個級別。級別(超低,低,中,高)
- 交易額規模特徵。取一年的數據平均值,然後按日平均交易額分成4個級別(小於5億,小於50億,小於500億,小於5000億)
- Z值(各個指標的標準差倍數)。 針對所有歷史數據,計算Zscore(標準差倍數)。
def Check_summary(): def lastz(x): freedom = 1 # it is sample, so the sample std degree of freedome should not be 0 but 1 Arry=x.values zscore = stats.zmap(Arry[-1],Arry,ddof=freedom) return zscore def recent_mean(x): mean = x.tail(250).sum()/250 return mean grp = history.groupby(level=0) grp_last = grp.agg({"Close":"last","PE1":"last","PB1":"last","ROE":"last","TurnoverValue":"last"}) grp_last["TurnoverValue"] =grp_last["TurnoverValue"] grp_rank = grp.agg({"ROE":recent_mean,"TurnoverValue":recent_mean}) grp_z = grp.agg({"Close":lastz,"PE1":lastz,"PB1":lastz,"ROE":lastz,"TurnoverValue":lastz}) ROE_rank = pd.cut(grp_rank.ROE,bins=4,labels=["超低","低","中","高"]) TV_rank = pd.cut(grp_rank.TurnoverValue,bins=5*np.logspace(7,11,5),labels=["5億","50億","500億","5000億"]) ROE_rank.name = "凈資產回報率等級" TV_rank.name ="日交易額規模" sec_map = pd.read_hdf("uqer/sec_map.h5","map") # sec_map 包含了約2800多個指數,實際指數約550隻{} #decimals = pd.Series([1,1,1,2,1 ], index=["Close","PE1","PB1","ROE","TurnoverValue"]) combined = sec_map[["secShortName"]].join(grp_last,how="right").join(ROE_rank,rsuffix="_R").join(TV_rank,rsuffix="_R") combined = combined.join(grp_z,rsuffix="_Z") return combinedcheckday_summary = Check_summary()checkday_summary.columns
Index([secShortName, Close, PE1, PB1, ROE, TurnoverValue,
凈資產回報率等級, 日交易額規模, Close_Z, PE1_Z, PB1_Z, ROE_Z, TurnoverValue_Z], dtype=object)
1.3 數據探索
1.3.1 不同日交易額的指數群中指數的數量
tmp=sns.countplot(日交易額規模,data=checkday_summary)
checkday_summary.groupby(by="日交易額規模")[["ROE"]].mean().rename(columns={"ROE":"平均凈資產回報率"})
1.3.2 收盤價(Close)
col="Close"fig,ax = plt.subplots(1,2,figsize=(10,5))sns.boxplot(x=日交易額規模,y=col,ax=ax[0],data=checkday_summary)ax[0].set_title("不同規模指數 - {0}({1})箱體圖".format(map_E2C[col],col))sns.boxplot(x=日交易額規模,y=col+"_Z",ax=ax[1],data=checkday_summary)ax[1].set_title("不同規模指數 - {0}({1})-Z值 箱體圖".format(map_E2C[col],col))
指定日收盤價匯總箱形圖 展現不同指數的收盤價差異:
左圖是絕對值:不同規模的指數在該日收盤價價值不同。右圖是相對值:用Z值(即幾個標準差)來衡量不同規模指數群的收盤價和各指數自己歷史相比的差異。(500億規模的指數收盤價差異比較大,Z指在4和-1之間。從右圖可以看出,除了交易規模為50億的小盤指數外,其他指數的日收盤價的Z值均值都在1附近。各個日交易規模的指數群都有些Z值在(-1,1)之外的指數,這中間也許存在機會和風險。Z值<-1, 有低估的可能。 可以考慮定投的方式逐步買入。Z值>1, 有高估的可能。可以考慮逐步買出。註:考慮到通貨膨脹和指數內股票的增長,通常指數收盤價會出現Z值小於-1的情況。收盤價Z值>1甚至大於2都是比較常見的情況。
1.3.3 市盈率(PE1)
col="PE1"fig,ax = plt.subplots(1,2,figsize=(10,5))sns.boxplot(x=日交易額規模,y=col,ax=ax[0],data=checkday_summary)ax[0].set_title("不同規模指數 - {0}({1})箱體圖".format(map_E2C[col],col))sns.boxplot(x=日交易額規模,y=col+"_Z",ax=ax[1],data=checkday_summary)ax[1].set_title("不同規模指數 - {0}({1})-Z值 箱體圖".format(map_E2C[col],col))
指定日市盈率匯總箱形圖 展現不同指數的市盈率差異:
左圖是絕對值:不同規模的指數在該日市盈率估值不同。
註:由於市盈率計算方法不一樣,例如:加權,等權,算術平均等模式。故不同數據源的市盈率,市凈率差異比較大。指數官網的市盈率和市凈率比較權威。不過使用費用比較高。本文使用的是免費數據。因此可以看出這一天5億規模指數群中有一個指數的市盈率小於-150倍。這是明顯錯誤的。需要過濾掉。右圖是相關值:用Z值(即幾個標準差)來衡量不同規模指數的市盈率和各自歷史相比差異。由於Z值計算是用全部歷史數據來計算,故歷史上的錯誤數據(如果數量不大的話,例如小於1%),對整理影響不大。只要將異常點過濾即可。從右圖可以看出,除了交易規模為50億的小盤指數外,其他指數的日收盤價的Z值均值都在0附近。但是也有一些指數群中有(-1,1)之外的Z值。Z值<-1, 有低估的可能。 可以考慮定投的方式逐步買入。Z值>1, 有高估的可能。可以考慮逐步買出。接下來,我們來看看都有哪些指數市盈率存在低估?
def show_min_PE_Z(): col="PE1" def get_max(x): colz= col+"_Z" index =x[colz].idxmax() return x.loc[index][["secShortName",col,colz]] def get_min(x): colz= col+"_Z" index =x[colz].idxmin() return x.loc[index][["secShortName",col,colz]] print(checkday_summary.groupby("日交易額規模").apply(get_max).round(1)) print(checkday_summary.groupby("日交易額規模").apply(get_min).round(1)) show_min_PE_Z()
如上表中,所展示,
低估指數: Z值小於-1。 例如:中證1000(000852),新能源車(399417),文化指數分別是日交易規模(大盤,中盤,小盤)中Z值最低的指數。高估指數:Z值大於2。 例如: 中經GDP,央視50(399550),水電指數分別是日交易規模(大盤,中盤,小盤)中Z值最高的指數。 如果這些指數的歷史分布是正態, 那麼根據經驗法則,就存在較大的機會(針對低估)和風險(針對高估) 接下來,看看500億日交易額規模指數群中新能源車和央視50這兩個比較常見的指數歷史數據的市盈率的波動。
tickers=["399417","399550"]sec_map = pd.read_hdf("uqer/sec_map.h5","map")for ticker in tickers: print("{0} base day is {1}".format(ticker,sec_map.loc[ticker].baseDate)) fig,ax = plt.subplots(1,2,figsize=(6,3)) fig.suptitle(ticker) PE1 = history.loc[ticker]["PE1"] PE1_Z = history.loc[ticker][["PE1"]].apply(stats.zscore) PE1.plot(ax=ax[0]) sns.distplot(PE1_Z,ax=ax[1],vertical=True)
從上圖可以看出,2018年2月1日的市盈率圖
新能源市盈率為22倍,絕對值不算高。但是Z指接近-1.5,相對值比較低,未來有很大的機會。央視50市盈率為13倍,絕對值比較低。但是Z值接近4,相對值極度高,未來存在回歸歷史均值的風險
1.3.4 市凈率 (PB1)
col="PB1"fig,ax = plt.subplots(1,2,figsize=(10,5))sns.boxplot(x=日交易額規模,y=col,ax=ax[0],data=checkday_summary)ax[0].set_title("不同規模指數 - {0}({1})箱體圖".format(map_E2C[col],col))sns.boxplot(x=日交易額規模,y=col+"_Z",ax=ax[1],data=checkday_summary)ax[1].set_title("不同規模指數 - {0}({1})-Z值 箱體圖".format(map_E2C[col],col))
與市盈率數據類似
指定日市凈率匯總箱形圖 展現不同指數的市凈率差異:左圖是絕對值:不同規模的指數在該日市凈率估值不同。右圖是相關值:用Z值(即幾個標準差)來衡量不同規模指數的市凈率和各自歷史相比差異。從右圖可以看出,除了交易規模為50億的小盤指數外,其他指數的日收盤價的Z值均值都在0附近。但是也有一些指數群中有(-1,1)之外的Z值。Z值<-1, 有低估的可能。 可以考慮定投的方式逐步買入。Z值>1, 有高估的可能。可以考慮逐步買出。接下來,我們來看看都有哪些指數市凈率存在低估?
def show_min_PB_Z(): col="PB1" def get_max(x): colz= col+"_Z" index =x[colz].idxmax() return x.loc[index][["secShortName",col,colz]] def get_min(x): colz= col+"_Z" index =x[colz].idxmin() return x.loc[index][["secShortName",col,colz]] print(checkday_summary.groupby("日交易額規模").apply(get_max).round(1)) print(checkday_summary.groupby("日交易額規模").apply(get_min).round(1)) show_min_PB_Z()
從上圖可以看出,2018年2月1日的市盈率圖
新能源車市盈率為2.7倍,絕對值不算高。而且Z指接近-1.5,相對值比較低,未來有很大的機會。國證食品市盈率為6.7倍,絕對值非常高。而且Z值接近3.2,相對值極度高,未來存在回歸歷史均值(3年歷史)的風險。註:由於國證食品指數在2004年就成立,缺少之前近十年歷史數據。無法完全確定是否高估
1.3.5 凈資產回報率(ROE)
col="ROE"fig,ax = plt.subplots(1,2,figsize=(10,5))sns.boxplot(x=日交易額規模,y=col,ax=ax[0],data=checkday_summary)ax[0].set_title("不同規模指數 - {0}({1})箱體圖".format(map_E2C[col],col))sns.boxplot(x=日交易額規模,y=col+"_Z",ax=ax[1],data=checkday_summary)ax[1].set_title("不同規模指數 - {0}({1})-Z值 箱體圖".format(map_E2C[col],col))
與市盈率數據類似
指定日凈資產回報率匯總箱形圖 展現不同指數的凈資產回報率差異:左圖是絕對值:不同規模的指數在該日凈資產回報率估值不同。右圖是相關值:用Z值(即幾個標準差)來衡量不同規模指數的凈資產回報率和各自歷史相比差異。和市盈率與市凈率不同,凈資產回報率(ROE=PB/PE= profit/equity)排除了收盤價的短期波動影響,是比較長期的指標。我個人認為,長期指標穩健比較好。即ROE>0.1 而且Z指在(-1,1)之間的指數。
1.3.6 綜合分析 - 流動性 + 風險 + 收益,
前面已經單獨對4個因子作了分析。他們分別代表了
- 流動性(日交易額規模),
- 風險(市盈率和市凈率)
- 收益(凈資產回報)
現在,讓我們試著把這四個因子綜合起來看看。
mask_scale= checkday_summary["日交易額規模"].isin(["50億","500億","5000億"])print("滿足流動性規模的指數有{0}只".format(mask_scale.sum()))risk_zscore= -1.4 #注 z值小於 -1 的 指數太少,故改設為-0.3mask_risk= (checkday_summary["PE1_Z"]<0) & (checkday_summary["PB1_Z"]<0) &((checkday_summary["PE1_Z"] + checkday_summary["PB1_Z"]<risk_zscore))print("滿足低風險要求的指數有{0}只".format(mask_risk.sum()))roe_score =["中","高"]roe_zscore =[-2,2]mask_roe = checkday_summary["凈資產回報率等級"].isin(roe_score) & checkday_summary["ROE_Z"].between(roe_zscore[0],roe_zscore[-1])print("滿足收益率要求的指數有{0}只".format(mask_roe.sum()))mask_all = mask_scale & mask_risk & mask_roeresult =checkday_summary[mask_all].drop_duplicates(subset=["secShortName"])print("滿足高流動性,低風險,較好收益率要求的指數有{0}只".format(result.shape[0]))
滿足流動性規模的指數有478隻
滿足低風險要求的指數有59隻滿足收益率要求的指數有310隻滿足高流動性,低風險,較好收益率要求的指數有24隻投資策略
def strategy_tickers_today(strategy="customize",scale_score =None,risk_zscore =None,roe_score =None): if strategy =="customize": scale_score =["50億","500億","5000億"] scale_zscore=(-1,1) risk_zscore= -1.4 #注 z值小於 -1 的 指數太少,故改設為-0.3 roe_score =["中","高"] roe_zscore =[-2,2] elif strategy =="ROE": scale_score =None risk_zscore= None roe_score =["高"] elif strategy =="RISK": risk_zscore= -2 #PE & PB Z值小於-2, 如果是 正態分布,這風險小於95% elif strategy =="TURNOVER": scale_score =["5000億"] scale_zscore=(-1,1) #交易規模過濾 if scale_score ==None: mask_scale =True else: mask_scale= (checkday_summary["日交易額規模"].isin(scale_score)) & ( checkday_summary[TurnoverValue_Z].between(scale_zscore[0],scale_zscore[-1])) #風險指標過濾 if risk_zscore ==None: mask_risk =True else: risk_zscore= -1.4 mask_risk= (checkday_summary["PE1_Z"]<0) & (checkday_summary["PB1_Z"]<0) &((checkday_summary["PE1_Z"] + checkday_summary["PB1_Z"]<risk_zscore)) #投資回報率過濾 if roe_score ==None: mask_roe=True else: mask_roe = checkday_summary["凈資產回報率等級"].isin(roe_score) mask_all = mask_scale & mask_risk & mask_roe result =checkday_summary[mask_all].drop_duplicates(subset=["secShortName"]) return resultdef show_tickers_color(tickers= None): if (tickers is None) or (tickers.shape[0]==0): print("Pls prepare the checkday_summary dataframe") return else: html =tickers[[secShortName,Close, PE1, PB1, ROE,Close_Z, PE1_Z, PB1_Z, ROE_Z,凈資產回報率等級, 日交易額規模]] .round(2).rename(columns=map_E2C).style.bar(subset=[Close_Z, PE1_Z, PB1_Z], align="zero", color=[ #5fba7d,#d65f5f,],width_=100/2) return html
低風險策略
tmp = strategy_tickers_today("RISK")tmp["RISK"] = tmp["PE1_Z"] + tmp["PB1_Z"]+tmp["Close_Z"]*0.2show_tickers_color(tmp.sort_values(by=["ROE"],ascending=False).head(5))
根據不同的Z值組合和因子組合,高收益策略或者高容量策略也很容易合成。
註: 這是一篇練手文章,嘗試將Python和指數投資以及策略制定結合在一起。 裡面難免有各種錯誤。
=====================================================
衡量市場,指數高低是一個難題! 價值投資者很難判斷,
現在是高估,還是低估?
買的是便宜還是,貴了?
應該現在買/賣,還是再等等?
針對這個問題,我在網上看到了一些量化的處理方法。例如:平均數法,中位數法,比例法等等。這種方法往往過於簡單,只能衡量集中度。不能衡量離散度和概率。
也許統計方法中的標準差Z值法更加適合。既可以衡量某個指數的指標的集中度,還可以衡量離散度,和風險情況。儘管指數的數據也不是完美的正態分布,但Z值法依然存在較大參考意義。
我的觀點:
Z值越大,越高估。因為大數定理認為:
Z>1, Z>2,意味著繼續變大的可能性小於16%, 5%。Z值越小,越低估。
因為大數定理認為:Z<-1, Z<-2,意味著繼續變小的可能性小於16%, 5%
綜觀550多隻指數的歷史數據。絕大部分指數的Z值都在-2,3之間。註:少數的能源,金屬類指數曾經出現過短暫瘋狂的。Z值法就不太適用。
我使用Python的Pandas 和 Matplotlib 等工具,加上一些渠道獲得的指數數據(尤其是市盈率),發布熱門指數Z值表。 今天又結合了不可能三角形思路做了一些投資策略的基本探索。
主要目的是:
-方便自己定投使用。知道何時開始定投,何時停止定投,何時止盈。(目前還沒有止盈過)
-結合統計學,熟悉Python的基本數據分析方法。
-網上分享給願意參考的人,交流和學習
有不當之處,歡迎指正
WangYong(雪球ID:快樂_爸 )
2018年2月2日下午
主動分享吧,這將是生活工作中最好的投資
推薦閱讀:
※Python 遠程訪問系列之分散式RPC(上)
※Python裝飾器
※機器學習之Python基礎(五) --協程,分散式
※requests模塊的response.text與response.content有什麼區別?
※python把一個unicode字元串寫入文件為什麼會報錯?