1

我有一个带有 ohlc 数据的股票熊猫数据框,我正在使用 btalib(技术分析)包添加一些指标。我现在拥有的数据框与此类似,但每只股票有 200 行(QQQ 控股前 500 只股票)。

symbol        time    open  ...   close    volume
AAPL    2019-10-28  247.42  ...  249.04  22187260
AAPL    2019-10-29  248.97  ...  243.29  32725739
AAPL    2019-10-30  244.76  ...  243.29  25443913
AAPL    2019-10-31  247.24  ...  248.84  29688327
AAPL    2019-11-01  249.54  ...  255.84  33985331

SMA 是使用前几天收盘价的股票数据计算得出的。因此,如果我用于 SMA 的时间段是 20 天,收盘价(基本上)只是过去 20 天的平均值,如下所示

sma20 = btalib.sma(df, period=20) # instantiate sma20 w/ period of 20 days

但是,我对每只股票都有 200 天的数据(因为稍后我将使用 200 天作为单独的列值),并且每次数据框中的符号列更改时,我都需要 SMA 计算来重置。这是我遇到麻烦的部分。

这是它应该如何工作的

df['sma20'] = sma20.df

print(df[200:203])

输出:

sma20 的前 20 行为空,因为需要它们来计算值。这部分按预期工作。但是,当股票代码从 AAPL 切换到 ADBE 时,sma20 的值会继续数据框中的前 20 条记录,这些记录是 AAPL 的记录。我需要他们在这一点上重置。

record# symbol        time     open  ...    volume    sma20
200     AAPL  2020-08-13  457.720  ...     48325440   412.80320
201     ADBE  2019-10-28  271.580  ...      2002911   407.11320
202     ADBE  2019-10-29  271.680  ...      1483643   401.01470

我想过为此创建自己的函数,但是一旦我添加了更复杂的指标,这将变得非常乏味,我觉得使用库来帮助我更容易。

这是我现在要做的:

我有一symbol_shifted列基本上只是将所有符号推到一个位置。我的想法是我可以检查符号是否等于这个符号移位列。如果不是,那么计算应该重置。

以下是符号移位的外观:

record# symbol symbol_shifted      sma20
200     AAPL   AAPL            412.80320
201     ADBE   AAPL            407.11320
202     ADBE   ADBE            401.01470

这是我尝试使用的代码:

for i in df:
    while True:
        if df['symbol']==df['symbol_shifted']:
            df['sma20']=sma20.df
        else:
            continue

我已经尝试过多种类似的逻辑(例如,在函数中使用上述逻辑与 pandas 应用,更改我索引记录的方式),但我似乎无法让它工作。在记录号 201 处,符号 != symbol_shifted。所以当 if 语句看到这种情况时,无限循环应该重置并重新开始计算。我不确定为什么这不起作用,但如果有人愿意提供反馈或想法,我会很高兴!这是我目前收到的错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
4

0 回答 0