在指定日期范围内持有的最大股票数量

问题描述

我有历史交易数据,包括进入日期,退出日期和股票名称

我想知道在任何给定日期范围内持有的最大股票数量。我在MysqL和python pandas中都有这些数据。

我的数据集:

    entry_time  exit_time         stk
272 2020-06-10 2020-06-23    SHANKara
197 2020-06-11 2020-06-25    PNCINFRA
85  2020-06-11 2020-06-25  DYNAMATECH
171 2020-06-15 2020-06-29     MANINDS
199 2020-06-16 2020-06-24     ASTERDM
241 2020-06-18 2020-06-29     JKPAPER
130 2020-06-18 2020-06-23  SOMANYCERA
159 2020-06-18 2020-06-25  EVERESTIND
212 2020-06-18 2020-07-01    JSLHISAR
295 2020-06-19 2020-06-25  IBVENTURES
133 2020-06-19 2020-07-02     FIEMIND
123 2020-06-19 2020-06-23    SUPRAJIT
118 2020-06-19 2020-07-01  NRBbearing
97  2020-06-19 2020-06-24        SPAL
261 2020-06-19 2020-06-29   DALBHaraT
50  2020-06-22 2020-07-06   SANGINITA
150 2020-06-22 2020-07-06         BBL
55  2020-06-22 2020-07-06  SHARdamOTR
169 2020-06-22 2020-07-06   BALAmineS
12  2020-06-22 2020-06-25   KIRLOSIND
284 2020-06-22 2020-07-06  NATcopHARM
236 2020-06-23 2020-07-06   QUICKHEAL
69  2020-06-23 2020-07-07        HMVL
220 2020-06-24 2020-07-08      ASTRAL
42  2020-06-26 2020-07-10     MENONBE
260 2020-07-06 2020-07-16         BSE
105 2020-07-07 2020-07-20   GARFIBRES
35  2020-07-16 2020-07-30       SATIA
218 2020-07-17 2020-07-31   THYROCARE
8   2020-08-04 2020-08-07    CREATIVE

输出应该可以让我计算出任何一天之间持有的最大股票数量

例如,从以上数据中我们可以看到2020-06-15我们的投资组合中有4只股票。因此,如果最大持有数量为4,则输出显示4。

解决方法

在SQL中,您可以通过前后检查来进行处理,然后进行累加求和:

with io as (
      select entry_time as dt,1 as inc
      from t
      union all
      select exit_time  + interval 1 day as dt,-1
      from t
     )
select dt,sum(inc) as change_on_day,sum(sum(inc)) over (order by dt) as active_on_day
from io
group by dt
order by active_on_day desc
limit 1;

Here是db 小提琴。

,

您可以:

  1. entry_time为单位,对所有exit_time的数量进行分组,然后将数据框自身合并,以计算出要减去的值(每种{{1} })。
  2. 但是,您不能仅从行号中减去该特定行的值(行号为 entry_time,但是您需要像我在第一行中所做的那样首先执行df.index + 1码)。然后,您需要使用df = df.reset_index(drop=True)减去累计和。

.cumsum()

然后,要根据每个df = df.reset_index(drop=True) s = (pd.merge(df,df[['exit_time']].assign(exit_count=df.groupby('exit_time')['entry_time'].transform('count')) .rename({'exit_time':'entry_time'},axis= 1) .drop_duplicates(subset='entry_time'),on='entry_time',how='left'))['exit_count'].fillna(0) df['COUNT'] = df.index + 1 - s.cumsum() df Out[1]: entry_time exit_time stk COUNT 0 2020-06-10 2020-06-23 SHANKARA 1.0 1 2020-06-11 2020-06-25 PNCINFRA 2.0 2 2020-06-11 2020-06-25 DYNAMATECH 3.0 3 2020-06-15 2020-06-29 MANINDS 4.0 4 2020-06-16 2020-06-24 ASTERDM 5.0 5 2020-06-18 2020-06-29 JKPAPER 6.0 6 2020-06-18 2020-06-23 SOMANYCERA 7.0 7 2020-06-18 2020-06-25 EVERESTIND 8.0 8 2020-06-18 2020-07-01 JSLHISAR 9.0 9 2020-06-19 2020-06-25 IBVENTURES 10.0 10 2020-06-19 2020-07-02 FIEMIND 11.0 11 2020-06-19 2020-06-23 SUPRAJIT 12.0 12 2020-06-19 2020-07-01 NRBBEARING 13.0 13 2020-06-19 2020-06-24 SPAL 14.0 14 2020-06-19 2020-06-29 DALBHARAT 15.0 15 2020-06-22 2020-07-06 SANGINITA 16.0 16 2020-06-22 2020-07-06 BBL 17.0 17 2020-06-22 2020-07-06 SHARDAMOTR 18.0 18 2020-06-22 2020-07-06 BALAMINES 19.0 19 2020-06-22 2020-06-25 KIRLOSIND 20.0 20 2020-06-22 2020-07-06 NATCOPHARM 21.0 21 2020-06-23 2020-07-06 QUICKHEAL 19.0 22 2020-06-23 2020-07-07 HMVL 17.0 23 2020-06-24 2020-07-08 ASTRAL 16.0 24 2020-06-26 2020-07-10 MENONBE 17.0 25 2020-07-06 2020-07-16 BSE 12.0 26 2020-07-07 2020-07-20 GARFIBRES 12.0 27 2020-07-16 2020-07-30 SATIA 12.0 28 2020-07-17 2020-07-31 THYROCARE 13.0 29 2020-08-04 2020-08-07 CREATIVE 14.0 的最大库存进行汇总,可以使用entry_time

.groupby()