本文先容的政策在黄金、纳指、创业板和沪深300之间进行轮动,在最近10年的回测周期中总收益率为1243%,年化复合收益率为19.89%,夏普比率1.24,Sortino比率1.85,最大回季度胜率大于60%,年度胜率大于90%。
图片
钞票选拔
轮动钞票选拔黄金(ETF基金:518880),纳指(ETF基金:513100),创业板(ETF基金:159915)和沪深300(ETF基金:510300)。
黄金(ETF基金:518880):黄金是一种避险钞票,时时在经济不踏实或通货推广高企时推崇较好。它的价钱与股票和其他金融钞票的推崇时时存在负辩论相干,因此不错用来对冲股票阛阓风险。黄金还被以为是一种通胀对冲钞票,因为它的价钱时时会在通货推广上升时高潮。纳指(ETF基金:513100):纳斯达克指数代表了好意思国科技股阛阓的推崇。科技股时时具有高增长性和高估值,是投资组合中增长部分的攻击组成部分。与其他股票阛阓(如沪深300)比较,纳斯达克指数的波动性时时更高。因此,它不错通过与其他股票阛阓的组合来完了钞票组合的各类化。创业板(ETF基金:159915):创业板指数代表了中国改进型企业的推崇。创业板股票时时具有高估值和高风险,但也具有高增长后劲。与沪深300等传统股票阛阓比较,创业板时时更具有成长性和波动性。因此,它不错用来增多投资组合的成长性和风险。沪深300(ETF基金:510300):沪深300指数代表了中国A股阛阓的推崇。它是中国境内最具代表性的股票指数之一,包括了中国境内市值较大的300家公司。沪深300时时被以为是中国股票阛阓的攻击代表,与创业板等股票阛阓比较,波动性相对较低。因此,它不错用来完了投资组合的郑重性和各类化。黄金、纳指、创业板和沪深300代表了不同类型、作风和阛阓的钞票,它们之间具有一定的互补性。通过将这些钞票组合在一说念,不错完了投资组合的各类化和风险散布。在选拔钞票时,需要筹商到钞票的特质和风险收益特征,以及投资者的风险偏好和标的。
政策形容
该政策的基本念念想是长久执有往日一段时间涨幅大(动量强)的钞票,在4种钞票间进行轮动。构建纪律如下:
逐日计较每个ETF往日21个往复日(含计较当日)的涨跌幅看成动量。比较动量,选拔动量更大的ETF看成投资标的,以当日收盘价买入对应的ETF基金。执有所购买的ETF基金,直到下一个调仓日。每个调仓日重迭以上纪律,凭证涨幅更大的指数进行轮动投资。代码完了# pip install akshare quantstatsimport warningswarnings.filterwarnings('ignore')import timeimport akshare as akimport numpy as npimport pandas as pdimport quantstats as qsimport matplotlib.pyplot as pltimport matplotlib.ticker as tickerdef calculate_etf_performance(etf_symbols, window, html_file=None): # 赢得 ETF 历史数据 etf_data = {} for symbol in etf_symbols: etf_df = ak.fund_etf_hist_em(symbol=symbol, period='daily', adjust='hfq')[['日历','收盘']] \ .rename(columns={'日历':'date','收盘':f'{symbol}'}).set_index('date') etf_data[symbol] = etf_df # 团结数据 data = pd.concat(list(etf_data.values()), axis=1).dropna().iloc[:] data.index = pd.to_datetime(data.index) # 计较逐日涨跌幅和转动收益率 for symbol in etf_symbols: column_name = f'{symbol}' data[f'{column_name}_day_return'] = data[column_name].rolling(2).apply(lambda x:(x[-1]-x[0])/x[0]) data[f'{column_name}_return'] = data[column_name].rolling(window=window).apply(lambda x: x[-1]/x[0]) data[f'{column_name}_ma'] = data[column_name].rolling(window=window).mean() # 去掉缺失值 data = data.dropna() data['signal'] = data[[f'{symbol}_return' for symbol in etf_symbols]].idxmax(axis=1).str.split('_').str[0] data['signal'] = data['signal'].shift(1) data = data.dropna() data['signal_return'] = (np.cumprod(data.apply(lambda row: row[f'{row['signal']}_day_return'], axis=1) + 1) * 100) for symbol in etf_symbols: column_name = f'{symbol}_return' data[column_name] = (100/data[f'{symbol}'].values[0]) * data[f'{symbol}'] # 绘图弧线图 fig, ax = plt.subplots(figsize=(15, 6)) ax.set_xlabel('Time') ax.set_ylabel('Return') for symbol in etf_symbols: column_name = f'{symbol}_return' ax.plot(data[column_name].index, data[column_name].values) ax.plot(data['signal_return'].index, data['signal_return'].values) ax.legend(etf_symbols + ['signal_return']) ax.xaxis.set_major_locator(ticker.MultipleLocator(500)) # 计较政策推崇主义 result = {} for symbol in etf_symbols + ['signal',]: column_name = f'{symbol}_return' result[column_name] = [] for stat in ['avg_return', 'volatility', 'sharpe', 'max_drawdown', 'win_rate']: r = getattr(qs.stats, stat)(data[column_name]) result[column_name].append(r) result = pd.DataFrame(result, index=['avg_return', 'volatility', 'sharpe', 'max_drawdown', 'win_rate']) return result# 构建轮动政策进行回测etf_symbols = ['518880', '513100', '159915', '510300']window = 21result = calculate_etf_performance(etf_symbols, window, 'out.html')print(result)回测效力
该政策的推崇相等优秀。在政策推广本领,该政策的总收益率为1243.01%,年化收益率为19.89%,意味着该政策在经久投资中推崇相等优秀。此外,该政策的夏普比率为1.24,Sortino为1.85,最大回撤24.78%,季度胜率大于60%,年度胜率大于90%。轮廓来看,该政策的收益率较高,风险死字,且踏实性较强,是一种值得筹商的投资政策。
图片
图片
需要把稳的是,上述政策的回测经过未计较调仓手续费和滑点对政策收益产生的影响。且往日的推崇并不成保证改日的推崇,阛阓风险和不细目性长久存在。注 | 本文仅为学问共享,不组成任何投资管待淡薄。
END本站仅提供存储奇迹,所有实质均由用户发布,如发现存害或侵权实质,请点击举报。