首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用FIFO计算股票交易的已实现和未实现市盈率

用FIFO计算股票交易的已实现和未实现市盈率
EN

Stack Overflow用户
提问于 2020-10-18 21:55:30
回答 1查看 1K关注 0票数 0

我对Python非常陌生,我一直试图弄明白:如何从交易数据到我的投资组合中的数据(包括已实现和未实现的P/L? )。

到目前为止,我从代理下载交易列表,只需稍微清理一下数据。举个例子,假设我从一个数据开始,它有2只股票(ABCD和EFGH),按股票和日期排序(顶部是最老的),包括股票名称、数量、交易方向和价格。该设置如下所示:

代码语言:javascript
复制
ABCD 5 Buy 100
ABCD 3 Buy 90
ABCD 6 Sell 105
EFGH 4 Buy 50
EFGH 3 Sell 55
EFGH 2 Buy 53
EFGH 3 Sell 60

我想得出一个数据,其中包括股票名称、投资组合中的数量、已变现市盈率和未变现市盈率。假设ABCD的当前价格包括在其他地方(例如,在另一个数据中;假设它此时的交易价格为120 ),这是用于未变现的P/L --它将如下所示:

代码语言:javascript
复制
ABCD 2 40 60
EFGH 0 39 0

..。如此真实。ABCD的P/L为5*(105-100)+1*(105-90),且不真实。P/L为2*(120-90)等。

queuedeque似乎是解决方案,我怀疑这是一个非常直截了当的练习,但我真的不知道如何实现它,因此任何帮助都是值得赞赏的。我发现了一个类似的问题How to calculate realized P&L of stock trades using the FIFO method?,但没有应用它的例子。

EN

回答 1

Stack Overflow用户

发布于 2021-07-23 21:51:35

我不认为这将直接回答你的问题,关于排队或deque,但它肯定会给你另一个更冗长的方式做同样的。如果您的数据结构如下:

代码语言:javascript
复制
Stock  Type     Price  Quantity           TimeStamp  Stocks in Hand
TQQQ   buy   63.1200      14.0   2020-08-14 19:50:00            14.0
TQQQ   buy   71.7800      60.0   2020-08-25 13:06:41            74.0
TQQQ  sell   71.0025      74.0   2020-09-04 13:49:42             0.0
TQQQ   buy   69.0750      60.0   2020-09-04 14:00:16            60.0
TQQQ  sell   82.7900      60.0   2020-12-01 18:08:54             0.0
TQQQ   buy   82.5450       2.0   2020-12-14 22:42:22             2.0
TQQQ   buy   84.7000      40.0   2020-12-21 13:58:03            42.0
TQQQ   buy  104.0000       1.0   2021-01-25 15:35:28            43.0
TQQQ   buy   96.5000       2.0   2021-01-27 19:32:45            45.0
TQQQ   buy   91.4000       3.0   2021-01-29 20:45:38            48.0
TQQQ   buy   96.3399      13.0   2021-02-01 16:48:30            61.0
TQQQ   buy   96.3400      10.0   2021-02-01 16:50:34            71.0
TQQQ  sell  100.0000      15.0   2021-02-02 14:02:11            56.0
TQQQ  sell  102.0000      10.0   2021-02-02 16:55:15            46.0

然后使用以下方法:

代码语言:javascript
复制
def get_profit(data,stock):
 import pandas as pd
 buys = get_trans_types(mytrans[mytrans['Stock']==stock], 'buy')
 sells = get_trans_types(mytrans[mytrans['Stock']==stock], 'sell')
 profit = list()
 i = -1
 while (i < (len(sells)-1)):
 i = i + 1
 l = 0
 p = 0
 t = 0 
 r = 0
 inv = 0 
 if sells[i][3] == buys[l][3]:
  p = (sells[i][2] - buys[l][2])*sells[i][3]
  inv = buys[l][2]*sells[i][3]
  t = max(1,(sells[i][4] - buys[l][4]).days)
  r = (p / inv) * (365/t)
  profit.append([sells[i][0],sells[i][1],sells[i][2],sells[i][3],sells[i][4],sells[i][5],p,inv,t,r])
  buys.pop(l)
 elif sells[i][3] < buys[l][3]:
  p = (sells[i][2]-buys[l][2])*sells[i][3]
  inv = buys[l][2]*sells[i][3]
  t = max(1,(sells[i][4] - buys[l][4]).days)
  r = (p / inv) * (365/t)
  profit.append([sells[i][0],sells[i][1],sells[i][2],sells[i][3],sells[i][4],sells[i][5],p,inv,t,r])
  buys[l][3] = buys[l][3] - sells[i][3]
 elif sells[i][3] > buys[l][3]:
  p = (sells[i][2]-buys[l][2])*buys[l][3]
  inv = buys[l][2]*buys[l][3]
  t = max(1,(sells[i][4] - buys[l][4]).days)
  r = (p / inv) * (365/t)
  profit.append([sells[i][0],sells[i][1],sells[i][2],buys[l][3],sells[i][4],sells[i][5],p,inv,t,r])
  sells[i][3] = sells[i][3] - buys[l][3]
  buys.pop(l)
  i = i - 1
 profit = pd.DataFrame(profit, columns=['Stock','Type','Price','Quantity','TimeStamp','Stocks in Hand','Abs Profit','Init Investment','Days Invested', 'Rate of Return'])
 return(profit)

tqqqprofit = get_profit(mytrans,'TQQQ')

会给你每个卖出交易的利润和回报,除以最初在不同日期/价格购买的股票数量:

代码语言:javascript
复制
Stock  Type     Price  Quantity  ... Abs Profit  Init Investment  Days Invested  Rate of Return
TQQQ  sell   71.0025      14.0  ...   110.3550         883.6800             20        2.279082
TQQQ  sell   71.0025      60.0  ...   -46.6500        4306.8000             10       -0.395357
TQQQ  sell   82.7900      60.0  ...   822.9000        4144.5000             88        0.823541
TQQQ  sell  100.0000       2.0  ...    34.9100         165.0900             49        1.575164
TQQQ  sell  100.0000      13.0  ...   198.9000        1101.1000             43        1.533319
TQQQ  sell  102.0000      10.0  ...   173.0000         847.0000             43        1.733753
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64418729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档