\
These days, I happened to see an interesting book, FOF Portfolio Funds. The Fund of funds is a Fund of funds. It can be said that there are both theoretical height and practical strategy.
One of the passages is worth pondering. “Viable concentrations consist of a myriad of portfolios of securities from which investors can choose. Investors can use the efficient set theorem to find the best portfolio. The optimal portfolio… Two conditions are met:
1. A portfolio with the highest rate of return at the same risk
2. A portfolio with minimum risk at the same rate of return
There is another important factor in practice, capital capacity
Everyone is looking for high-yield, low-risk, high-volume strategies. Unfortunately, you can’t have all three… There are eight types of strategies. Among them, relative value strategy, event-driven strategy and macro factor strategy are the most representative ones.
Stocks surged last week, and plunged this week. So what are some of the indexes that fit the three strategies now, based on the February 1 closing numbers?
I tried to use Python and the data in hand to do a simple z-value based analysis, self-learning and sharing discussion.
1. Relative value strategy. (Low return, low risk, high volume)
The relative value strategies discussed in the book are mainly fixed income (bank wealth management, money funds, bonds, hedge arbitrage, etc.), at the expense of “yield”, so as to keep risks manageable and scale up.
The methods discussed in the book. Basically, futures, term arbitrage, intertemporal arbitrage, tiered fund discount, premium, ETF arbitrage, convertible bonds, volatility, options and so on. Perhaps this approach is the low-risk investment strategy of snowball.
Relative value strategies require a wide range of knowledge and a large amount of money. Moreover, after 2015,ETF trading system interface of volume traders has been closed, making ETF arbitrage difficult to operate. Future development depends on the re-opening of the interface system.
Since it’s so complicated, I’m going to simplify it.
1. Capacity: Daily trading volume of 50 billion ~500 billion. (Plates should be large and liquid)
2. Risk: Set as the 5 indexes with the minimum sum of Z values of p/E and P/BOOK ratio on that day. (Low risk)
3. Yield: It doesn’t matter, you can sacrifice.
The results are as follows: The five indices found have low roe (less than 10%), high relative risk release (historically very low Z values for p/E and P/P), and large plates (over $50 billion). Among them, certificate 1000 is the most.
But the risk here is minimal, just the Z value of the index itself and its historical comparison. The Z-value is a measure of relative risk. Absolute risk, maybe only the hedge and portfolio strategies that we talk about in FOF funds of funds.
2. Macro factor strategy. (High return, high risk, high volume)
At the expense of risk… Also known as timing… Do right, natural benefits will be engaged; But if you get it wrong, there’s a lot to lose… Generally speaking, it can be divided into two categories: inflection timing and trend timing.
Note: This strategy should be known as “speculation”.
These strategies are technology flows. SVM(support vector machine) is used to mine historical models, Hurst index, mood index, noise index, etc., or all kinds of averages.
Instead of studying technical flows, we can take a look at the macro factors in the market, strategic indices. Simplify the problem to:
1. High return: The ROE(PB/PB) rating is high (15%~21%) (the return rate must be high. Note: The yield here is long-term)
2. High capacity: daily trading volume of 5 billion ~50 billion (plates must be large and have good liquidity)
3. High risk :(risk is indifferent and can be relaxed appropriately)
The results are as follows:
The return on equity of consumer, food and beverage is high at around 20%, but the Z values of relative price, p/E and P/BOOK are all above 3 or 4. When these indices are reverted to the mean, it is estimated to be “like the Milky Way falling for nine days”.
But the entrepreneurial growth index, the reporting rate of assets is 19%, but the Z values of PB and PE are very low. Study well in the future, see if it is a gem index was killed by mistake.
3. Event-driven strategy (low risk, high return, small capital capacity)
Simplify the problem to:
1. Low risk: The Z value of p/P ratio is the lowest
2. High return: 5 indexes with high ROE(PB/PB) (return must be high. Note: The yield here is long-term)
3. Capacity: unlimited
They are entrepreneurial growth, new energy vehicles, and culture categories.
New energy vehicles due to changes in subsidy policies, continuous valuation adjustment, decline.
Cultural index, due to leEco this rat dung, the whole series in the past two years at the bottom.
However, the VC return on equity is very high, but the valuation is very low, and the risk release is full.
The code follows:
1. Python numpy,Pandas, Scipy. Stats, Matplotlib, seaborn, etc. Machine learning prediction of securities investment usually requires the preparation of a large amount of data for backtesting. This article does not cover the prediction and backtest sections.
Note: Prediction and backtesting are also useless. After reading the FOF portfolio fund, I know that the volume trading interface has been closed in 2015. It is estimated that ETF high-frequency arbitrage can not be done. Here if the understanding is wrong, also ask the superior person to give advice.
import pandas as pd import numpy as np from scipy import stats import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline ! Import matplotlib as MPL import matplotlib.font_manager as font_manager path_eng = '/usr/share/fonts/chinese/REFSAN.TTF' path_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 = 'light' mpl.rcParams['font.family'] = prop.get_name() Today = "2018-02-01"Copy the code
An overview of the data
Def view_data(): print(" data loading...") ) sec_map = pd.read_hdf("uqer/sec_map.h5","map") # sec_map contains about 2800 index, actual index about 550 only history = Pd.read_hdf ("uqer/uq_history.h5","history") #hisotry contains index data from 2004 to November 16, 2017 (approximately 860,000 pieces of data). #history = history.sort_index(level=0) ntickers = history.index.levshape[0] nTradeDate =history.index.levshape[1]/250 nRecords = Shape [0]/10**4 print(" \n\t{1:,.0f}, \n\t{0}, \n\t{0} \ n \ t single index trading records for longest} {2:1 f years. "the format (ntickers nRecords, nTradeDate)) print (" \ n note: the data source based on Uqer, made a preliminary check and correction, after storage in History_fixed h5. For example, the p/E ratio of China Securities Media in December 2017 ~ January 2017 was revised to choice data. \n\n") print(" \n\n") print(" \n\n" : {0}". Format (history.columns. Tolist ())) print(" \n\n" : {0}". {0} ". The format (sec_map. Columns. Tolist ())) view_data () map_E2C = {" ticker ":" index code ", "secShortName" : "index name," 'tradeDate: "date", "Close", "- the Close" closing, 'PB1: "price-to-book - PB,"' PE1 ': "p/e ratio - PE,"' TurnoverValue: "turnover", 'TurnoverVol: "volume", "ROE" : "return on net assets - ROE"} print (" \ n this article USES the characteristics as follows: {0} ". The format (list (map_E2C. The values ())))Copy the code
Data loading… The trading history database contains: 910,000 daily trading data. 550 indexes, the longest trading record of a single index is 10.8 years.
Note: The data source is based on Uqer, with preliminary proofreading and correction, and then stored in History_fixed. H5. For example, the p/E ratio of China Securities Media in December 2017 ~ January 2017 was revised to choice data.
Historical trading data: Feature list: [‘secID’, ‘Close’, ‘PB1’, ‘PB2’, ‘PE1’, ‘PE2’, ‘TurnoverValue’, ‘TurnoverVol’] [‘baseDate’, ‘basePoint’, ‘endDate’, ‘indexType’, ‘indexTypeCD’, ‘porgFullName’, ‘pubOrgCD’, ‘publishDate’, ‘secID’, ‘secShortName’]
This article USES the characteristics as follows: [‘ index code ‘, ‘index name’, ‘date’, ‘Close – Close’, ‘price-to-book – PB’, ‘p/e ratio – PE’, ‘turnover’, ‘volume’ and ‘return on net assets – ROE]
Characteristics of the engineering
1.2.1 Filtering valid data
- There are gaps in the data, so only the data with transaction records up to January 25, 2018 are screened.
- Too few historical transaction data, no statistical significance (tentatively at least 3 years)
def filter_history(): def ticker_filter(x): Ntradedays_annual = 250 # assume 250 trading days in a year nyear=3 # assume at least 3 years data checkday=Today # checkday is set to a valid trading date. The default is Today, Global variable 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 History = history.loc(axis=0)[:,:Today] history_filtered= history.groupby(level=0).filter(ticker_filter) ntickers = len(history_filtered.groupby(level=0).groups) Format (ntickers,Today)) return history_filtered History =filter_history() print("{0} only index trading times greater than 3 years and trading records on {1} days."Copy the code
483 indexes traded for more than 3 years and had trading records on February 1, 2018
1.2.2 Add ROE features
history["ROE"] = history["PB1"]/history["PE1"]
Copy the code
1.2.3 Feature extraction
- Summary of the latest data for the trading day. Take the specified trading day factor data
- Roe characteristics. Average the data over a year and divide the returns into four levels. Level (ultra low, Low, medium, high)
- Characteristics of transaction volume. Take the average of the data over a year, and then divide it into 4 levels by daily average transaction volume (less than 500 billion, less than 5 billion, less than 50 billion, less than 500 billion).
- Z value (multiple of standard deviation of each indicator). Zscore(multiple of standard deviation) was calculated for all historical data.
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. The cut (grp_rank. ROE, bins = 4, labels = [" low ", "low", "in", "high"]) TV_rank = Pd. cut(grp_rank.TurnoverValue,bins=5*np. Logspace (7,11,5),labels=[" 500 million ","5 billion ","50 billion ","500 billion "]) roe_rank. name = "return on value level" Sec_map = pd.read_hdf("uqer/sec_map.h5","map") # sec_map contains about 2800 indexes, the actual indexes are about 550 {} #decimals = Pd. Series (,1,1,2,1 [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 combined checkday_summary = Check_summary() checkday_summary.columnsCopy the code
Iturnovervalue ([‘secShortName’, ‘Close’, ‘PE1’, ‘PB1’, ‘ROE’, ‘TurnoverValue’, ‘iturnoverValue ‘, ‘CloseZ’, ‘PE1Z’,’ iTURNOverValue ‘, ‘iTURNOverValue ‘,’ iTURNOverValue ‘, ‘iTURNOverValue ‘,’ iTURNOverValue ‘, ‘ROEZ’, ‘TurnoverValue_Z’], dtype=’object’)
1.3 Data Exploration
1.3.1 The number of indexes in index groups of different daily trading volume
TMP =sns.countplot(' daily transaction size ',data=checkday_summary)Copy the code
Checkday_summary. Groupby (by = "daily turnover scale") [[" ROE "]] scheme (). Rename the columns (= {" ROE ":" the average return on net assets "})Copy the code
1.3.2 Closing Price (Close)
Plot (x=' bplots ',y=col,ax=ax[0],data= checkday_plot) Ax [0]. Set_title (" index of different sizes - {0} ({1}) body figure ". The format (map_E2C (col), col)) SNS. Boxplot (x = 'daily turnover scale, y = col + _Z, ax = ax [1], data = checkday_summary) ax [1]. The set_title (" index of different sizes - {0} ({1}) - Z values Box figure ". The format (map_E2C (col), col))Copy the code
The box chart shows the difference between the closing prices of different indices on the left: absolute values: indices of different sizes have different closing values on that day. The chart on the right shows relative values: the Z-value (i.e., a few standard deviations) measures the difference between the closing prices of indices of different sizes and their own history. (A $50 billion index has a wide range of closing prices, with Z being between 4 and -1. As can be seen from the figure on the right, except for the small-cap index with a trading scale of 5 billion, the average daily closing z-value of other indexes is around 1. Every index group of daily trading size has some index with a Z value outside (-1, 1), which may present opportunities and risks. Z value <-1, there is a possibility of underestimation. Can consider the way to buy gradually. Z value >1, there is a possibility of overestimation. Consider buying out gradually.
Note: Taking into account inflation and the growth of stocks in the index, the index usually closes with a Z value less than -1. Closing z-values greater than 1 or even greater than 2 are common.
1.3.3 P/E ratio (PE1)
Plot (x=' bplots ',y=col,ax=ax[0],data= checkday_plot) Ax [0]. Set_title (" index of different sizes - {0} ({1}) body figure ". The format (map_E2C (col), col)) SNS. Boxplot (x = 'daily turnover scale, y = col + _Z, ax = ax [1], data = checkday_summary) ax [1]. The set_title (" index of different sizes - {0} ({1}) - Z values Box figure ". The format (map_E2C (col), col))Copy the code
The box chart shows the p/E ratios of different indices: the left chart shows absolute values: indices of different sizes have different p/E ratios for that particular day. Note: because the p/E calculation method is not the same, such as: weighted, equal weight, arithmetic average and other models. Therefore, the p/E ratio and p/BOOK ratio of different data sources differ greatly. Index official website price/earnings ratio and price-to-book ratio comparison authority. But the cost is higher. This article uses free data. So you can see that one of the 500 million indices on that day had a p/E of less than -150. This is clearly wrong. It needs to be filtered out.
The chart on the right shows the correlation: using the Z-value (a few standard deviations) to measure the p/E ratios of indices of different sizes and their historical differences. Since the z-value calculation is based on all historical data, the error data in the history (if the number is not large, for example, less than 1%) will have little impact on the sorting. Just filter the outliers. As can be seen from the figure on the right, except for the small-cap index with a trading scale of 5 billion, the average daily closing z-value of other indexes is around 0. But there are some exponential groups that have Z values other than (-1, 1). Z value <-1, there is a possibility of underestimation. Can consider the way to buy gradually. Z value >1, there is a possibility of overestimation. Consider buying out gradually. Next, let’s take a look at which index p/E ratios are undervalued?
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(" daily transaction size ").apply(get_max).round(1)) Print (checkday_summary.groupby(" daily transaction size ").apply(get_min).round(1)) show_min_PE_Z()Copy the code
As shown in the table above, the underestimation index: Z value is less than -1. For example: China Securities 1000(000852), new energy vehicles (399417), culture index are the lowest daily trading scale (market, medium and small) index. Overestimate index: Z value greater than 2. For example: China Economic GDP, CCTV 50 (399550) and Water and electricity index are respectively the indexes with the highest Z value in daily trading scale (large market, medium market and small market). If the historical distribution of these indices is normal, then as a rule of thumb, there is greater opportunity (for undervaluation) and greater risk (for overvaluation). Next, take a look at the p/E volatility of historical data of the 50 billion daily trading volume index group, New Energy Vehicles and CCTV 50, two more common indices.
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)
Copy the code
As can be seen from the figure above, the p/E ratio on February 1, 2018 is 22 times that of new energy, which is not high in absolute value. But Z refers to close to -1.5, the relative value is relatively low, there are great opportunities in the future. CCTV’s price-earnings ratio of 50 is 13 times, which is low in absolute terms. However, Z value is close to 4, the relative value is extremely high, and there is a risk of regression to the historical mean in the future
1.3.4 Price-to-book ratio (PB1)
Plot (x=' bplots ',y=col,ax=ax[0],data= checkday_plot) Ax [0]. Set_title (" index of different sizes - {0} ({1}) body figure ". The format (map_E2C (col), col)) SNS. Boxplot (x = 'daily turnover scale, y = col + _Z, ax = ax [1], data = checkday_summary) ax [1]. The set_title (" index of different sizes - {0} ({1}) - Z values Box figure ". The format (map_E2C (col), col))Copy the code
Similar to the p/E ratio data, the box chart shows the difference in p/P for different indices on a given day: the left chart shows absolute values: indices of different sizes are valued differently on that day. The chart on the right shows the correlation: the z-value (i.e., a few standard deviations) is used to measure the price-to-book ratio and historical differences of the indices of different sizes. As can be seen from the figure on the right, except for the small-cap index with a trading scale of 5 billion, the average daily closing z-value of other indexes is around 0. But there are some exponential groups that have Z values other than (-1, 1). Z value <-1, there is a possibility of underestimation. Can consider the way to buy gradually. Z value >1, there is a possibility of overestimation. Consider buying out gradually. Next, let’s take a look at which indexes are undervalued in terms of price-to-book ratio.
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(" daily transaction size ").apply(get_max).round(1)) Print (checkday_summary.groupby(" daily transaction size ").apply(get_min).round(1)) show_min_PB_Z()Copy the code
As can be seen from the figure above, the p/E ratio on February 1, 2018 is 2.7 times that of new energy vehicles, which is not high in absolute value. And Z refers to close to -1.5, the relative value is relatively low, there are great opportunities in the future. At 6.7 times earnings, the absolute value is very high. Moreover, the Z value is close to 3.2, the relative value is extremely high, and there is a risk of regression to the historical mean (3-year history) in the future. Note: Since the SSCI was established in 2004, there is no historical data in the past ten years. It is impossible to determine with absolute certainty whether it is overestimated
1.3.5 Return on Equity (ROE)
Plot (x=' bplots ',y=col,ax=ax[0],data= checkday_plot) Ax [0]. Set_title (" index of different sizes - {0} ({1}) body figure ". The format (map_E2C (col), col)) SNS. Boxplot (x = 'daily turnover scale, y = col + _Z, ax = ax [1], data = checkday_summary) ax [1]. The set_title (" index of different sizes - {0} ({1}) - Z values Box figure ". The format (map_E2C (col), col))Copy the code
Similar to the p/E ratio data, the box chart shows the difference in roe for different indices on a given day: the left chart shows absolute value: indices of different sizes are estimated differently on roe for that day. The chart on the right shows the correlation: the z-value (i.e., a few standard deviations) is used to measure the difference between the roe of different size indices and their historical comparisons. Different from price-to-earnings ratio and price-to-book ratio, ROE (ROE=PB/PE= profit/equity) is a long-term indicator, excluding short-term fluctuations in closing prices. Personally, I think it is better for long-term indicators to be stable. The ROE is greater than 0.1 and Z is an index between (-1, 1).
1.3.6 Comprehensive analysis – liquidity + risk + return
The four factors have been analyzed separately. They represent respectively
- Liquidity (daily trading volume),
- Risk (P/E and P/book)
- Income (return on equity)
Now, let’s try to combine these four factors.
Mask_scale = checkday_summary[" daily trading size "]. Isin (["5 billion ","50 billion ","500 billion "]) print(" 0} only ". Format (mask_scale.sum())) Risk_zscore = -1.4 Therefore, set mask_risk= (checkday_summary["PE1_Z"]<0) &(checkday_summary["PB1_Z"]<0)\ &((checkday_summary["PE1_Z"] + Checkday_summary ["PB1_Z"]<risk_zscore) print(" format(mask_risk.sum())) roe_score =[" medium "," high "] roe_zscore =[-2,2] mask_roe = checkDAY_summary [" return on equity "]. Isin (roe_score) & Checkday_summary ["ROE_Z"]. Between (roe_zscore[0],roe_zscore[-1]) print(" {0} only ". Format (mask_roe.sum())) mask_all = mask_scale & mask_risk & mask_roe result =checkday_summary[mask_all].drop_duplicates(subset=["secShortName"]) Format (result.shape[0]) print(" result.shape[0])Copy the code
There are 478 indexes that meet the liquidity requirements and 59 indexes that meet the low risk requirements and 310 indexes that meet the high liquidity, low risk, good return requirements and 24 indexes that meet the high liquidity, low risk, good return requirements
Investment strategy
def strategy_tickers_today(strategy="customize",scale_score =None,risk_zscore =None,roe_score =None): if strategy =="customize": Scale_zscore =["5 billion ","50 billion ","500 billion "] scale_zscore=(-1,1) So the change is set to 0.3 roe_score = [" in ", "high"] roe_zscore = [2, 2] elif strategy = = "ROE" : Scale_score =None risk_zscore= None roe_score =[" high "] elif strategy =="RISK": If the distribution is normal, the risk is less than 95%. Scale_score =["500 billion "] scale_zscore=(-1,1) # scale_zscore= =None: mask_scale =True else: Mask_scale = (checkday_summary[" daily transaction size "]. Isin (scale_score)) \ & ( ['TurnoverValue_Z']. Between (scale_zscore[0],scale_zscore[-1])) # 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 [" Roe rating "]. Isin (roe_score) Mask_all = Mask_scale & Mask_risk & Mask_ROE result =checkday_summary[mask_all].drop_duplicates(subset=["secShortName"]) return result def 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' and 'PE1', 'PB1', 'ROE', 'Close_Z', 'PE1_Z', 'PB1_Z', 'ROE_Z', 'level of return on net assets, 'daily turnover scale]] \. Round (2). Rename (columns = map_E2C) style. The bar (subset = [' Close_Z', 'PE1_Z', 'PB1_Z], and \ the align = "zero", color=[ '#5fba7d','#d65f5f',],width=100/2) return htmlCopy the code
Low risk strategy
TMP TMP = strategy_tickers_today (" RISK ") [" RISK "] = TMP/" PE1_Z "+ TMP/" PB1_Z" + TMP * 0.2 [" Close_Z "] show_tickers_color(tmp.sort_values(by=["ROE"],ascending=False).head(5))Copy the code
Depending on different z-value combinations and factor combinations, high-yield or high-volume strategies can also be easily synthesized.
Measuring the market, the index is a difficult problem! It’s hard for value investors to tell,
Is it overvalued or undervalued?
Did you get it cheap or did you get it expensive?
Should I buy/sell now or wait?
I’ve seen some quantitative approaches to this problem on the Internet. For example: mean method, median method, proportion method and so on. This approach is often too simplistic and only measures concentration. You can’t measure dispersion and probability.
Perhaps the standard deviation z-value method of statistical methods is more suitable. It can measure not only the concentration degree of an index, but also the dispersion degree and risk situation. Although the index data are not perfectly normal distribution, the Z-value method still has great reference significance.
My opinion:
The larger the Z value, the more overestimated it is. Because the law of large numbers says:
Z>1, Z>2, that means the probability of getting bigger is less than 16%, 5%. The lower the Z value, the lower the underestimate.
Because the law of large numbers says: Z<-1, Z<-2, that means the probability of getting smaller is less than 16%, 5%
A comprehensive view of more than 550 index historical data. Most indices have Z values between -2, 3. Note: a few of the energy, metal indices have been briefly crazy. The Z-value method doesn’t work very well.
I used tools like Python’s Pandas and Matplotlib to publish the Hot Index Z-table, along with index data from several sources (notably p/E). Today combined with the impossible triangle idea to do some basic exploration of investment strategy.
The main objectives are:
- Convenient for their own use. Know when to call, when to stop, and when to stop. (It has not stopped profit yet)
- Familiar with basic data analysis methods in Python, combined with statistics.
- Share online with those who are willing to refer, communicate and learn
If there is anything improper, you are welcome to correct it
In this paper, the author
Yong Wang, Python Chinese community columnist, snowball ID: happy dad, currently interested in business analysis, Python, machine learning, Kaggle. 17 years project management, 11 years in communications project manager contract delivery, 6 years in manufacturing project management: PMO, change, production transfer, liquidation and asset disposal. MBA, PMI – the PBA, PMP.
\
Join the CodingGo programming community, \
**** Learn programming knowledge, harvest Internet insiders.