基于LIFO规则计算交易组合盈亏百分比的技术咨询
LIFO交易组合盈亏计算指导建议
我来给你梳理几个核心思路,帮你搞定LIFO(后进先出)规则下的交易盈亏计算问题:
用栈结构存储交易记录:LIFO的核心是“最新的先处理”,栈(Stack)数据结构天生适配这个逻辑。你可以把所有买入记录存在一个
buyStack里,每个元素包含bought_amount(买入的目标货币数量)和price(单位目标货币对应的计价货币成本,比如示例里“用32 C买20 JS”,可以记录为price: 32/20,即1 JS的C成本);卖出记录可以单独存储,处理时按顺序取出最新的卖出单即可。栈的顶部始终是最新的交易,方便直接获取。单条卖出单的匹配逻辑(迭代优先):
处理每一笔卖出时,不要急于用递归(递归在交易记录极多时可能触发栈溢出),用循环迭代更稳妥:- 取出当前待处理的卖出单,记录剩余需要匹配的卖出数量
remainingSell - 循环直到
remainingSell为0或买入栈为空:- 弹出买入栈顶部的最新买入单
- 计算本次可匹配的数量:取
remainingSell和买入单剩余数量的最小值 - 统一计价基准:这是关键!你需要把买入价和卖出价都转换成同一基准货币(比如都以C为单位,或者都以JS为单位),才能计算盈亏。比如示例中“卖出57 C换31 JS”,可以转换成“1 JS的卖出价是57/31 C++”,和买入价的“1 JS的成本是X C++”对比,盈亏就是
(卖出价 - 买入价) * 匹配的JS数量 - 更新剩余数量:如果买入单的数量被耗尽,就直接丢弃;如果还有剩余,把剩余数量的买入单重新推回栈顶。同时扣减
remainingSell的数量
- 把每一笔匹配的盈亏明细(匹配数量、对应买入价、卖出价、单笔盈亏)记录下来,方便后续汇总
- 取出当前待处理的卖出单,记录剩余需要匹配的卖出数量
盈亏百分比的计算:
先汇总所有匹配成功的交易的总盈亏,再除以这些交易所对应的总买入成本,最后乘以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
相关产品推荐
相关产品推荐

