目的是找到每个因子的优化权重,以最大化特定值。 Scipy仅提供优化以最小化函数,因此我在此处使用负号来查找最大值。代码看起来不错,scipy最终可以成功终止,但没有返回任何解决方案。有人可以帮忙吗?
import pandas as pd
import numpy as np
from scipy.optimize import minimize
df = pd.DataFrame(np.random.randn(10, 4), columns=list('ABCD'))
# the sum of weights should be 1.
cons = ({'type': 'eq',
'fun' : lambda x: np.array(sum(x)-1)},
{'type': 'ineq',
'fun' : lambda x: np.array([a for a in x])})
# wt should be a list like [0.2, 0.3, 0.5]
def optimizewt(wt):
s = df[list('ABC')]
r = df['D']
# rule to calculate the weighted total score of each row
ts = lambda x: x*wt
# apply the rule to get weighted total scores
f = ts(s)
a = f.sum(axis = 1)
# sort the list ascending
a.sort(ascending=True)
l = len(a)
# replace the largest and smallest two scores. set others to 0.
a[0:2] = 1
a[(l-2):] = -1
a[2:(l-2)] = 0
# multiply the two lists. return the average of the calculated list.
return -np.mean(a*r)
res = minimize(optimizewt, [0.5,0.5,0.], constraints=cons)
print(res.x)