我有一个带有 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().