按日期分隔数据,然后应用函数



所以我有一个包含3000+行的大表,它保存了一堆交易信息,如开盘价,收盘价等。

其中一列是Datetime,这一列中的一个条目将是:2022-03-03 09:30:00-05:00。每一行都比前一行晚5分钟,所以在这种情况下,我刚刚放入的下一行将是2022-03-03 09:35:00-05:00

我在一个单独的文件中创建了一个函数,用于计算一个名为RSI的值(这意味着什么并不重要):

def RSI(p,q,window=10,signal_type='buy only'):


gains = list(filter(lambda x: (x > 0), (p-q)))
total_gains = sum(gains)
avg_gain= total_gains/len(gains)

loss = list(filter(lambda x: (x < 0), (p-q)))
total_loss = (sum(loss))*-1
avg_loss= total_loss/len(loss)

RS=avg_gain/avg_loss
rsi=100-(100/(1+RS))
return (rsi)

这是我用来访问保存所有信息的excel文件的代码和我用来创建汇总表的代码:

dat = pd.read_csv('AMD_5m.csv',index_col='Datetime',parse_dates=['Datetime'],
date_parser=lambda x: pd.to_datetime(x, utc=True))
dates = backtest.get_dates(dat.index)
#create a summary table
cols = ['Num. Obs.', 'Num. Trade', 'PnL', 'Win. Ratio','RSI'] #add addtional fields if necessary
summary_table = pd.DataFrame(index = dates, columns=cols)

我想创建某种按日期分隔大数据集的代码,因此它将收集来自例如2022-03-03的所有数据,然后应用我的函数来计算当天的RSI。

我将把所有的代码添加到汇总表中,这样你就可以看到我使用的格式,或者如果你只是需要它,因为我没有很好地解释:

dat = pd.read_csv('AMD_5m.csv',index_col='Datetime',parse_dates=['Datetime'],
date_parser=lambda x: pd.to_datetime(x, utc=True))
dates = backtest.get_dates(dat.index)
#create a summary table
cols = ['Num. Obs.', 'Num. Trade', 'PnL', 'Win. Ratio','Avg Opening','Avg Closing','RSI'] #add addtional fields if necessary
summary_table = pd.DataFrame(index = dates, columns=cols)
# loop backtest by dates
for d in dates:
this_dat = dat.loc[dat.index.date==d]
#find the number of observations in date d
summary_table.loc[d]['Num. Obs.'] = this_dat.shape[0] 
#get trading (i.e. position holding) signals
signals = backtest.SMA(this_dat['Close'].values, window=10)
#find the number of trades in date d
summary_table.loc[d]['Num. Trade'] = np.sum(np.diff(signals)==1) 
#find PnLs for 100 shares
shares = 100
PnL = -shares*np.sum(this_dat['Close'].values[1:]*np.diff(signals))
if np.sum(np.diff(signals))>0:
#close position at market close
PnL += shares*this_dat['Close'].values[-1]
summary_table.loc[d]['PnL'] = PnL
#find the win ratio
ind_in = np.where(np.diff(signals)==1)[0]+1
ind_out = np.where(np.diff(signals)==-1)[0]+1
num_win = np.sum((this_dat['Close'].values[ind_out]-this_dat['Close'].values[ind_in])>0)
if summary_table.loc[d]['Num. Trade']!=0:
summary_table.loc[d]['Win. Ratio'] = 1. *num_win/summary_table.loc[d]['Num. Trade']
dat['gain']=(dat['Close']/dat['Open'])-1
this_dat['gain']=(this_dat['Close']/this_dat['Open'])-1

summary_table.loc[d]['RSI'] = backtest.RSI(this_dat['Close'],this_dat['Open']) 
#This only applies the function on one day, not all the days in the dataset#

summary_table.to_csv('AMD_5m_results.csv',index=True)

如果有人知道我该怎么做,请告诉我。

(注意:如果可能的话,我想保持一切原样,如果你需要,例如删除Datetime的时间部分,那么请做一个新的变量/函数来做到这一点,因为我不应该改变我提供的代码,这是for d in dates之前的一切)

我不确定我是否正确理解了您的问题,但您可以在新列中提取时间戳的日期:

df['dates'] = df['Datetime'].dt.date

如果你想每天应用一个函数,你可以按这个列分组:

df_result = df.groupby(['date']).apply(RSI,p=42,q=42)

希望这对你有帮助:D

相关内容

最新更新