寻求结合买卖成本与交易量的游戏市场最优盈利产品算法
SkyBlock 游戏内市场最优盈利产品筛选方案求助
我正在开发一款SkyBlock游戏内的市场产品评估工具,核心功能是帮玩家筛选适合低买高卖的产品。目前用到的参数包括:
buy_summary、sell_summary:当前买卖方向的前30笔订单数据quick_status:产品实时状态汇总,包含以下字段:sellVolume/buyVolume:对应交易方向的所有订单物品总量sellPrice/buyPrice:按交易量加权的前2%订单均价buyMovingWeek/sellMovingWeek:近7天+实时的历史交易量总和sellOrders/buyOrders:活跃订单数量
我之前尝试的计算逻辑如下:
- 计算
sellAvailability和buyAvailability:用sellMovingWeek/7除以sellVolume,buyMovingWeek/7除以buyVolume,以此代表订单清空所需时长 - 根据用户可用资金计算可购买数量,进而算出总成本、总售价和利润
- 对可用性相关指标和利润做归一化处理,通过可用性差值、可用性均值和利润的加权平均计算产品得分
但这套方法有个硬伤——哪怕反复调整权重,还是会出现高分产品实际亏损的情况。我不是经济学专业出身,希望能得到结合买卖交易量的最优盈利产品筛选算法。以下是我目前的Java代码:
private void calculateButtonActionPerformed(java.awt.event.ActionEvent evt) { float money; int amount; //获取资金和数量值,若格式错误则设为0 try{ money = Float.parseFloat(moneyField.getText()); } catch(NumberFormatException e){ moneyField.setText(0+""); money = 0; } try { amount = Integer.parseInt(amountCombo.getSelectedItem().toString()); } catch(NumberFormatException e){ amountCombo.setSelectedItem(0+""); amount = 0; } //计算步骤: //1) 计算可购买数量并限制在设定值内 //2) 用限制后的数量乘以买入价得到总成本 //3) 用限制后的数量乘以卖出价得到总售价 //4) 计算利润 //5) 找出最大利润值 //5.2) 找出最大可用性差值和最大可用性均值 //6) 计算可用性差值并取反向值 //7) 计算可用性均值 //8) 归一化所有指标值 //9) 计算产品得分 double maxRevenue = 0; double maxDifference = 0; double maxAverage = 0; double[] revenue = new double[tabla.length]; //遍历计算利润并记录最大值 for(int i = 0; i<tabla.length; i++){ //1) 计算可购买数量并限制在设定值内 int buyingAmount = calculateAmountAndClamp(amount, money, Float.parseFloat(tabla[i][2].toString())); //2) 计算总成本 double buyingCost = buyingAmount*(Double.parseDouble(tabla[i][2].toString())); //3) 计算总售价 double sellingCost = buyingAmount*(Double.parseDouble(tabla[i][4].toString())); //4) 计算利润 revenue[i] = sellingCost-buyingCost; //5) 更新最大利润值 maxRevenue = Math.max(maxRevenue, revenue[i]); //5.2) 更新最大可用性差值和最大可用性均值 maxDifference = Math.max(maxDifference, Math.abs(Double.parseDouble(tabla[i][1].toString())-Double.parseDouble(tabla[i][3].toString()))); maxAverage = Math.max(maxAverage, (Double.parseDouble(tabla[i][1].toString())+Double.parseDouble(tabla[i][3].toString())/2)); } //遍历计算可用性差值、均值,归一化后计算得分 for (int i = 0; i < tabla.length; i++) { //6) 计算可用性差值并取反向值 double difference = Math.abs(Double.parseDouble(tabla[i][1].toString())-Double.parseDouble(tabla[i][3].toString())); difference = maxDifference-difference; //7) 计算可用性均值 double average = (Double.parseDouble(tabla[i][1].toString())+Double.parseDouble(tabla[i][3].toString()))/2.; //8) 归一化指标值 System.out.println("\nDifference: "+difference+" Average: "+average+" Profit: "+revenue[i]); difference = scaleValue(difference, maxDifference, maxRevenue); average = scaleValue(average, maxAverage, maxRevenue); //9) 计算产品得分 tabla[i][5]=difference*availabilityDiffereneWeight+average*availabilityAverageWeight+revenue[i]*profitWeight; System.out.println("Difference: "+difference+" Average: "+average+" Profit: "+revenue[i]+"Score: "+tabla[i][5]+"\n"); } }
内容的提问来源于stack exchange,提问作者EustakiosPower
相关产品推荐
相关产品推荐

