如何使用最小舍入误差进行百分比分布

时间:2015-10-12 22:02:13

标签: javascript algorithm math percentage

当我必须分配特定的投资组合预算来购买股票时,我正在处理一个问题。分配给每只股票的股票价格和预算百分比是已知的,并假设预算为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;
&#13;
&#13;

找到使用预算的最佳方式的方法/算法/代码应该是什么:

  • 预算与实际支出之间的差异最小
  • 实际支出不应超过预算

为了满足上述两个条件,可以偏离分配给每只股票的预算百分比,但偏差应该是最不可能的

1 个答案:

答案 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
        }
    }    
}

由于初始数据按最高投资组合百分比排序,如果价格低于预算的剩余部分,则优先级更高的优先级将自动获得更多股票