【问题标题】:How should I think about implement the closing of an open equity position in my portfolio app?我应该如何考虑在我的投资组合应用程序中关闭未平仓头寸?
【发布时间】:2019-06-01 02:10:21
【问题描述】:

我有一个模型 PortStock,其架构如下所示:

# == Schema Information
#
# Table name: port_stocks
#
#  id                :bigint(8)        not null, primary key
#  portfolio_id      :integer
#  stock_id          :integer
#  volume            :integer
#  transaction_price :float
#  current_price     :float
#  percent_change    :float
#  created_at        :datetime         not null
#  updated_at        :datetime         not null
#  current_value     :float
#  dollar_change     :float
#  total_spend       :float
#  transaction_date  :datetime
#  action            :integer
#  position          :integer          default("open")
#  ticker            :string
#  slug              :string
#

当有人购买股票时,该应用会创建一个 port_stock,在其 portfolio 中包含 position: "open", action: :buy

当他们 sell 那个位置时,基本上发生的事情是他们创建另一个 port_stock 但它只有 position: "closed", action: :sell

我有几个问题:

  1. 这真的是最优化的结构吗?我看到的一个直接问题是我必须closebuy 位置。所以本质上,完整的completed position 将是两个closed buysell port_stock 记录。如果只有一个,则该职位被认为是开放的。但这有意义吗?
  2. 我应该在我的模型中创建一个方法来平仓和开仓吗?我最初只是在我的控制器中执行此操作,但现在我正在编写单元测试,我没有一个干净的方法来关闭现有的未平仓头寸。

我应该以不同的方式处理port_stock 的买卖吗?

想法?

【问题讨论】:

  • 我认为最好维护单个实例并根据操作更新position 并维护position_bought_dateposition_sold_date 以便于维护和验证它。
  • @uday 好吧,我需要跟踪每笔交易,包括买卖。例如,假设您购买了 100 股 Acme Inc 的股票,并且想在以后出售 20 股……您并没有结束整个交易,只是 20 股。所以我需要记录 100 到 80 的减少以及 20 被出售的价格、日期和时间等,以反映在投资组合价值中。所以我必须在两个不同的交易中跟踪它。

标签: ruby-on-rails architecture ruby-on-rails-5 software-design


【解决方案1】:

我认为您需要保留每笔交易。

如果您购买了 100 股 Acme,之后想卖出 20 股;您必须将这两笔交易都保留在您的投资组合中。

要了解您有多少操作,您必须对每个操作的事务求和。 也许它是重复的,但它是跟踪投资组合价值的最佳选择。

例如,如果你想计算你的损益,你必须为每笔交易求和(price*volume*spot_change),如果action = sell乘以-1,否则你乘以1

您的代码的最终目标是什么?告诉我是否可以为您提供更多帮助。

【讨论】:

    【解决方案2】:

    这个问题提出了两个不同的概念。第一个概念是“仓位”,第二个概念是“交易”。头寸是实际拥有的股份数量。对于已拥有的股票,该数字可以是正数(多头),对于您已售出但必须在某个时间点回购的股票,该数字可以是负数(空头)。

    该头寸将有一项或多项针对它的交易。每个事务都将使用相关属性打开、执行或关闭,例如openedOn、executedOn,并且可能为已打开但从未执行的事务关闭。

    公开交易可能代表以特定价格购买股票的出价。但是,如果要约从未执行并且用户选择取消该交易,即使它从未导致购买股票,您仍将拥有它的记录。

    使用这种结构,头寸对象仅跟踪所有已完成交易的摘要信息,而不是交易信息,从而更容易跟踪针对特定头寸执行的所有交易,即多次购买以累积股份卖出一只股票来建立一个头寸或多次卖出来削减一个头寸。

    【讨论】:

      【解决方案3】:
      1. 遗漏了一个概念。这使您的方法不是最佳的。现实世界中的股权交易也有部分执行,这里不做处理。 在买入和卖出期间都可能发生部分执行。

      例如。如果您创建限价单以 1 美元买入 1000 股。 ROMS 系统(或您使用的任何交易匹配系统)可以找到的唯一匹配订单是 500 股。 在这种情况下,您需要使用 数量:500,动作:部分

      此外,在市价单期间可能会发生部分执行。

      例如。您以市价卖出 1000 股。前 200 股以 1 美元的价格出售,其余 800 股以 0.8 美元的价格出售。操作 : close 只能在完成销售后发生。

      1. 我同意该方法应保留在买卖模型中。

      【讨论】:

        猜你喜欢
        • 2017-03-14
        • 2010-10-04
        • 2015-12-25
        • 2020-09-26
        • 1970-01-01
        • 2022-01-24
        • 2020-04-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多