Pandas 数据帧计算引用前一行

问题描述 投票:0回答:1

您好,很抱歉再次询问这个问题,但我无法在这个问题的所有以前版本中找到解决方案。

我正在尝试对 pandas 计算进行矢量化,其中前一行用作值并受到相同计算的影响。

我正在对交易策略进行回溯测试,目前我有一个包含所有交易规模、价格变动等的 df。当风险超过最大风险时,我试图减少我的交易规模。

交易开放 交易号 交易规模 停止 关闭 风险 最大风险
正确 1 100% 80 100 20.00% 20%
1 100% 80 120 33.33% 20%
1 100% 80 140 42.86% 20%
1 100% 80 160 50.00% 20%

我尝试创建一个计算,当“风险”超过“最大风险”时,“交易规模”就会减少,并且接下来的计算将使用新的“交易规模”。

期望的结果

交易开放 交易号 交易规模 停止 关闭 风险 最大风险 减少布尔值 减少
正确 1 100% 80 100 20.00% 20% 错误 0%
1 100% 80 120 33.33% 20% 正确 40%
1 60% 80 140 25.71% 20% 正确 22%
1 46.8% 80 160 23.40% 20% 正确 15%

我当前的代码看起来与此类似,这是不正确的,因为“Trade_size”的循环计算导致了错误的风险计算。

d = {'Trade Open': [True, False, False, False,], 'Trade number': [1]*4, 'Trade_size': [100]*4, 'close':[100,120,140,160],'stop': [80]*4, 'max_risk': [20]*4}

df = pd.DataFrame(data=d)
df['risk'] = (df.close - df.stop)/ df.close * df.Trade_size
df['reduction_boolean'] = df.risk > df.max_risk
df['reduction'] = 0 
df.loc[df['reduction_boolean'], 'reduction'] = 1 - (df.max_risk / df.risk)

df.loc[df['reduction_boolean'].shift() == True, 'Trade_size'] = df.Trade_size * (1-df.reduction.shift())
df

任何帮助将不胜感激。

pandas dataframe
1个回答
0
投票

我认为我已经解决了我的问题,但我想听听任何人对我的解决方法的想法。

d = {'Trade Open': [True, False, False, False,False], 'Trade number': [1]*5, 'Trade_size': [100]*5, 'close':[100,120,140,160,120],'stop': [80]*5, 'max_risk': [20]*5}

df = pd.DataFrame(data=d)

df.loc[ (((df['Trade_size'].shift() * ((df.close - df.stop)/df.close))) > df.max_risk), 'max_Trade_size'] = df.max_risk / (df['Trade_size'].shift() * ((df.close - df.stop)/df.close)) * 100

df.loc[df.max_Trade_size.shift() < df.Trade_size, 'Trade_size'] = df.max_Trade_size.shift() 

df['risk'] = (df.close - df.stop)/ df.close * df.Trade_size
df['reduction_boolean'] = df.risk > df.max_risk

df['reduction'] = (df['Trade_size'].shift() - df['Trade_size']) / df['Trade_size'].shift()
df.loc[df['reduction'] < 0 , 'reduction'] = 0
df['reduction'] = df['reduction'].shift(-1)
df.loc[df['reduction'].isna(), 'reduction'] = 0 
df
© www.soinside.com 2019 - 2024. All rights reserved.