Как использовать функцию BBands с (n-1) стандартным отклонением? - PullRequest
0 голосов
/ 06 июня 2018

С учетом данных и результатов охоты на птиц с помощью функции BBands из пакета TTR:

d1= 1:20
d1
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

BBands(t1)[20,]
        dn       mavg         up       pctB 
-1.0325626 10.5000000 22.0325626  0.9118772 

Теперь для ручных диапазонов с использованием функции sd.

> c(mean(t1)-sd(t1)*2,mean(t1)+sd(t1)*2)
[1] -1.33216 22.33216

Разница в том, чтоsd использует метод (n-1) для стандартного отклонения, а BBands использует метод N.

Вопрос в том, как заставить функцию BBands использовать метод (n-1).В документации здесь такой список не указан.

Если это невозможно, BBands, может кто-нибудь помочь мне сделать функцию, которая клонирует BBands, но с (n-1) для стандартаотклонение.

1 Ответ

0 голосов
/ 07 июня 2018

Функция

Вы получаете простой код функции, когда просто пишете функцию BBands (без скобок):

function (HLC, n = 20, maType, sd = 2, ...) 
{
    HLC <- try.xts(HLC, error = as.matrix)
    if (NCOL(HLC) == 3) {
        if (is.xts(HLC)) {
            xa <- xcoredata(HLC)
            HLC <- xts(apply(HLC, 1, mean), index(HLC))
            xcoredata(HLC) <- xa
        }
        else {
            HLC <- apply(HLC, 1, mean)
        }
    }
    else if (NCOL(HLC) != 1) {
        stop("Price series must be either High-Low-Close, or Close/univariate.")
    }
    maArgs <- list(n = n, ...)
    if (missing(maType)) {
        maType <- "SMA"
    }
    mavg <- do.call(maType, c(list(HLC), maArgs))
    sdev <- runSD(HLC, n, sample = FALSE)
    up <- mavg + sd * sdev
    dn <- mavg - sd * sdev
    pctB <- (HLC - dn)/(up - dn)
    res <- cbind(dn, mavg, up, pctB)
    colnames(res) <- c("dn", "mavg", "up", "pctB")
    reclass(res, HLC)
}

Давайтеизмените функцию

есть переменная sdev с функцией runSD(), я изменил ее на функцию sdev <- as.vector (rollapplyr (HLC, n, sd)) `,таким образом, мы получаем векторный вывод.Давайте назовем эту новую функцию BBands_2: </p>

BBands_2 <- function (HLC, n = 20, maType, sd = 2, ...)

{
  HLC <- try.xts(HLC, error = as.matrix)
  if (NCOL(HLC) == 3) {
    if (is.xts(HLC)) {
      xa <- xcoredata(HLC)
      HLC <- xts(apply(HLC, 1, mean), index(HLC))
      xcoredata(HLC) <- xa
    }
    else {
      HLC <- apply(HLC, 1, mean)
    }
  }
  else if (NCOL(HLC) != 1) {
    stop("Price series must be either High-Low-Close, or Close/univariate.")
  }
  maArgs <- list(n = n, ...)
  if (missing(maType)) {
    maType <- "SMA"
  }
  mavg <- do.call(maType, c(list(HLC), maArgs))
  sdev <- as.vector(rollapplyr(HLC, n, sd))
  up <- mavg + sd * sdev
  dn <- mavg - sd * sdev
  pctB <- (HLC - dn)/(up - dn)
  res <- cbind(dn, mavg, up, pctB)
  colnames(res) <- c("dn", "mavg", "up", "pctB")
  reclass(res, HLC)
}

Теперь вы можете просто скопировать эту функцию в свой код.Вам также нужно активировать library(xts) и, конечно, library(TTR)

Результат

Результат с BBands_2:

df <- 1:20

BBands_2(df)[20,]
        dn       mavg         up       pctB 
-1.3321596 10.5000000 22.3321596  0.9014483 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...