2

sigAND選択した 2 つの列の両方に値がある (または NA でない) 場合に、日付を含む新しい列を作成するのに便利な関数です。Ilya Kipnis と彼のIKTradingパッケージに感謝します。

しかし、この機能のヘルプページで気づいたのですが、crossが使われています。上記の の使用法に関する私の理解sigANDが正しければ、 の場所がないはずだと混乱していcrossます。

sigANDソースコードを調べて、テストしました。出力列がまたはcross = TRUEのベクトルのみの場合、関数は正常に動作します。したがって、 が関数内にいることは本当の意味ではないようです。NAFALSEcross

これが私の偽のデータと入力です:

dataAnd <- cbind(c(1, NA, 3, NA, NA, 10, 12), 7:13)
dataAnd <- xts(dataAnd, order.by = Sys.Date()+1:7)
colnames(dataAnd) <- c("col1", "col2")
label = "both"
data = dataAnd
columns = c("col1", "col2")
cross = T # F

コードを理解するのに役立つコメント付きのソースコードを次にsigAND示します(私はまだRとプログラミングに慣れていません)。

   function (label, data = mktdata, columns, cross = FALSE) 
        # cross = False is important, as cross=T makes no sense here.

        # columns: named colums to apply comparison to
    #{
        # create an empty return_signal_column
        ret_sig = NULL 

        colNums <- rep(0, length(columns)) # colNums <- c(0, 0)

        for (i in 1:length(columns)) { # for each column

            # example of how to use match.names()
            # match.names("Close", colnames(IF_DAY)) return 4, index of '.Close'
            # colNums[i] <- 4 assigned with an index
            colNums[i] <- match.names(columns[i], colnames(data))
        }

        # extract the first/left column to be a one-column xts and assigned to ret_sig
        ret_sig <- data[, colNums[1]] 

        # for second or third comparing column
        for (i in 2:length(colNums)) { 

            # check whether a date has values in both columns, yes(true), no(NA)
            # example: 1:4 & c(1, NA, NA, 10)
            # return: [1] TRUE   NA   NA TRUE
            ret_sig <- ret_sig & data[, colNums[i]]
        }

        # turn above [1] TRUE NA NA TRUE to [1]  1 NA NA  1
        ret_sig <- ret_sig * 1

        #### using cross option here makes no sense, right?
        # if cross was assigned to be True 
        if (isTRUE(cross)) 

            # create ret_sig logic value by diff(ret_sig) == 1
            ret_sig <- diff(ret_sig) == 1 # !!!! NA-1 or 1-NA are NA

        # name ret_sig to be label
        colnames(ret_sig) <- label # label is given to the output

       return(ret_sig)
    }

データと入力をロードし、最初と最後の数行をコメントアウトせずに上記のソース コードを実行しました。

次のときに次の出力が得られましたcross = FALSE

> ret_sig
           both
2016-03-19    1
2016-03-20   NA
2016-03-21    1
2016-03-22   NA
2016-03-23   NA
2016-03-24    1
2016-03-25    1

次のときに次の出力が得られましたcross = TRUE

> ret_sig
            both
2016-03-19    NA
2016-03-20    NA
2016-03-21    NA
2016-03-22    NA
2016-03-23    NA
2016-03-24    NA
2016-03-25 FALSE

2 番目の状況は、そこにいる意味がないことを示唆していcrossます。それとも、ここで重要な何かが欠けていますか? 誰でも見てもらえますか?

4

1 に答える 1

2

Ilya さんの返信に感謝します。は非常に必要ですsigANDcross = T以下に Ilya の回答を引用します。

終値 > SMA200 および RSI < 20 で購入

十字架がなければ、その条件が満たされるたびに購入することになります。クロスでは、RSI が 20 を下回り、終値 > SMA200 になった場合のみ。

簡単な例を変更したところ、うまくいきました。

データと変数:

dataAnd <- cbind(c(1, 0, 0, 1, 1, 1, 1), c(0, 0, 1, 1, 1, 0,1 ))
dataAnd <- xts(dataAnd, order.by = Sys.Date()+1:7)
colnames(dataAnd) <- c("col1", "col2")
label = "both"
data = dataAnd
columns = c("col1", "col2")
cross = T # F

sigANDテスト用のソース コードの一部:

# create an empty return_signal_column
    ret_sig = NULL 

    colNums <- rep(0, length(columns)) # colNums <- c(0, 0)

    for (i in 1:length(columns)) { # for each column

        # example of how to use match.names()
        # match.names("Close", colnames(IF_DAY)) return 4, index of '.Close'
        # colNums[i] <- 4 assigned with an index
        colNums[i] <- match.names(columns[i], colnames(data))
    }

    # extract the first/left column to be a one-column xts and assigned to ret_sig
    ret_sig <- data[, colNums[1]] 

    # for second or third comparing column
    for (i in 2:length(colNums)) { 

        # check whether a date has values in both columns, yes(1), no(0)
        ret_sig <- ret_sig & data[, colNums[i]]
    }


    ret_sig <- ret_sig * 1

    #### using cross option here makes no sense, right?
    # if cross was assigned to be True 
    if (isTRUE(cross)) 

        # create ret_sig logic value by diff(ret_sig) == 1
        ret_sig <- diff(ret_sig) == 1 

    # name ret_sig to be label
    colnames(ret_sig) <- label # label is given to the output

    ret_sig

cross = F、私は得ました:

           both
2016-03-20    0
2016-03-21    0
2016-03-22    0
2016-03-23    1
2016-03-24    1
2016-03-25    0
2016-03-26    1

cross = T、私は得ました:

            both
2016-03-20    NA
2016-03-21 FALSE
2016-03-22 FALSE
2016-03-23  TRUE
2016-03-24 FALSE
2016-03-25 FALSE
2016-03-26  TRUE
于 2016-03-19T06:12:07.150 に答える