迭代字典并根据其内容计算结果

Iterating over a dictionary and computing a result from its contents

在迭代以下代码时,我得到了错误的结果。结果应该是-174.5,但我得到的是-9170.27。

我的代码如下:

portfolio = {
  "AAPL": {
    "volume": 10,
    "strike": 154.12
  },
  "GOOG": {
    "volume": 2,
    "strike": 812.56
  },
  "TSLA": {
    "volume": 12,
    "strike": 342.12
  },
  "FB": {
    "volume": 18,
    "strike": 209.0
  }
}

# print(portfolio["TSLA"]["volume"])
# print(portfolio["GOOG"]["strike"])

market = {
  "AAPL":  198.84,
  "GOOG": 1217.93,
  "TSLA":  267.66,
  "FB":    179.06
}

total_pl = 0

for key, value in portfolio.items():
    pl = market[key] - (portfolio[key]["strike"]) * portfolio[key]["volume"]
    total_pl += pl

print(total_pl)

如有任何帮助,我们将不胜感激!

先计算差价再乘以成交量:

pl = (market[key] - portfolio[key]["strike"]) * portfolio[key]["volume"]

只是用价值代替投资组合[key]

for key, value in portfolio.items():
    pl = (market[key] - value["strike"]) * value["volume"]
    total_pl += pl

2 个观察结果:

  • 您用来计算每只股票的 PnL 的公式 pl 是错误的 - 您实际上是从价格中减去总体头寸价值(价格 * 大小)。
  • 不需要在循环中查找字典portfolio(我指的是portfolio[key]["volume"]portfolio[key]["strike"])),因为你已经解包了 即使用循环 for key, value in portfolio.items()。您可以简单地调用 value["volume"]value["strike"]

在代码中:

total_pl = 0

for key, value in portfolio.items():
    pl = (market[key] - value["strike"]) * value["volume"]
    total_pl += pl

您可以使用列表理解使其更紧凑:

total_pl = sum([v["volume"] * (market[k] - v["strike"]) for k, v in portfolio.items()])

就个人而言,我会添加一些合理性检查,确保您拥有投资组合中所有股票的市场信息,并以某种方式管理缺失的信息(现在,它只是 return a KeyError).