50-50策略
(1)把你准备用于投资的钱,50%定投给风险资产:指数基金(比如300ETF等),50%定投给低风险的固定收益产品(货币基金或者债券)。
(2)每隔固定的一段时间,对投资的资产进行一次再平衡(比如一年时间)。使得风险资产(指数基金)和低风险资产的比例始终保持在 50% 对 50%
下面回测一下看看效果
回测
我们从tushare上获取数据,回测个十年吧,标的选用沪深300
start_date = '20090101'
end_date = '20210808'
asset_name = '399300.SZ'
benchmark_df = pro.index_daily(ts_code=asset_name, start_date=start_date, end_date=end_date)
benchmark_df = benchmark_df.sort_values(by='trade_date').reset_index(drop=True)
benchmark_date_se = pd.to_datetime(benchmark_df['trade_date'].astype(str))
benchmark_date_se.name = 'datetime'
benchmark_df.index = benchmark_date_se
#修改一下columns
benchmark_df.columns = ['StockName', 'Date', 'Close', 'Open', 'High', 'Low', 'pre_close',
'change', 'pct_chg', 'vol', 'amount']
benchmark_df['Adj_Factor'] = 1
我们取换仓周期为20天
interval_num = 20
op_df = pd.DataFrame(index=benchmark_df.index)
trading_date_lst = list(benchmark_df['Date'].astype(str))
op_df['Date'] = benchmark_df['Date'].astype(str)
operation_df = op_df.iloc[range(0,len(op_df),interval_num)]
operation_lst = list(operation_df['Date'])
假设买入和卖出滑点分别为0.2%和0.1%现在回测看看
trader = bac.Trader(initial_money=1000000, buy_slippage=2/1000, sell_slippage=1/1000)
stock_pool = bac.StockPool()
stock_pool._drop_day_len = 1
for today_date in trading_date_lst:
print(today_date)
# 是否要调仓
if today_date in operation_lst:
open_price = benchmark_df.loc[today_date]['Open']
#先来看开盘的时候的持仓
asset_dic = copy.copy(trader._asset_dic)
money = money = trader._money
if len(asset_dic) != 0:
postition_num = asset_dic[asset_name]
else:
postition_num = 0
position_value = postition_num*open_price
#现在来进行50-50操作,差距在5% 就不操作了
if position_value > 1.05*money:
dif_money = position_value - money
sell_amount = round(0.5*(dif_money/open_price))
trader.SellAction(asset_name=asset_name, price=open_price, amount=sell_amount, date=today_date)
print(today_date,'卖出止盈',asset_name,'价格',open_price)
elif position_value < 0.95*money:
dif_money = money - position_value
buy_amount = round(0.5*(dif_money/open_price))
trader.BuyAction(asset_name=asset_name, price=open_price, amount=buy_amount, date=today_date)
print(today_date,'买入补仓',asset_name,'价格',open_price)
# 更新总资产
today_daybar = benchmark_df.loc[today_date:today_date]
trader.UpdateTodayAsset(today_date=today_date,today_df=today_daybar)
结果如下图:
可以看到严重跑输指数,那么我们换一个调仓周期来看,将调仓周期拉长至60个交易日(一个季度)
好像基本没有变化。
将滑点设置为0看看?
因为换仓周期太长了,所以滑点无关紧要,也是跑输指数。
把指数换成中证500呢?
也是大幅跑输指数
结论
可以看到50-50策略只能降低持仓的波动,由于本身一直有一般的仓位持有低收益率的债券和现金,而长期来看,指数的收益一定是要跑赢这些固收类产品的,因此50-50的策略在没有办法提高夏普的情况下,降低波动的结果,就只能是降低收益,最终跑不赢指数。