Python 如何在熊猫数据帧列中获得每天的滚动损益?
概述Python 如何在熊猫数据帧列中获得每天的滚动损益?,python,pandas,dataframe,Python,Pandas,Dataframe,概述 我正在重新测试交易策略,我希望能够根据策略的表现,每天看到盈亏 方法 我存储的股票数据带有“NoTrade”、“Win”和“Loss”等交易信号。不交易意味着没有交易,胜利意味着交易,它是有利可图的,而损失意味着交易,但它是无利可图的。我写了一个循环来检查是否有信号。如果有赢家或输家,那么我的账户余额将更新以反映赢家或输家 数据帧 WinLoss ProfitAndLossPofChg AccountBalance D 2010-12-08 NoTrade
我正在重新测试交易策略,我希望能够根据策略的表现,每天看到盈亏 方法
我存储的股票数据带有“NoTrade”、“Win”和“Loss”等交易信号。不交易意味着没有交易,胜利意味着交易,它是有利可图的,而损失意味着交易,但它是无利可图的。我写了一个循环来检查是否有信号。如果有赢家或输家,那么我的账户余额将更新以反映赢家或输家 数据帧
WinLoss ProfitAndLossPofChg AccountBalance
D
2010-12-08 NoTrade 0.000000 2000.0
2010-12-09 NoTrade 0.000000 2000.0
2010-12-10 NoTrade 0.000000 2000.0
2010-12-13 NoTrade 0.000000 2000.0
2010-12-14 NoTrade 0.000000 2000.0
2010-12-15 Loss -0.030842 2000.0
2010-12-16 Win 0.000539 2000.0
2010-12-17 NoTrade 0.000000 2000.0
2010-12-20 NoTrade 0.000000 2000.0
2010-12-21 NoTrade 0.000000 2000.0
2010-12-22 Win 0.014686 2000.0
2010-12-23 NoTrade 0.000000 2000.0
2010-12-27 NoTrade 0.000000 2000.0
2010-12-28 Loss -0.006190 2000.0
2010-12-29 NoTrade 0.000000 2000.0
2010-12-30 NoTrade 0.000000 2000.0
2010-12-31 NoTrade 0.000000 2000.0
2011-01-03 Loss -0.055686 2000.0
2011-01-04 Loss -0.025471 2000.0
2011-01-05 Loss -0.051420 2000.0
2011-01-06 Loss -0.000299 2000.0
2011-01-07 NoTrade 0.000000 2000.0
2011-01-10 NoTrade 0.000000 2000.0
2011-01-11 Win 0.003719 2000.0
2011-01-12 NoTrade 0.000000 2000.0
2011-01-13 Loss -0.041218 2000.0
2011-01-14 Win 0.033365 2000.0
2011-01-18 Win 0.018628 2000.0
2011-01-19 NoTrade 0.000000 2000.0
2011-01-20 Loss -0.020820 2000.0
WinLoss ProfitAndLossPofChg AccountBalance
D
2010-12-08 NoTrade 0.000000 0.0
2010-12-09 NoTrade 0.000000 0.0
2010-12-10 NoTrade 0.000000 0.0
2010-12-13 NoTrade 0.000000 0.0
2010-12-14 NoTrade 0.000000 0.0
2010-12-15 Loss -0.030842 -0.0
2010-12-16 Win 0.000539 0.0
2010-12-17 NoTrade 0.000000 0.0
2010-12-20 NoTrade 0.000000 0.0
2010-12-21 NoTrade 0.000000 0.0
2010-12-22 Win 0.014686 0.0
2010-12-23 NoTrade 0.000000 0.0
2010-12-27 NoTrade 0.000000 0.0
2010-12-28 Loss -0.006190 -0.0
2010-12-29 NoTrade 0.000000 0.0
2010-12-30 NoTrade 0.000000 0.0
2010-12-31 NoTrade 0.000000 0.0
2011-01-03 Loss -0.055686 -0.0
2011-01-04 Loss -0.025471 -0.0
2011-01-05 Loss -0.051420 -0.0
2011-01-06 Loss -0.000299 -0.0
2011-01-07 NoTrade 0.000000 0.0
2011-01-10 NoTrade 0.000000 0.0
2011-01-11 Win 0.003719 0.0
2011-01-12 NoTrade 0.000000 0.0
2011-01-13 Loss -0.041218 -0.0
2011-01-14 Win 0.033365 0.0
2011-01-18 Win 0.018628 0.0
2011-01-19 NoTrade 0.000000 0.0
2011-01-20 Loss -0.020820 -0.0
代码
def ProfitAndLoss(DataFrame):
df = DataFrame
for i in df.WinLoss:
if i == "NoTrade":
df.AccountBalance = df.AccountBalance.shift(-1)
elif i == "Win":
df.AccountBalance = df.AccountBalance.shift(-1) * df.ProfitAndLossPofChg
elif i == "Loss":
df.AccountBalance = df.AccountBalance.shift(-1) * df.ProfitAndLossPofChg
输出
WinLoss ProfitAndLossPofChg AccountBalance
D
2010-12-08 NoTrade 0.000000 2000.0
2010-12-09 NoTrade 0.000000 2000.0
2010-12-10 NoTrade 0.000000 2000.0
2010-12-13 NoTrade 0.000000 2000.0
2010-12-14 NoTrade 0.000000 2000.0
2010-12-15 Loss -0.030842 2000.0
2010-12-16 Win 0.000539 2000.0
2010-12-17 NoTrade 0.000000 2000.0
2010-12-20 NoTrade 0.000000 2000.0
2010-12-21 NoTrade 0.000000 2000.0
2010-12-22 Win 0.014686 2000.0
2010-12-23 NoTrade 0.000000 2000.0
2010-12-27 NoTrade 0.000000 2000.0
2010-12-28 Loss -0.006190 2000.0
2010-12-29 NoTrade 0.000000 2000.0
2010-12-30 NoTrade 0.000000 2000.0
2010-12-31 NoTrade 0.000000 2000.0
2011-01-03 Loss -0.055686 2000.0
2011-01-04 Loss -0.025471 2000.0
2011-01-05 Loss -0.051420 2000.0
2011-01-06 Loss -0.000299 2000.0
2011-01-07 NoTrade 0.000000 2000.0
2011-01-10 NoTrade 0.000000 2000.0
2011-01-11 Win 0.003719 2000.0
2011-01-12 NoTrade 0.000000 2000.0
2011-01-13 Loss -0.041218 2000.0
2011-01-14 Win 0.033365 2000.0
2011-01-18 Win 0.018628 2000.0
2011-01-19 NoTrade 0.000000 2000.0
2011-01-20 Loss -0.020820 2000.0
WinLoss ProfitAndLossPofChg AccountBalance
D
2010-12-08 NoTrade 0.000000 0.0
2010-12-09 NoTrade 0.000000 0.0
2010-12-10 NoTrade 0.000000 0.0
2010-12-13 NoTrade 0.000000 0.0
2010-12-14 NoTrade 0.000000 0.0
2010-12-15 Loss -0.030842 -0.0
2010-12-16 Win 0.000539 0.0
2010-12-17 NoTrade 0.000000 0.0
2010-12-20 NoTrade 0.000000 0.0
2010-12-21 NoTrade 0.000000 0.0
2010-12-22 Win 0.014686 0.0
2010-12-23 NoTrade 0.000000 0.0
2010-12-27 NoTrade 0.000000 0.0
2010-12-28 Loss -0.006190 -0.0
2010-12-29 NoTrade 0.000000 0.0
2010-12-30 NoTrade 0.000000 0.0
2010-12-31 NoTrade 0.000000 0.0
2011-01-03 Loss -0.055686 -0.0
2011-01-04 Loss -0.025471 -0.0
2011-01-05 Loss -0.051420 -0.0
2011-01-06 Loss -0.000299 -0.0
2011-01-07 NoTrade 0.000000 0.0
2011-01-10 NoTrade 0.000000 0.0
2011-01-11 Win 0.003719 0.0
2011-01-12 NoTrade 0.000000 0.0
2011-01-13 Loss -0.041218 -0.0
2011-01-14 Win 0.033365 0.0
2011-01-18 Win 0.018628 0.0
2011-01-19 NoTrade 0.000000 0.0
2011-01-20 Loss -0.020820 -0.0
问题正如你所看到的,我的账户余额都是零;未显示初始账户余额为$2000.00的滚动损益。在我的函数中,我计算出,如果没有交易,那么只需获取前几天的余额,并使其成为今天的余额,或者如果是赢或输的交易,则获取前几天的余额,并将其乘以当前的损益。我想这将显示一个连续的利润和亏损总额,但我想我想错了。这是一个很长的路要说,我不知道 不需要在数据帧上循环。将
shift
应用于pd系列“df.AccountBalance”将创建另一个系列。试试这个:
df['AccountBalance'] += df['AccountBalance'].shift(-1) * df['ProfitAndLossPofChg']
不需要在数据帧上循环。将
shift
应用于pd系列“df.AccountBalance”将创建另一个系列。试试这个:
df['AccountBalance'] += df['AccountBalance'].shift(-1) * df['ProfitAndLossPofChg']
输出:
WinLoss ProfitAndLossPofChg AccountBalance
D
2010-12-08 NoTrade 0.000000 2000.000000
2010-12-09 NoTrade 0.000000 2000.000000
2010-12-10 NoTrade 0.000000 2000.000000
2010-12-13 NoTrade 0.000000 2000.000000
2010-12-14 NoTrade 0.000000 2000.000000
2010-12-15 Loss -0.030842 1938.316000
2010-12-16 Win 0.000539 1939.360752
2010-12-17 NoTrade 0.000000 1939.360752
2010-12-20 NoTrade 0.000000 1939.360752
2010-12-21 NoTrade 0.000000 1939.360752
2010-12-22 Win 0.014686 1967.842204
2010-12-23 NoTrade 0.000000 1967.842204
2010-12-27 NoTrade 0.000000 1967.842204
2010-12-28 Loss -0.006190 1955.661261
2010-12-29 NoTrade 0.000000 1955.661261
2010-12-30 NoTrade 0.000000 1955.661261
2010-12-31 NoTrade 0.000000 1955.661261
2011-01-03 Loss -0.055686 1846.758308
2011-01-04 Loss -0.025471 1799.719527
2011-01-05 Loss -0.051420 1707.177949
2011-01-06 Loss -0.000299 1706.667503
2011-01-07 NoTrade 0.000000 1706.667503
2011-01-10 NoTrade 0.000000 1706.667503
2011-01-11 Win 0.003719 1713.014599
2011-01-12 NoTrade 0.000000 1713.014599
2011-01-13 Loss -0.041218 1642.407564
2011-01-14 Win 0.033365 1697.206492
2011-01-18 Win 0.018628 1728.822055
2011-01-19 NoTrade 0.000000 1728.822055
2011-01-20 Loss -0.020820 1692.827979
输出:
WinLoss ProfitAndLossPofChg AccountBalance
D
2010-12-08 NoTrade 0.000000 2000.000000
2010-12-09 NoTrade 0.000000 2000.000000
2010-12-10 NoTrade 0.000000 2000.000000
2010-12-13 NoTrade 0.000000 2000.000000
2010-12-14 NoTrade 0.000000 2000.000000
2010-12-15 Loss -0.030842 1938.316000
2010-12-16 Win 0.000539 1939.360752
2010-12-17 NoTrade 0.000000 1939.360752
2010-12-20 NoTrade 0.000000 1939.360752
2010-12-21 NoTrade 0.000000 1939.360752
2010-12-22 Win 0.014686 1967.842204
2010-12-23 NoTrade 0.000000 1967.842204
2010-12-27 NoTrade 0.000000 1967.842204
2010-12-28 Loss -0.006190 1955.661261
2010-12-29 NoTrade 0.000000 1955.661261
2010-12-30 NoTrade 0.000000 1955.661261
2010-12-31 NoTrade 0.000000 1955.661261
2011-01-03 Loss -0.055686 1846.758308
2011-01-04 Loss -0.025471 1799.719527
2011-01-05 Loss -0.051420 1707.177949
2011-01-06 Loss -0.000299 1706.667503
2011-01-07 NoTrade 0.000000 1706.667503
2011-01-10 NoTrade 0.000000 1706.667503
2011-01-11 Win 0.003719 1713.014599
2011-01-12 NoTrade 0.000000 1713.014599
2011-01-13 Loss -0.041218 1642.407564
2011-01-14 Win 0.033365 1697.206492
2011-01-18 Win 0.018628 1728.822055
2011-01-19 NoTrade 0.000000 1728.822055
2011-01-20 Loss -0.020820 1692.827979
我读到“从不在数据帧上使用循环”,但我就是想不出来你的代码是否有效,但它并没有给我一个运行总数,即如果我在第一笔交易中赚10%,我的账户余额应该是2200.00,然后在第二笔交易中,我又赚了10%,应该是2420.00。我刚得到两个2200@ZacAttack我在下面提供的答案应该会产生你想要的结果。这对@Zacatack的案例不起作用。账户余额在每次计算中都会发生变化。@Zacatack在这种情况下,是的,您需要在数据帧上循环不幸的是,我读到永远不要在数据帧上使用循环,但我无法计算出来,我认为您的代码工作正常,但它没有给我一个运行总数,即如果我在第一次交易中赚了10%,我的账户余额应该是2200.00,然后在我的第二笔交易中,我又赚了10%,应该是2420.00。我刚得到两个2200@ZacAttack我在下面提供的答案应该会产生你想要的结果。这对@Zacatack的案例不起作用。账户余额每次计算都会发生变化。@Zacatack在这种情况下,是的,您将需要在数据帧上循环不幸的是您的代码工作,但速度似乎是一个问题,但它工作,所以我将使用它您的代码工作,但速度似乎是一个问题,但它工作,所以我将使用它