我有一系列要迭代的股票交易,并且我希望输出是最终头寸。我正在解析一个提供买卖清单的 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,
...
}
如果我创建一个递归函数,这是非常简单的。我可以迭代并找到所有未平仓头寸,然后我可以再次迭代并找到所有完全匹配的数量并关闭这些交易,但是我需要继续迭代并寻找部分数量的销售,然后我怎么知道什么时候停止?因为最终可能不再有卖出,可能只剩下未平仓交易——这是正确的。
我不确定我应该如何或何时决定停止迭代并寻找匹配的位置。
答案 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',
}];