我如何每天在Pandas DataFrame列中获得滚动利润和损失



概述
我正在返回测试交易策略,我希望能够根据策略的绩效每天看到损益。

方法
我正在用交易信号存储库存数据,上面写着" Notrade"," Win"one_answers"损失"。Notrade意味着没有进行贸易,胜利意味着进行贸易,这是有利可图的,损失意味着贸易却是无利可图的。我写了一个循环以检查是否有信号。如果有胜利或损失,那么我的帐户余额将更新以反映收益或损失。

dataframe

            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

代码

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             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']
def ProfitAndLoss(df):
    df = df.copy()
    df = df.reset_index()
    for index,row in df.iterrows():
        if index == 0:
            continue
        if row['WinLoss'] == "NoTrade":
            df['AccountBalance'][index] = df['AccountBalance'][index-1]
        elif row['WinLoss'] in ["Win", "Loss"]:
            df['AccountBalance'][index] = df['AccountBalance'][index-1] *  (1 + df['ProfitAndLossPofChg'][index])
    return df
print(ProfitAndLoss(df).set_index('D'))

输出:

            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

最新更新