Корреляция Pinescript (source_a, source_b, length) -> to python - PullRequest
0 голосов
/ 27 мая 2020

Мне нужна помощь с переводом функции корреляции Pine в python, я уже перевел функции stdev и swma, но этот меня немного сбивает с толку.

Я тоже нашел это объяснение, но не совсем понял, как его реализовать:

в python попробуйте использовать pandas с .rolling(window).corr, где window - период коэффициента корреляции, pandas позволяет вычислить любую скользящую статистику c с помощью rolling(). Коэффициент корреляции для сосны рассчитывается следующим образом: sma(y*x,length) - sma(y,length)*sma(x,length) делится на stdev(length*y,length)*stdev(length*x,length), где stdev основано на наивном алгоритме.

Документация по сосне для этого развлечения c:

> Correlation coefficient. Describes the degree to which two series tend
> to deviate from their sma values. correlation(source_a, source_b,
> length) → series[float] RETURNS Correlation coefficient.

АРГУМЕНТЫ

source_a (серия) Исходная серия.

source_b (серия) Целевая серия.

length (целое число) Длина ( количество баров назад).

1 Ответ

1 голос
/ 28 мая 2020

Использование pandas действительно лучший вариант, TA-Lib также имеет функцию CORREL. Чтобы вы лучше понимали, как реализована функция correlation в Pine, вот код python, использующий numpy, обратите внимание, что это не эффективное решение.

import numpy as np
from matplotlib import pyplot as plt

def sma(src,m):
    coef = np.ones(m)/m
    return np.convolve(src,coef,mode="valid")

def stdev(src,m):
    a = sma(src*src,m)
    b = np.power(sma(src,m),2)
    return np.sqrt(a-b)

def correlation(x,y,m):
    cov = sma(x*y,m) - sma(x,m)*sma(y,m)
    den = stdev(x,m)*stdev(y,m)
    return cov/den

ts = np.random.normal(size=500).cumsum()
n = np.linspace(0,1,len(ts))
cor = correlation(ts,n,14)

plt.subplot(2,1,1)
plt.plot(ts)
plt.subplot(2,1,2)
plt.plot(cor)
plt.show()
...