我正在使用np.where
对金融数据进行算法交易回测。
假设我有一个简单的数据框,该数据框按日期和一天中的几分钟索引,作为要素A和要素B的单元格中具有任意值的列,以用作测试条件。
column_df
300 310 320 330 340 A B pred_min1 pred_min2
2010-04-28 9 10 11 12 13 5 2 330 300
2010-04-29 19 20 21 22 23 5 2 330 300
2010-04-30 29 30 31 32 33 1 7 340 330
2010-04-31 39 40 41 42 43 1 7 340 330
我可以根据A和B列的具体情况计算一天的收益,
import pandas as pd
import numpy as np
column_df['return'] = np.where(column_df['A']<column_df['B'],
column_df['320']-column_df['310'],
column_df['320']-column_df['300'])
这将创建一个新的返回列:
300 310 320 330 340 A B pred_min1 pred_min2 return
2010-04-28 9 10 11 12 13 5 2 330 300 2
2010-04-29 19 20 21 22 23 5 2 330 300 2
2010-04-30 29 30 31 32 33 1 7 340 330 1
2010-04-31 39 40 41 42 43 1 7 340 330 1
现在,如果我添加两列预计要在每天进行交易的分钟,则为pred_min1和pred_min2。
如何测试特定条件A和B,但如何动态使用存储在pred_min1和pred_min2中的列标签,使用存储在这些单元格值代表当天的列中的值来计算当天的收益? 本质上,我希望有一种灵活的方式来选择列,以基于pred_min1和pred_min2中发现的标签,以矢量方式在不使用循环的情况下按行逐元素地进行计算。
我尝试过:
column_df['return'] = np.where(column_df['A']<column_df['B'],
column_df['320']-column_df['310'],
column_df[str(column_df.loc[:,'pred_min1'].values)]-column_df['300'])
有错误:
KeyError: '[330 330 340 340]'
我也尝试过:
column_df['return'] = np.where(column_df['A']<column_df['B'], column_df['320']-column_df['310'], column_df[str(column_df.loc[:,'pred_min1'])]-column_df['300'])
有错误:
KeyError: '2019-04-28 330\n2019-04-29 330\n2019-04-30 340\n2019-04-31 340\nName: pred_min1, dtype: int64'
和
column_df['return'] = np.where(column_df['A']<column_df['B'], column_df['320']-column_df['310'], column_df[str(column_df.pred_min1)]-column_df['300'])
有错误:
KeyError: '2019-04-28 330\n2019-04-29 330\n2019-04-30 340\n2019-04-31 340\nName: pred_min1, dtype: int64'
感谢您的帮助。 谢谢
答案 0 :(得分:0)
您应该尝试在apply
方法中定义用户定义的函数
def func(r):
if r['A'] < r['B']:
r['return']= r['320']-r['310']
else:
r['return'] = r[str(r['pred_min1'])] - r['300']
return r
df = df.apply(func, axis=1)