遍历数组/链的开放和关闭的股票头寸

时间:2021-07-29 21:00:53

标签: javascript arrays stock

我有一系列要迭代的股票交易,并且我希望输出是最终头寸。我正在解析一个提供买卖清单的 CSV。我想处理每一个并了解最后剩下的内容。

最后我想要一个包含多个对象的数组,每个对象描述最终头寸 - 我买了一些 twitter(1 笔交易 - 开仓),我卖出了整个头寸(同一笔交易现在标记为平仓),然后我买了一些商店(1 笔交易 - 开仓),卖掉了其中的一些(之前的交易数量已更新但仍处于打开状态,新交易创建了卖出数量并关闭),然后我又买了一些,然后全部卖出(1 笔新交易,然后关闭)所有行业)

来自 CSV 的示例

{
  Action: 'Buy',
  Symbol: 'SHOP',
  Quantity: '200',
  ...
},
{
  Action: 'Sell',
  Symbol: 'SHOP',
  Quantity: '200',
  ...
},
{
  Action: 'Buy',
  Symbol: 'SHOP',
  Quantity: '50',
  ...
},
{
  Action: 'Sell',
  Symbol: 'SHOP',
  Quantity: '25',
  ...
},
{
  Action: 'Sell',
  Symbol: 'SHOP',
  Quantity: '25',
  ...
},
{
  Action: 'Buy',
  Symbol: 'SHOP',
  Quantity: '1',
  ...
},

这将转换为:

{
  stockTicker: 'SHOP',
  positionStatus: 'CLOSED',
  quantity: 200,
  ...
},
{
  stockTicker: 'SHOP',
  positionStatus: 'CLOSED',
  quantity: 25,
  ...
},
{
  stockTicker: 'SHOP',
  positionStatus: 'CLOSED',
  quantity: 25,
  ...
},
{
  stockTicker: 'SHOP',
  positionStatus: 'OPEN',
  quantity: 1,
  ...
}

如果我创建一个递归函数,这是非常简单的。我可以迭代并找到所有未平仓头寸,然后我可以再次迭代并找到所有完全匹配的数量并关闭这些交易,但是我需要继续迭代并寻找部分数量的销售,然后我怎么知道什么时候停止?因为最终可能不再有卖出,可能只剩下未平仓交易——这是正确的。

我不确定我应该如何或何时决定停止迭代并寻找匹配的位置。

2 个答案:

答案 0 :(得分:0)

您不需要为此使用递归函数,您可以通过对您的交易数组进行一次迭代来构建仓位对象。

trades.reduce(...) 获取 trades 数组并构造一个对象,其中键是 trades 中的唯一符号,值是持有的单位数量的运行总数。

为方便起见,Object.entries 和 .map 部分将该对象转换为对象数组,您可能不需要这样做。

const trades = [
{
  Action: 'Buy',
  Symbol: 'SHOP',
  Quantity: '200',
},
{
  Action: 'Sell',
  Symbol: 'SHOP',
  Quantity: '200',
},
{
  Action: 'Buy',
  Symbol: 'SHOP',
  Quantity: '50',
},
{
  Action: 'Sell',
  Symbol: 'SHOP',
  Quantity: '25',
},
{
  Action: 'Sell',
  Symbol: 'SHOP',
  Quantity: '25',
}
];

const positions = Object.entries(trades.reduce((acc, el) => {
  if (!acc[el.Symbol]) acc[el.Symbol] = 0;
  if (el.Action === "Sell") {
    acc[el.Symbol] -= Number(el.Quantity);
  } else {
    acc[el.Symbol] += Number(el.Quantity);
  }
  return acc;
}, {})).map(([Symbol, Quantity]) => ({Symbol, Quantity}));
console.log(positions);

答案 1 :(得分:0)

我处理它的方法是填充两个数组,一个用于买入,一个用于卖出。然后循环遍历两个数组以关闭关闭的任何头寸,并保持已打开但已售出部分股份的运行计数。我还使用 try: with my_library.connect(endpoint) as connection: connection.store_data("...") except my_library.MyLibraryConnectionError as e: # handle appropriately, or ignore except Exception as e: # Handle other errors that happen, that your library doesn't cause. 运算符在卖单完全执行后短路我的代码。请注意,此代码应适用于多个股票代码。

初始数组:

Array.some()

逻辑:

trades = [{
  Action: 'Buy',
  Symbol: 'SHOP',
  Quantity: '200',
},{
  Action: 'Sell',
  Symbol: 'SHOP',
  Quantity: '200',
},{
  Action: 'Buy',
  Symbol: 'SHOP',
  Quantity: '50',
},{
  Action: 'Sell',
  Symbol: 'SHOP',
  Quantity: '25',
},{
  Action: 'Sell',
  Symbol: 'SHOP',
  Quantity: '25',
},{
  Action: 'Buy',
  Symbol: 'SHOP',
  Quantity: '1',
}];