【问题标题】:Function, for loop, which, pairtrading函数,for循环,其中,pairtrading
【发布时间】:2019-10-26 07:19:59
【问题描述】:

我有一个包含 4 列的日期集 (df):日期、价格_1、价格_2、比率
ratio = price_1/price_2 它与配对交易有关。我需要确定何时打开和关闭头寸。 m = 平均值(比率),s = sd(比率),k =1 如果比率超过m + 1*s或m-1*s,就会开仓;这将保持打开状态,直到它满足关闭标准,即当该比率 = m 时立即平仓。位置由打开点和关闭点组成。比率第一次超过 m+1*s 或 m-1*s 是位置 1 的开仓点,然后在 ratio m+1*s 的情况下关闭;反之,如果比率超过 m-1*s,则关闭比率 >= m 所以 position1 由 1&2 组成,其中 1 是开盘点,当它达到平均值(黑线)时,收盘点是点 2。 s =(虚线)。 == 意思不能仅仅因为浮点数。


     open_upper <- which(retail_stocks$ratio > (m + k*s) )
     open_lower <- which(retail_stocks$ratio < (m - k*s) )
     close_upper <- which(retail_stocks$ratio <= m )
     close_lower <- which(retail_stocks$ratio >= m )

但是现在我需要找出位置 1, 2, 3, 4 等等。

【问题讨论】:

    标签: r function for-loop


    【解决方案1】:

    基础 R 解决方案:

    open_close_idx_list <- vector("list", 4)
    
    
    open_close_idx_func <- function(df, m, k, s){
    
             list(open_upper = which(df$ratio > (m + k*s)),
    
                  open_lower = which(df$ratio < (m - k*s)),
    
                  close_upper = which(df$ratio <= m),
    
                  close_lower =  which(df$ratio >= m))
    
    }
    
    # Note the arguments passed to this function represent m, k, and s, and have been arbitrarily chosen: 
    
    open_close_idx_list <- open_close_idx_func(retail_stocks, .8, .2, .3)
    
    retail_stocks[c(open_close_idx_list$open_upper),]
    
    retail_stocks[c(open_close_idx_list$open_lower),]
    
    retail_stocks[c(open_close_idx_list$close_upper),]
    
    retail_stocks[c(open_close_idx_list$close_lower),]
    

    修改后的输入数据:

        retail_stocks <- structure(list(date = structure(c(7306, 7307, 7308, 7309, 7312, 7313, 7314, 7315, 7316, 7319, 7320, 7321, 7322, 7323, 7326, 7327, 7328, 7329, 7330, 7333), class = "Date"),
                                    TGT = c(3.141479, 3.171741, 3.177794, 3.183848, 3.214115, 3.171741, 3.171741, 3.1899, 3.099107, 3.050683, 3.038576, 3.020419, 2.996207, 2.965943, 2.899359, 2.935676, 2.971996, 2.941731, 2.881201, 2.905412), WMT = c(3.880284, 3.880284, 3.859697, 3.818529, 3.869992, 3.767066, 3.767066, 3.808233, 3.664141, 3.612676, 3.674432, 3.633262, 3.571507, 3.581798, 3.489166, 3.489166, 3.509751, 3.447996, 3.468581, 3.489166),
                                    ratio = c(0.809600276680779, 0.81739919036854, 0.82332732336243, 0.833789137125841, 0.830522388676773, 0.841965869459149, 0.841965869459149, 0.837632571326387, 0.845793598008374, 0.844438582369412, 0.826951213139881, 0.7, 0.83891953732696, 0.82805981800202, 0.830960464477758, 0.841368968974248, 0.846782578023341, 0.853171233377301, 0.830656974710984, 0.832695262994079)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -20L))
    

    【讨论】:

    • 嗨,Steffie,如果我的解决方案合适,您可以接受它作为答案吗?
    • 对不起,我会的!对 stackoverfrlow 还不是很熟悉。您的解决方案解决了我提出的问题!只有完整的目标比我上面所说的要复杂一些。
    • @Eugenie open_upper_df
    • 谢谢这是脚本和名称中的一个细节,但主要问题是如何编写一个函数来找到下一个打开和关闭的位置。对完整的数据集执行此操作。
    • 发布您的数据集的匿名版本,以便我可以复制它。我会尽快解决您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    相关资源
    最近更新 更多