下面是目标函数:
这个想法是已经对证券领域进行了均值方差优化。这为我们提供了目标投资组合的权重。现在假设投资者已经持有一个投资组合,并且不想将他们的整个投资组合更改为目标投资组合。
令 w_0 = [w_0(1),w_0(2),...,w_0(N)] 为初始投资组合,其中 w_0(i) 是投资于股票 i = 1,...的投资组合的比例, N。令 w_t = [w_t(1), w_t(2),...,w_t(N)] 为目标投资组合,即再平衡后希望拥有的投资组合。该目标投资组合可以使用二次优化技术(例如方差最小化)来构建。
目标是确定满足以下特征的最终投资组合 w_f = [w_f (1), w_f (2),..., w_f(N)]:
- (1) 最终的投资组合接近我们的目标投资组合
- (2) 我们初始投资组合的交易数量足够少
- (3) 最终投资组合的回报率高
- (4) 最终的投资组合所持有的证券并不比我们的初始投资组合多得多
通过将特征项 1 到 4 相加来创建要最小化的目标函数。
第一项是通过将最终投资组合和目标投资组合的权重绝对差相加来捕获的。
第二项由指示函数的总和乘以用户指定的惩罚来捕获。指标函数是 y_{transactions}(i),如果证券 i 在初始投资组合和最终投资组合中的权重不同,则为 1,否则为 0。
第三项由最终投资组合总回报乘以用户指定的负惩罚来捕获,因为目标是最小化。
最后一项是最终投资组合中的资产数量(即,计算最终投资组合中正权重数量的指标函数的总和)乘以用户指定的惩罚。
假设我们已经将目标权重作为 target_w 我如何在 docplex python 库中设置这个优化问题?或者,如果有人熟悉 NAG 中的混合整数规划,那么知道如何在那里设置这样的问题也会很有帮助。
`
final_w = [0.]*n
final_w = np.array(final_w)
obj1 = np.sum(np.absolute(final_w - target_w))
pen_trans = 1.2
def ind_trans(final,inital):
list_trans = []
for i in range(len(final)):
if abs(final[i]-inital[i]) == 0:
list_trans.append(0)
else:
list_trans.append(1)
return list_trans
obj2 = pen_trans*sum(ind_trans(final_w,initial_w))
pen_returns = 0.6
returns_np = np.array(df_secs['Return'])
obj3 = (-1)*np.dot(returns_np,final_w)
pen_count = 1.
def ind_count(final):
list_count = []
for i in range(len(final)):
if final[i] == 0:
list_count.append(0)
else:
list_count.append(1)
return list_count
obj4 = sum(ind_count(final_w))
objective = obj1 + obj2 + obj3 + obj4