当我必须分配特定的投资组合预算来购买股票时,我正在处理一个问题。分配给每只股票的股票价格和预算百分比是已知的,并假设预算为100,000美元。以下是我目前使用的通用百分比计算:
data = [
{stock: 'INFY', price: 1122.9, percent: 0.304},
{stock: 'SUNPHARMA', price: 890.95, percent: 0.177},
{stock: 'TCS', price: 2597.7, percent: 0.123},
{stock: 'HCLTECH', price: 856, percent: 0.117},
{stock: 'LUPIN', price: 2019, percent: 0.112},
{stock: 'DIVISLAB', price: 1097, percent: 0.085},
{stock: 'CADILAHC', price: 409.4, percent: 0.082}
];
var budget = 100000;
var actual = 0;
for ( var i = 0; i < data.length; i++ in data ) {
shares = Math.floor((budget * data[i].percent) / data[i].price);
document.write( data[i].stock + ': ' );
document.write( shares );
document.write( '<br />' );
spent = shares * data[i].price;
actual += spent;
}
document.write( '<hr />' );
document.write( 'Budget: ' + budget );
document.write( '<br />' );
document.write( 'Actual spent: ' + actual );
&#13;
找到使用预算的最佳方式的方法/算法/代码应该是什么:
为了满足上述两个条件,可以偏离分配给每只股票的预算百分比,但偏差应该是最不可能的
答案 0 :(得分:1)
添加一个更重要的变量minPrice
。
根据百分比完成初始分配后,您可以创建一个额外的while
循环,该循环不断添加共享,而余数大于或等于最低价格。
var budget = 100000;
var actual = 0;
var minPrice = Infinity;
for ( var i = 0; i < data.length; i++ in data ) {
data[i].shares = Math.floor((budget * data[i].percent) / data[i].price);
actual += data[i].shares * data[i].price;
minPrice = data[i].price < minPrice ? data[i].price : minPrice;
}
var remain = budget - actual;
// attempts to add 1 share each iteration until not enough left to buy any shares
while( remain >= minPrice){
for(var i =0; i < data.length; i++){
if(data[i].price <= minPrice){
data[i].shares +=1;
remain -= data[i].price;
actual += data[i].price
}
}
}
由于初始数据按最高投资组合百分比排序,如果价格低于预算的剩余部分,则优先级更高的优先级将自动获得更多股票