BitCoin Algo неправильно перебирает исторические данные

Я создаю простой бэктестер для торговли биткойнами, но у меня возникают проблемы с циклами for в моем коде. Текущий код основан на 2 простых скользящих средних q и z (в настоящее время для целей обучения нет реальной стратегии). info — это кадр данных, содержащий исторические данные биткойнов из CSV-файла. Кажется, произошла ошибка outofbounce, и я не могу ее понять. Любая помощь будет оценена по достоинству.

import pandas as pd
import numpy as np

cash = 10000

file = 'BTC-USD.csv'
data = pd.read_csv(file)

y = data['Adj Close'][1000:]
x = data['Date'][1000:]
v = data['Volume'][1000:]
h = data['High'][1000:]
l = data['Low'][1000:]

def movAvg(values,time):
    times=np.repeat(1.0,time)/time
    sma = np.convolve(values,times,'valid')
    return sma

z = movAvg(y,12)
q  = movAvg(y,9)
SP = len(x[50-1:])


def AlgoCal(account,info):
    #i = 1050
    bought = False
    test = []
    for x in info.index:
        if q[x]<z[x]:
            if bought == False:
                temp = info[x]
                account = account-info[x]
                test.append(account)
                bought = True
        elif q[x]>z[x]:
            if bought == True:
                temp = info[x]
                account = account + info[x]
                test.append(account)
                bought = False
        else:
            print("Error")
    return(test)

money = AlgoCal(cash,y)
print(money)

Пример данных из Yahoo Bitcoin csv

Date,Open,High,Low,Close,Adj Close,Volume
2014-09-17,465.864014,468.174011,452.421997,457.334015,457.334015,21056800
2014-09-18,456.859985,456.859985,413.104004,424.440002,424.440002,34483200
........
........
2020-05-21,9522.740234,9555.242188,8869.930664,9081.761719,9081.761719,39326160532
2020-05-22,9080.334961,9232.936523,9008.638672,9182.577148,9182.577148,29810773699
2020-05-23,9185.062500,9302.501953,9118.108398,9209.287109,9209.287109,27727866812
2020-05-24,9196.930664,9268.914063,9165.896484,9268.914063,9268.914063,27658280960

Ошибка:

Traceback (most recent call last):
  File "main.py", line 47, in <module>
    money = AlgoCal(cash,y)
  File "main.py", line 31, in AlgoCal
    if q[x]<z[x]:
IndexError: index 1066 is out of bounds for axis 0 with size 1066

person GilbertN    schedule 25.05.2020    source источник


Ответы (1)


Ваши скользящие средние имеют две разные длины. В одном 12 периодов, в другом 9 периодов. Когда вы пытаетесь сравнить их в AlgoCal, ваш короткий заканчивается и выдает ошибку «за пределами».

Если вы собираетесь сравнивать скользящие средние таким образом, вам нужно добавить минимальный период в начале, чтобы он начинался только тогда, когда доступны оба средних.

person run-out    schedule 25.05.2020
comment
Вау, спасибо, могу поверить, что я этого не понимал, знаете ли вы какой-нибудь способ реализовать минимальный период? - person GilbertN; 25.05.2020
comment
Можете ли вы опубликовать в своем вопросе образцы данных для ваших двух скользящих средних, мне нужно увидеть ваши даты начала и окончания для каждого индикатора. Также не могли бы вы принять этот ответ правильным, если вы так думаете? Спасибо. - person run-out; 25.05.2020
comment
Спасибо и помечен как правильный ответ, я отредактировал пост выше, чтобы он содержал весь мой код и примеры данных. Образец данных был получен с веб-сайта Yahoo Finance, я добавил только заголовок и хвост, так как файл был слишком большим для публикации. Я устанавливаю начальные данные из индекса 1000 и дату окончания из самого последнего индекса. - person GilbertN; 26.05.2020