python 中的多期投资组合优化
Multi-period portfolio optimization in python
场景:我正在尝试在多周期场景中使用不同的约束条件(权重、风险、风险规避...)进行多项投资组合优化。
我已经做了什么: 从 cvxpy 的示例中,我发现了如何根据非线性二次公式优化投资组合,该公式会生成资产的权重列表投资组合构成。我的问题是,虽然我有 15 年的月度数据,但我不知道如何针对不同时期进行优化(代码,就其当前形式而言,为我的数据的整个时间跨度产生最佳组合)。
问题一:是否可以让代码针对不同时期进行优化。例如 1、3、4、6、9、12 个月(在这种情况下,每个时期产生不同的权重)如果是这样,怎么能这样做呢?
问题2:是否可以限制每个投资组合组合中的资产数量?实现这一目标的最佳方法是什么? (目前代码全部使用,但我想在资产数量有限的情况下进行测试,以控制周转水平)。
代码:
from cvxpy import *
from cvxopt import *
import pandas as pd
import numpy as np
prices = pd.DataFrame()
logret = pd.DataFrame()
normret = pd.DataFrame()
returns = pd.DataFrame()
prices = pd.read_excel(open('//folder//Dgms89//calculation v3.xlsx', 'rb'), sheetname='Prices Final')
logret = pd.read_excel(open('//folder//Dgms89//calculation v3.xlsx', 'rb'), sheetname='Returns log')
normret = pd.read_excel(open('//folder//Dgms89//calculation v3.xlsx', 'rb'), sheetname='Returns normal')
returns = normret
def calculate_portfolio(returns, selected_solver):
cov_mat = returns.cov()
Sigma = np.asarray(cov_mat.values)
w = Variable(len(cov_mat))
gamma = quad_form(w, Sigma)
prob = Problem(Minimize(gamma), [sum_entries(w) == 1])
prob.solve(solver=selected_solver)
weights = []
for weight in w.value:
weights.append(float(weight[0]))
return weights
- 标准均值-方差投资组合模型是静态模型。模型中没有动态。 (时间序列仅用于估计方差-协方差矩阵和预期return)。一些相关模型可以回答诸如何时以及如何重新平衡等问题。
- 限制投资组合中的资产数量会导致所谓的基数约束投资组合问题。这基本上变成了 MIQP(混合整数二次规划问题)。
多周期的问题是你的模型会过拟合。另一方面,您可以在重新平衡期间对传统的投资组合优化模型进行回测。 Riskfolio-Lib 有一个使用 backtrader 的例子,它将标准普尔 500 指数与使用季度再平衡的不同投资组合进行比较。您可以查看此 link 中的示例:https://riskfolio-lib.readthedocs.io/en/latest/examples.html
场景:我正在尝试在多周期场景中使用不同的约束条件(权重、风险、风险规避...)进行多项投资组合优化。
我已经做了什么: 从 cvxpy 的示例中,我发现了如何根据非线性二次公式优化投资组合,该公式会生成资产的权重列表投资组合构成。我的问题是,虽然我有 15 年的月度数据,但我不知道如何针对不同时期进行优化(代码,就其当前形式而言,为我的数据的整个时间跨度产生最佳组合)。
问题一:是否可以让代码针对不同时期进行优化。例如 1、3、4、6、9、12 个月(在这种情况下,每个时期产生不同的权重)如果是这样,怎么能这样做呢?
问题2:是否可以限制每个投资组合组合中的资产数量?实现这一目标的最佳方法是什么? (目前代码全部使用,但我想在资产数量有限的情况下进行测试,以控制周转水平)。
代码:
from cvxpy import *
from cvxopt import *
import pandas as pd
import numpy as np
prices = pd.DataFrame()
logret = pd.DataFrame()
normret = pd.DataFrame()
returns = pd.DataFrame()
prices = pd.read_excel(open('//folder//Dgms89//calculation v3.xlsx', 'rb'), sheetname='Prices Final')
logret = pd.read_excel(open('//folder//Dgms89//calculation v3.xlsx', 'rb'), sheetname='Returns log')
normret = pd.read_excel(open('//folder//Dgms89//calculation v3.xlsx', 'rb'), sheetname='Returns normal')
returns = normret
def calculate_portfolio(returns, selected_solver):
cov_mat = returns.cov()
Sigma = np.asarray(cov_mat.values)
w = Variable(len(cov_mat))
gamma = quad_form(w, Sigma)
prob = Problem(Minimize(gamma), [sum_entries(w) == 1])
prob.solve(solver=selected_solver)
weights = []
for weight in w.value:
weights.append(float(weight[0]))
return weights
- 标准均值-方差投资组合模型是静态模型。模型中没有动态。 (时间序列仅用于估计方差-协方差矩阵和预期return)。一些相关模型可以回答诸如何时以及如何重新平衡等问题。
- 限制投资组合中的资产数量会导致所谓的基数约束投资组合问题。这基本上变成了 MIQP(混合整数二次规划问题)。
多周期的问题是你的模型会过拟合。另一方面,您可以在重新平衡期间对传统的投资组合优化模型进行回测。 Riskfolio-Lib 有一个使用 backtrader 的例子,它将标准普尔 500 指数与使用季度再平衡的不同投资组合进行比较。您可以查看此 link 中的示例:https://riskfolio-lib.readthedocs.io/en/latest/examples.html