长期持有不等于“躺平”。
长期持有并不意味着买入之后就不再调整。
卖出的逻辑是当初买入的逻辑不成立了。
传统的收益率止盈之类的不合适,止盈之后买什么呢?拿着现金?除非有更好的选择,或者当前基金的基本面变坏了,比如基金经理变更。
高估止盈是否需要?是需要的。否则就会坐过山车,但怎么止很关键。
传统上的做法是估值分位点超过85%止盈20%,超过90%再止盈20%这样的操作,这种操作会上牛市前期,早早就下车了。
我们选择恒定市值,就是保持恒定的仓位在市场中,比如一支基金仓位恒定5万,当市场上涨10%之后,把这个上涨的部分卖出落袋为安,而当市场下跌10%后,则在低位补仓至市值5万。如此持续做网格,不惧波动。
今天我们使用标普500指数近十年的数据来回测看看效果。
from engine.strategy import Strategy from engine.datafeed import CSVDatafeed import logging logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) # 恒定市值维护 class FixMarketValueSpx(Strategy): def __init__(self, feed): super(FixMarketValueSpx, self).__init__(feed) self.fix_mv = 100000.0 def onbar(self, index, date, df_bar): print(date) instrument = 'SPX' if index == 0: self.acc.order_buy_mv(instrument, 80000) # 取当前市值,若超过设定值,比如5万的10%,即55000,则卖掉5000,反之买入差额的部分 # 取当前instrument的持仓市值, curr_mv = self.acc.get_instrument_mv(instrument) print(date, '当前持仓:{}'.format(round(curr_mv, 2)), '现金:{}'.format(round(self.acc.curr_cash, 2))) if curr_mv >= 1.1 * self.fix_mv: gap = curr_mv - self.fix_mv # +5000 self.acc.order_sell_mv(instrument, gap) elif curr_mv <= 0.9 * self.fix_mv: gap = self.fix_mv - curr_mv self.acc.order_buy_mv(instrument, gap) feed = CSVDatafeed() # 标普500指数的恒定市值回测 feed.add_data('SPX', '../datas/SPX.csv') s = FixMarketValueSpx(feed=feed) s.run() s.plot(benchmark=['SPX'], filename='SPX恒定市值.html')
结果如下图:
最大回测和波动率肯定是显著下降。
不过大家也许注意到了,年化收益也下降了,是的,像标普这种年化11.4%的指数,七年就能够翻一番,我们做网格,会有越来越多的现金往出提。不过注意,未体现在策略里的是,这些取出来的现金部分,还是会再投资的。这一部分没有算。
另外代码里把bokeh更换为了pyecharts,这个新版本还不错,使用起来很简单,功能很强大,推荐大家使用。
(公众号:七年实现财富自由(ailabx),用数字说基金,用基金做投资组合,践行财富自由之路)