您好,很抱歉再次询问这个问题,但我无法在这个问题的所有以前版本中找到解决方案。
我正在尝试对 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
任何帮助将不胜感激。
我认为我已经解决了我的问题,但我想听听任何人对我的解决方法的想法。
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