我正在尝试根据给定的购买日期测试不同的卖出简单移动平均线标准。
我有一个如下的购买数据数据库(df_buy)。我想填写NaN
值。(FCU = 首次收盘价)
Symbol Time buy_price LOD date_FCU_10dMA price_FCU_10dMA
0 AMD 2019-12-12 09:36:00 39.52 27.43 NaN NaN
1 AMD 2020-01-16 09:33:00 49.21 27.43 NaN NaN
2 BITF 2021-08-03 09:47:00 4.26 2.81 NaN NaN
3 DOCN 2021-06-14 09:32:00 41.76 35.35 NaN NaN
4 NVDA 2020-07-29 09:38:00 416.81 169.32 NaN NaN
5 NVDA 2020-09-25 10:34:00 499.72 169.32 NaN NaN
6 UPST 2021-02-09 09:32:00 76.83 22.61 NaN NaN
7 UPST 2021-03-18 09:32:00 88.56 22.61 NaN NaN
我有另一个包含每日库存数据的数据库,如下所示(df_day)
Symbol Time Close LOD 10MA 20MA
2722244 AEHR 2019-11-25 16:00:00 1.90 1.29 2.005 1.8870
2722289 AEHR 2019-11-26 16:00:00 1.92 1.29 2.032 1.8925
2722383 AEHR 2019-12-02 16:00:00 1.88 1.29 2.056 1.8985
2722435 AEHR 2019-12-03 16:00:00 1.88 1.29 2.046 1.8995
2722471 AEHR 2019-12-04 16:00:00 1.89 1.29 2.020 1.9055
2722569 AEHR 2019-12-06 16:00:00 1.93 1.29 1.993 1.9140
根据该策略,首次收盘必须在买入日期后至少 2 天。
df_filt2['price_FCU_10dMA'] = (df_buy['buy_price'] > df_day['20MA'])
Error: ValueError: Can only compare identically-labeled Series objects
for i, row in df_buy.iterrows():
# drop unlisted symbols
filt1 = (df_day['Symbol'] != df_buy['Symbol'].loc[i])
df_filt1 = df_day.drop(index=df_day[filt1].index)
# drop trades from before buy date + 2
filt2 = (pd.to_datetime(df_day['Time']) < (pd.to_datetime(df_buy['Time'].loc[i] + pd.to_timedelta(2, unit='d'))))
df_filt2 = df_filt1.drop(index=df_filt1[filt2].index)
# sort values
df_filt2.sort_values(by=['Symbol', 'Time'], inplace=True)
# drop rows where Close is above the 10MA
df_filt2['price_FCU_10dMA'] = (df_buy['buy_price'] > df_day['20MA'])
filt3 = (df_filt2['price_FCU_10dMA'] == False)
# trail_sell = df_filt2[filt3].loc[10]
df_buy['price_FCU_10dMA'].loc[i] = df_filt2.loc[filt3, 'Close'].iloc[0] # returns the single value of first close under 10ma
df_buy['date_FCU_10dMA'].loc[i] = df_filt2.loc[filt3, 'Time'].iloc[0] # returns the single value of first close under 10ma