股票持仓组合优化:从发现现象到风控模型的优化检验

配资网 阅读: 2024-09-24
后台-插件-广告管理-内容页头部广告(手机)

现在的市道,调好投资是挺重要的。我最近好好琢磨了股票调整这事儿。研究的过程中,还真发现了挺有意思的点,尤其在风险评估和收益优化上,能让我们更精准。不过,我用的数据是模拟的,和历史数据有出入,所以得谨慎,不能光信技术分析。要真的做投资决策,还得找专业人士咨询。

风险与收益的定义

改写句子如下:

pacman::p_load(fImport, PerformanceAnalytics, stringb, tidyverse)
# 将股票数据加载到一个时间序列对象的函数
importSeries = function(symbol,from,to) {
# 从雅虎读取金融数据
  input = yahooSeries(symbol,from = from, to = to)
# 列名调整
  adjClose = symbol %.% ".Adj.Close"
  inputReturn = symbol %.% ".Return"
  CReturn = symbol %.% ".CReturn"
# 计算收益率并生成时间序列
  input.Return = returns(input[,adjClose])
  colnames(input.Return)[1] = inputReturn
         input = merge(input,input.Return)
# 计算累积收益率并生成时间序列
  input.first = input[,adjClose][1]
  input.CReturn = fapply(input[,adjClose],
                       FUN = function(x) log(x) - log(input.first))
         colnames(input.CReturn)[1] = CReturn
         input = merge(input,input.CReturn)
# 删掉一些无用数据来释放内存
         rm(input.first,
            input.Return,
            input.CReturn,
            adjClose,
            inputReturn,
            CReturn)
# 返回时间序列
  return(input)
}

调投资的时候,先弄明白风险和收益是啥。通常,风险看的是投资涨跌波动,虽然有其他方法,但用方差来衡量风险是多年以来的老套路了。说到收益,就是资产可能赚的钱,比如说一年后的收益。这儿咱们说的收益是预测的年收益,风险,就是标准差的平方。

# 获取短期、中期和长期政府债券的收益率序列
from = "2001-01-01"
to = "2011-12-16"
tlt = importSeries("tlt",from,to)
shy = importSeries("shy",from,to)
ief = importSeries("ief",from,to)
merged = merge(tlt,shy) %>% merge(ief)
vars = c("tlt.Return",
         "shy.Return",
         "ief.Return")
# 计算年化收益率 (t = table.AnnualizedReturns(merged[,vars], Rf = mean(merged[,"shy.Return"], na.rm=TRUE)))
##                  tlt.Return shy.Return ief.Return
## Annualized Return             0.0810     0.0303     0.0684
## Annualized Std Dev            0.1403     0.0173     0.0740
## Annualized Sharpe (Rf=3%)     0.3496    -0.0086     0.4974

看长期和短期债搭配,收益风险算起来挺简单。看看这些资料,就能知道哪些债券收益低风险大,挑投资方便多了。特别看那三种ETF债券的分红,发现中期的债券比长期的稳,这挑投资的时候很有参考价值。

获取ETF收益序列的方法

咱们提取ETF收益的时候,使了点小技巧,用函数帮忙模拟一下。这方案挺大胆的,能让我们清清楚楚地看出风险和收益。咱们换着法儿调整参数,就能找到最匹配的策略。往函数里输入个预期收益,它就自动算出最好的配比,这个环节还是挺有趣的。

得注意了,一般的,收益数据放在X轴,风险数据,也就是拟合方差,放Y轴。这么排,图就明显多了,一眼就能看出不同投资组合的边界,让咱们更明白收益和风险的关系。搞懂了这些,选投资方向就更有信心了。

# 检查相关性
corr = cor(merged[,vars],use = "complete.obs")
c = corr["tlt.Return","shy.Return"]
# 假设一个杠铃策略是持有长期和短期资产
# 定义风险、收益
ws = NULL
wt = NULL
mu = NULL
sigma = NULL
# 50个观察 n=50
# 遍历杠铃策略的权重
rTLT = t["Annualized Return","tlt.Return"]
rSHY = t["Annualized Return","shy.Return"]
sTLT = t["Annualized Std Dev","tlt.Return"]
sSHY = t["Annualized Std Dev","shy.Return"]
for (i in 0:n){wsi = i/n;
               wti = 1-wsi;
               mui = wsi * rSHY + wti * rTLT
               sigmai = wsi*wsi*sSHY*sSHY + wti*wti*sTLT*sTLT + wsi*wti*sSHY*sTLT*c
               ws = c(ws,wsi)
               wt = c(wt,wti)
               mu = c(mu,mui)
               sigma = c(sigma,sigmai) }
#风险收益的数据集
rrProfile = data.frame(ws=ws,wt=wt,mu=mu,sigma=sigma)

有效边界与杠铃策略

前文讲了怎么弄投资组合的有效边界,现在我得挑一个顶呱呱的组合。有效边界图那蓝线,好像比普通的杠铃策略能赚更多。细细研究后发现,加入中期债(IEF)之后,整个组合的收益和风险平衡都上去了。所以说,搞投资组合不是随便加加减减,要不断调整和优化。

# 为模型拟合一个二次函数
fit = lm(rrProfile$sigma ~ rrProfile$mu + I(rrProfile$mu^2))

这家伙,咱们这杠铃策略的收益快到顶了。拿三种产品合着来,风险评估起来可比只看一个样少多了。这太妙了!看来我们选对组合既能减少风险,又能提高收益。这有效边界分析让我更懂怎么搭投资组合了,越挖越感兴趣。

# 得到回归系数
coe = fit$coefficients
# 得到每个回归预测的风险值
muf = NULL
sfit = NULL
for (i in seq(0,.08,by=.001)){
               muf = c(muf,i)
               s = coe[1] + coe[2]*i + coe[3]*i^2
               sfit = c(sfit,s)
}
# 绘图
plot(rrProfile$sigma,
     rrProfile$mu,
     xlim=c(0,.022),
     ylim=c(0,.08),
     ylab="Expected Yearly Return",
     xlab="Expected Yearly Variance",
     main="Efficient Frontier for Government Bond Portfolios")
# 画出预测边值
lines(sfit,muf,col="red")

无风险资产的配置思考

合优投资_优合集团股票_优合集团ceo

合优投资_优合集团股票_优合集团ceo

如果在投资时定了保本收益(比如无风险利率),那这些资产就仿佛在图表的Y轴上。咱们可以找几个投资标的,加上那无风险的部分,目标是想超风险回报率那红线。这法儿让我想起,咱得根据行情来变着法调整策略,这样才能跟上风险的变化。

同时追三个目标,麻烦事儿可就多了,找到最好的办法挺费神的。这时候,可能得放掉几个,把精力集中到更有前景的选择上。比如,投入SHY可能不是上策,转而投资TLT或许更划算。这让我想到,投资,光靠数据和公式还不够,还得跟着市场风向走。

总结与反思

# 添加第三个标的
#除非想做一个格点搜索,否则就需要对每个级别的收益减少风险来优化投资组合。
# portfolio.optim 在时间序列中不能有 NA 值。
m2 = removeNA(merged[,vars])
wSHY = NULL
wIEF = NULL
wTLT = NULL
er = NULL
eStd = NULL
# 在收益水平之间不断循环搜索找到最优的投资组合,包括最小值(rSHY)和最大值(rTLT)
# portfolio.optim 使用日收益数据,因此不得不做出相应的调整
for (i in seq((rSHY+.001),(rTLT-.001),length.out=100)){
      pm = 1+i
      pm = log(pm)/255
      opt = tseries::portfolio.optim(m2,pm=pm)
      er = c(er,exp(pm*255)-1)
      eStd = c(eStd,opt$ps*sqrt(255))
      wTLT = c(wTLT,opt$pw[1])
      wSHY = c(wSHY,opt$pw[2])
      wIEF = c(wIEF,opt$pw[3])
}
# 绘图
plot(rrProfile$sigma,
     rrProfile$mu,
     xlim=c(0,.022),
     ylim=c(0,.08),
     ylab="Expected Yearly Return",
     xlab="Expected Yearly Variance",
     main="Efficient Frontier for Government Bond Portfolios")
# 画出预测边值
lines(sfit,muf,col="red")
# 画出三个标的的有效边界。
lines(eStd^2,er,col="blue")
legend(.014,0.015,c("Barbell Strategy","All Assets"),
                  col=c("red","blue"),
                  lty=c(1,1))
solution = data.frame(wTLT,wSHY,wIEF,er,eStd)

这阵子研究让我对怎么调整投资组合有了更深的了解。咱们可以靠技术来调整投资搭配,但决策还是要看市场的实际情况。投资就像画画,要在风险和回报之间找到平衡点。希望我这几句话对你们有点帮助,咱们也来聊聊这个话题。

2

大家在调整投资的时候,有没有遇到什么有趣的经历?

本文 融资融券杠杆炒股 原创,转载保留链接!网址:http://www.hdqcdq.cn/zmt/319.html

声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索