Tawny包(v2.1.6)示例代码报错求助及替代方案咨询
问题解答
2)修复示例代码并正常运行
你遇到的错误核心是PortfolioReturns函数在这个版本的tawny里,只接受单期的数值型权重向量,而optimizePortfolio返回的ws是多期权重组成的xts对象(每一行对应一个调仓期的权重),直接传入就会触发类型不匹配的报错。
可以跳过PortfolioReturns,手动计算组合收益——毕竟组合收益本质就是每期权重与对应资产收益的加权求和。修改后的完整代码如下:
require(tawny) require(tawny.types) require(PerformanceAnalytics) require(zoo) # Select a portfolio using 200 total observations data(sp500.subset) h <- sp500.subset p <- TawnyPortfolio(h, 150) b <- BenchmarkPortfolio('^GSPC', 150, nrow(h), end=end(h)) # Optimize using a window of length 200 (there will be 51 total iterations) ws <- optimizePortfolio(p, RandomMatrixDenoiser()) # 手动计算组合收益:逐期权重 × 对应资产收益,再求和 asset_returns <- p@returns # 提取资产的收益矩阵 # 确保权重和收益的时间索引匹配(ws的索引是调仓后的收益期,需要对齐) aligned_ws <- ws[index(asset_returns)] rs <- xts(rowSums(aligned_ws * asset_returns), index(asset_returns)) o <- zoo(cbind(portfolio=rs, benchmark=b$returns), index(rs)) charts.PerformanceSummary(o)
简单解释下关键修改:
p@returns是TawnyPortfolio对象内置的资产收益数据,是xts格式的矩阵;aligned_ws用来对齐权重和收益的时间索引,避免因时间不匹配导致的计算错误;rowSums(aligned_ws * asset_returns)逐期计算权重与收益的乘积和,得到组合的每期收益,再转成xts对象保持时间序列结构。
这样就能正常生成业绩表现图表了。
1)tawny包(alpha版)是否值得使用?替代方案有哪些?
首先,非常不推荐在生产环境或严肃研究中使用alpha版本的tawny包:
- alpha版本意味着软件还处于早期开发阶段,API随时可能变更,文档和测试都不完善,像你遇到的这种参数不匹配的问题属于常见情况;
- 社区支持极少,遇到问题很难找到解决方案,维护更新也没有稳定保障。
如果要做投资组合优化,有很多成熟稳定的替代方案:
- PortfolioAnalytics:R生态中最主流的投资组合优化包,支持均值-方差、风险平价、最大分散化等多种优化目标,内置丰富的约束条件(比如权重上下限、行业约束等),文档完善,社区活跃,适合大多数场景。
- fPortfolio:经典的均值-方差优化包,集成了多种风险模型和优化算法,支持蒙特卡洛模拟和有效前沿绘制,适合传统现代投资组合理论(MPT)的研究。
- riskParityPortfolio:专门针对风险平价策略的优化包,能高效计算风险平价权重,支持多种风险度量(方差、CVaR等),如果你的需求是构建风险分散型组合,这个包很实用。
- CVXR:基于凸优化的通用包,允许你自定义目标函数和约束条件,灵活性极高,适合需要定制化优化逻辑的复杂场景(比如多目标优化、非标准风险约束等)。
内容的提问来源于stack exchange,提问作者sdittmar
相关产品推荐
相关产品推荐

