You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于LIFO规则计算交易组合盈亏百分比的技术咨询

LIFO交易组合盈亏计算指导建议

我来给你梳理几个核心思路,帮你搞定LIFO(后进先出)规则下的交易盈亏计算问题:

  • 用栈结构存储交易记录:LIFO的核心是“最新的先处理”,栈(Stack)数据结构天生适配这个逻辑。你可以把所有买入记录存在一个buyStack里,每个元素包含bought_amount(买入的目标货币数量)和price(单位目标货币对应的计价货币成本,比如示例里“用32 C买20 JS”,可以记录为price: 32/20,即1 JS的C成本);卖出记录可以单独存储,处理时按顺序取出最新的卖出单即可。栈的顶部始终是最新的交易,方便直接获取。

  • 单条卖出单的匹配逻辑(迭代优先):
    处理每一笔卖出时,不要急于用递归(递归在交易记录极多时可能触发栈溢出),用循环迭代更稳妥:

    1. 取出当前待处理的卖出单,记录剩余需要匹配的卖出数量remainingSell
    2. 循环直到remainingSell为0或买入栈为空:
      • 弹出买入栈顶部的最新买入单
      • 计算本次可匹配的数量:取remainingSell和买入单剩余数量的最小值
      • 统一计价基准:这是关键!你需要把买入价和卖出价都转换成同一基准货币(比如都以C为单位,或者都以JS为单位),才能计算盈亏。比如示例中“卖出57 C换31 JS”,可以转换成“1 JS的卖出价是57/31 C++”,和买入价的“1 JS的成本是X C++”对比,盈亏就是(卖出价 - 买入价) * 匹配的JS数量
      • 更新剩余数量:如果买入单的数量被耗尽,就直接丢弃;如果还有剩余,把剩余数量的买入单重新推回栈顶。同时扣减remainingSell的数量
    3. 把每一笔匹配的盈亏明细(匹配数量、对应买入价、卖出价、单笔盈亏)记录下来,方便后续汇总
  • 盈亏百分比的计算:
    先汇总所有匹配成功的交易的总盈亏,再除以这些交易所对应的总买入成本,最后乘以100%得到百分比。比如总盈亏是Y单位的C++,总买入成本是Z单位的C++,盈亏百分比就是(Y/Z)*100%

  • 伪代码示例参考:

// 初始化买入栈(栈顶是最新买入,这里统一把价格转换成「1单位JS对应的C++数量」)
const buyStack = [
  { amount: 22, costPerUnit: 22/22 }, // 用22 C++买22 JS → 1 JS = 1 C++
  { amount: 17, costPerUnit: 29/17 }, // 用29 C++买17 JS → ~1.705 C++/JS
  { amount: 20, costPerUnit: 32/20 }  // 用32 C++买20 JS → 1.6 C++/JS
];

// 处理一笔卖出单:卖出12 C++换11 JS → 转换成「1 JS对应的卖出价」是12/11 ≈1.09 C++/JS
const currentSell = { sellAmountInJS: 11, sellPricePerUnit: 12/11 };
let remainingSell = currentSell.sellAmountInJS;
let totalProfit = 0;
let totalCost = 0;

while (remainingSell > 0 && buyStack.length > 0) {
  const latestBuy = buyStack.pop();
  const matchQty = Math.min(remainingSell, latestBuy.amount);
  
  // 计算这笔匹配的盈亏和成本
  const profit = (currentSell.sellPricePerUnit - latestBuy.costPerUnit) * matchQty;
  const cost = latestBuy.costPerUnit * matchQty;
  
  totalProfit += profit;
  totalCost += cost;
  
  // 更新剩余数量
  remainingSell -= matchQty;
  latestBuy.amount -= matchQty;
  
  // 如果买入单还有剩余,放回栈顶
  if (latestBuy.amount > 0) {
    buyStack.push(latestBuy);
  }
}

// 计算盈亏百分比(如果总成本不为0)
const profitPercent = totalCost > 0 ? (totalProfit / totalCost) * 100 : 0;
console.log(`盈亏百分比:${profitPercent.toFixed(2)}%`);

内容的提问来源于stack exchange,提问作者S tz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:23:23