有没有一种方法可以在python中矢量化Renko计算?

2024-06-07 10:50:27 发布

您现在位置:Python中文网/ 问答频道 /正文

好的,现在我使用块中的df.iterrows()循环每一分钟,并与之前的Renko close进行比较。然而,这需要很长时间。我一直在想,有没有一种方法可以更快地进行矢量化和回溯测试。因为我将对刻度数据进行回溯测试,这意味着数百万行

The raw csv

Renko csv

下面是我一直在使用的for循环。我是这方面的新手,所以请原谅我编写的代码中的任何低效之处,并以任何可能的方式帮助我

def trend(box, df, lasttrend, lastrenko):
for rows in df.itertuples():
    index = rows.Index
    print(index)
    df.loc[index, 'renko close'] = lastrenko
    if index == 0:
        df.loc[index, 'renko close'] = df.loc[index, 'close']
        df.loc[index, 'trend'] = 'S'
        lasttrend = 'S'
        lastrenko = df.loc[index, 'renko close']
        print('Trend start: S', lastrenko, '\n-------------------------------------')
        continue
    if df.loc[index, 'close'] - lastrenko >= box:
        if lasttrend == 'R':
            if df.loc[index, 'close'] - lastrenko >= 2*box:
                df.loc[index, 'renko close'] = lastrenko + (2*box)
                df.loc[index, 'deviation'] = abs(df.loc[index, 'close'] - df.loc[index, 'renko close'])
                df.loc[index, 'deviation boxes'] = df.loc[index, 'deviation']/box
                df.loc[index, 'trend'] = 'G'
                if df.loc[index,'deviation boxes'] >= 1:
                    df.loc[index, 'renko close'] = df.loc[index, 'renko close'] + (math.floor(df.loc[index,'deviation boxes']))*(box)
                lasttrend = 'G'
                lastrenko = df.loc[index, 'renko close']
                print('Trend change: R - G', lastrenko, '\n-------------------------------------')
        elif lasttrend == 'G' or lasttrend == 'S':
            df.loc[index, 'renko close'] = lastrenko + (box)
            df.loc[index, 'deviation'] = abs(df.loc[index, 'close'] - df.loc[index, 'renko close'])
            df.loc[index, 'deviation boxes'] = df.loc[index, 'deviation']/box
            df.loc[index, 'trend'] = 'G'
            if df.loc[index, 'deviation boxes'] >= 1:
                df.loc[index, 'renko close'] = df.loc[index, 'renko close'] + (math.floor(df.loc[index, 'deviation boxes']))*(box)
            lasttrend = 'G'
            lastrenko = df.loc[index, 'renko close']
            print('Trend change: G - G', lastrenko, '\n-------------------------------------')
        else:
            df.loc[index, 'deviation'] = abs(df.loc[index, 'close'] - df.loc[index, 'renko close'])
            df.loc[index, 'deviation boxes'] = df.loc[index, 'deviation']/box
            df.loc[index, 'trend'] = 'N'
            print('Trend change: R - N', lastrenko, '\n-------------------------------------')
    elif df.loc[index, 'close'] - lastrenko <= -box:
        if lasttrend == 'G':
            if df.loc[index, 'close'] - lastrenko <= -2*box:
                df.loc[index, 'renko close'] = lastrenko - (2*box)
                df.loc[index, 'deviation'] = abs(df.loc[index, 'close'] - df.loc[index, 'renko close'])
                df.loc[index, 'deviation boxes'] = df.loc[index, 'deviation']/box
                df.loc[index, 'trend'] = 'R'
                if df.loc[index,'deviation boxes'] >= 1:
                    df.loc[index, 'renko close'] = df.loc[index, 'renko close'] - (math.floor(df.loc[index,'deviation boxes']))*(box)
                lasttrend = 'R'
                lastrenko = df.loc[index, 'renko close']
                print('Trend change: G - R', lastrenko, '\n-------------------------------------')
        elif lasttrend == 'R' or lasttrend == 'S':
            df.loc[index, 'renko close'] = lastrenko - (box)
            df.loc[index, 'deviation'] = abs(df.loc[index, 'close'] - df.loc[index, 'renko close'])
            df.loc[index, 'deviation boxes'] = df.loc[index, 'deviation']/box
            df.loc[index, 'trend'] = 'R'
            if df.loc[index,'deviation boxes'] >= 1:
                df.loc[index, 'renko close'] = df.loc[index, 'renko close'] - (math.floor(df.loc[index,'deviation boxes']))*(box)
            lasttrend = 'R'
            lastrenko = df.loc[index, 'renko close']
            print('Trend change: R - R', lastrenko, '\n-------------------------------------')
        else:
            df.loc[index, 'deviation'] = abs(df.loc[index, 'close'] - df.loc[index, 'renko close'])
            df.loc[index, 'deviation boxes'] = df.loc[index, 'deviation']/box
            df.loc[index, 'trend'] = 'N'
            print('Trend change: G - N', lastrenko, '\n-------------------------------------')
    else:
        df.loc[index, 'renko close'] = lastrenko
        df.loc[index, 'deviation'] = abs(df.loc[index, 'close'] - df.loc[index, 'renko close'])
        df.loc[index, 'deviation boxes'] = df.loc[index, 'deviation']/box
        df.loc[index, 'trend'] = 'N'
        print('Trend change: N', lastrenko, '\n-------------------------------------')
return df, lasttrend, lastrenko

Tags: boxdfcloseindexifabstrendloc

热门问题