我想最大化债券投资组合的收益

时间:2019-05-03 22:20:44

标签: python

我有一个债券数据框。我想在以下约束下使产量最大化: 使用债券宇宙(一个债券对应一行)

目标函数应为:

objective = max(价格*头寸*收益率/总和(价格*头寸))

债券价值=价格*头寸

约束:

我最多要有8个键。

我想要一个总价值为1,000,000的投资组合。该值是8个债券的总和,价值=价格*头寸

我想要sum(8个键值* nb_days)/ sum(8个键值)<150

我要求和(8个绑定值* nb_days)/和(8个绑定值)> 140

数据帧DfBill是 index price nb_days yield position mkt value wght 0 98.17405 334 2.004695 1000 981.7405 4.7% 1 98.34707 306 1.977307 1000 983.4707 4.7% 2 98.5219 278 1.942803 1000 985.219 4.7% 3 98.72388 250 1.861366 1000 987.2388 4.7% 4 98.87597 222 1.843473 1000 988.7597 4.7% 5 99.22865 152 1.841083 1000 992.2865 4.8% 6 99.15942 166 1.838398 1000 991.5942 4.8% 7 99.2668 145 1.833804 1000 992.668 4.8% 8 99.02267 194 1.831502 1000 990.2267 4.8% 9 99.30549 138 1.824436 1000 993.0549 4.8% 10 99.34964 131 1.798948 1000 993.4964 4.8% 11 99.39354 124 1.771433 1000 993.9354 4.8% 12 99.43418 117 1.750892 1000 994.3418 4.8% 13 99.47195 110 1.737338 1000 994.7195 4.8% 14 99.51012 103 1.720631 1000 995.1012 4.8% 15 99.55429 96 1.678896 1000 995.5429 4.8% 16 99.58933 89 1.667987 1000 995.8933 4.8% 17 99.6229 82 1.661828 1000 996.229 4.8% 18 99.7245 61 1.630393 1000 997.245 4.8% 19 99.69329 68 1.628754 1000 996.9329 4.8% 20 99.66268 75 1.624616 1000 996.6268 4.8%

非常感谢您的帮助

PS: 这是我编写的代码,但是不起作用:

def objective1(df):
    PosYld = df['position'] * df['price'] * df['yield'] 
    PosPrice = df['position'] * df['price'] 
    AvgYld = PosYld.sum() / PosPrice .sum()
    return 1/AvgYld

def constraint1(df):
    PosDays = df['position'] * df['nb_days'] 
    AvgDays = PosDays.sum() / df['position'].sum()
    return AvgDays - 150 

def constraint2(df):
    PosDays = df['position'] * df['nb_days'] 
    AvgDays = PosDays.sum() / df['position'].sum()
    return - AvgDays + 140 

b = (0,800000)
bnds = []
for i in range(len(DfBill)):
    bnds.append(b)
bnds = tuple(bnds)

con1 = {'type':'ineq','fun': constraint1}
con2 = {'type':'ineq','fun': constraint2}
cons = [con1,con2]

sol = minimize(objective1,DfBill['position'].values.tolist() ,method = 'SLSQP',bounds = bnds,constraints = cons)
print(sol)

我使用了下面在互联网上找到的代码,并试图将其应用于我的案子。

def objective(x):
    x1 = x[0]
    x2 = x[1]
    x3 = x[2]
    x4 = x[3]
    return x1*x4*(x1+x2+x3)+x3

def constraint1(x):
    return x[0]*x[1]*x[2]*x[3]-25

def constraint2(x):
    sum_sq = 40
    for i in range(4):
        sum_sq = sum_sq - x[i]**2
    return sum_sq

x0 = [1,5,5,1]
b = (1,5)
bnds = (b,b,b,b)
con1 = {'type':'ineq','fun': constraint1}
con2 = {'type':'ineq','fun': constraint2}
cons = [con1,con2]

sol = minimize(objective,x0,method = 'SLSQP',bounds = bnds,constraints = cons)
print(sol)

0 个答案:

没有答案