交易中的机器学习:理论、模型、实践和算法交易 - 页 20

 
有趣的文章https://geektimes.ru/post/144405/, 也许有人会明白如何在R中模拟这个问题
Прогнозирование финансовых временных рядов
Прогнозирование финансовых временных рядов
  • geektimes.ru
Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста. Пометьте топик понятными вам метками, если хотите или закрыть
 

基于我前面提到的动机,我开始尝试使用集群。我遇到了一个问题--当我试图从对应于一个群组的作品中粘合价格时,被粘合的地方是价格差距(而这是符合逻辑的,但我没有想到))。)问题是如何弥补这些差距

#  типа какая то цена
dat <- cumsum(rnorm(1000))+1000
plot(dat,t="l")


#  фун. матрицы хенкеля для имитации скользящего окна
hankel<- function(data, r=10) {
  do.call(cbind,
          lapply(0:(r-1),function(i) { data[(i+1):(length(data)-(r-1-i))]}))}
#  делаем аналог скользящего окна глубиной в 50
glubina <- 50
D <- hankel(dat,r = glubina)


#  скалирую и центрирую дату, проще сказать нормализирую
DC <- t(  apply(D, 1,    function(x) {  scale(x,T,T)  }    ))


library(SOMbrero)
#  тренирую сеть кохонена на данных чтоб получить кластера
TS <- trainSOM(DC,  dimension=c(3,3))

#  край матрицы будет вектор нашей цены без первых значений
dt <- D[,glubina] 
#  полученые кластера
cl <- TS$clustering

#  график цены , график кластеров этой цены
par(mfrow=c(2,1))
plot(dt,t="l")
plot(cl,t="l")
par(mfrow=c(1,1))


#  пробую посмотреть склееный график только одного кластера 
one_clust <- dt[cl==3]
#  график с разрывами в местах склейки
plot(one_clust,t="l")
 
Dr.Trader:

我也有这个问题。通常你只需要运行attributes(KZP)来获得一个可用的变量列表,然后只需通过它们,如KZP$window等,找到你需要的数字。但在这里,这些数字是在函数Summary本身中生成的,并没有存储在任何地方。

这里这里是一个源代码:https://cran.r-project.org/web/packages/kza/index.html,我们应该执行这样的东西。

顺便说一下,如果你使用指标,这个功能可能对你有用,它可以在非常嘈杂的数据中检测出周期性成分,简而言之,这个周期在市场中不断变化。

我们的想法是不断识别这个主导时期,并根据它调整指标,而不是像其他人那样只用固定参数。我在一次随机约会中非常肤浅地测试了这种方法,与通常的方法相比,结果是积极的。我采用了RSI指标,它在固定参数下输了,而在自适应参数下赢了。如果你想使用它,你可以使用它,我非常有兴趣阅读你的研究结果。

 
mytarmailS:

基于我前面提到的动机,我开始尝试使用集群。我遇到了一个问题--当我试图从对应于一个群组的作品中粘合价格时,被粘合的地方是价格差距(而这是符合逻辑的,但我没有想到))。)问题是如何弥补这些差距

对价格系列进行对数,然后转换为一系列的差异。为了把系列粘在一起,只留下系列中与发现的条件相对应的那些间隔。然后通过求和,从这个系列中做出一个新的系列。而且,如果需要的话,事后要进行曝光。
 
安东-兹维列夫
对价格系列进行对数,然后将其转换为一系列的差异。为了把这个系列粘在一起,只留下那些与找到的条件相对应的区间。然后通过求和,从这个系列中做出一个新的系列。而且,如果需要的话,事后要进行曝光。
谢谢,这和我想象的差不多,让我们试试吧
 

又学到了几件有趣的事情。

之前发布的筛选预测因子的函数(designTreatmentsN$scoreFrame)显然没有给出最终的预测因子集。它甚至不能去除100%相关的预测因子,另外它可能会去除你想要的东西,再加上留下垃圾。我把他们的筛选方法弄得有点复杂--一开始我是用老方法,通过designTreatmentsN$scoreFrame来筛选预测因子(我把阈值提高了两倍--2/N,以筛选出不那么潜在的好预测因子)。然后我删除所有相关度大于0.99的预测因子(在随机生成deltas和sum后,我有很多这样的预测因子。而且我看的是预测因子之间的相关性,而不是与目标变量的相关性)。然后,我从遗传学角度 寻找剩余的最佳预测因子集。

我尝试使用文章中关于主成分的其他东西。下面的函数建立了主成分模型,并在我使用所有发现的主成分的情况下返回R^2。它不像文章中的另一个例子那样有 "Y尺度",但这种方式更快。我现在用它来估计预测器集(可能是白费力气,我还不知道:))。 srcTable参数的最后一列是目标变量。如果预测器的值太少,可能会有错误,函数可能不适合某些数据。

library('caret')
GetPCrsquared <- function(srcTable){
        targetName <- tail(colnames(srcTable),1)
        origVars <- setdiff(colnames(srcTable), targetName)
        # can try variations such adding/removing non-linear steps such as "YeoJohnson"
        prep <- preProcess(srcTable[,origVars], method = c("zv", "nzv", "center", "scale", "pca"))
        prepared <- predict(prep,newdata=srcTable[,origVars])
        newVars <- colnames(prepared)
        prepared$target <- srcTable$target
        modelB <- lm(paste(targetName, paste(newVars,collapse=' + '),sep=' ~ '),data=prepared)
        return(summary(modelB)$r.squared)
}

以前我的R^2约为0.1,现在已经达到0.3。这还是不够的,他们建议至少使用0.95。另一件奇怪的事情是,在R^2=0.1的情况下,我在fronttest中的误差是37%,而在R^2=0.3的情况下,这个误差已经增长到45%。也许问题在于,我在预测器集合中添加了更多的条形图和更多的指标。前进一步,后退两步,现在我需要分析整套指标,并删除不必要的指标。或者主成分模型根本不适用于外汇(很难验证,首先我需要达到R^2>0.95,然后看看fronttest的结果如何,用一个未经训练的模型得出结论还为时过早)。

我还比较了GA包(遗传学)和GenSA(梯度退火,来自Alexey的例子)。两套方案都取得了相同的结果。遗传学知道如何多线程工作,所以它在时间上获胜。但GenSA似乎在一条线上获胜。还有一个缓存结果的技巧,我想亚历克斯会欣赏它。

fitness_GenSA_bin <- function(selectionForInputs){
        testPredictorNames <- predictorNames[ which(selectionForInputs == TRUE) ]
        #do  the fitness calculation
}

library(memoise)
fitness_GenSA_bin_Memoise <- memoise(fitness_GenSA_bin)

fitness_GenSA <- function(selectionForInputs){
        selectionForInputs[selectionForInputs>=0.5] <- TRUE
        selectionForInputs[selectionForInputs<0.5] <- FALSE
        return(fitness_GenSA_bin_Memoise(selectionForInputs))
}

library(GenSA, quietly=TRUE)
GENSA <- GenSA(fn = fitness_GenSA,
                                lower = rep(0, length(predictorNames)),
                                upper = rep(1, length(predictorNames)),
                                control=list(smooth=FALSE, verbose=TRUE)
                                ) 

重点是,如果这样的预测器集至少已经遇到过一次,中间函数fitness_GenSA_bin_Memoise会从缓存中获取数据。fitness_GenSA_bin应该包含健身函数的计算本身,并且对每个独特的集合只调用一次。

mytarmailS:

顺便说一下,如果你使用指标,它可能对你有用,这个功能在一个非常嘈杂的数据中检测周期性成分,简而言之,这个周期在市场中不断变化。

我们的想法是不断识别这个主导时期,并根据它调整指标,而不是像其他人那样只用固定参数。我在一次随机约会中非常肤浅地测试了这种方法,与通常的方法相比,结果是积极的。我采用了RSI指标,它在固定参数下输了,而在适应性参数下赢了。如果你对它感兴趣,你可以使用它,我将非常有兴趣阅读你的研究结果。

现在我只是使用指标的标准参数。如果我要使用一个指标,使用标准参数在D1上交易股票会更有用,但需要调整。我无法将结果从D1转移到H1,我使用的指标越多,就越是卡在D1。事实证明,指标参数需要根据时间框架和时间来改变,没错。

 
Dr.Trader:

又学到了几件有趣的事情。

之前发布的筛选预测因子的函数(designTreatmentsN$scoreFrame)显然没有给出最终的预测因子集。它甚至不能去除100%相关的预测因子,另外它可能会去除你想要的东西,再加上留下垃圾。我把他们的筛选方法弄得有点复杂--一开始我是用老方法,通过designTreatmentsN$scoreFrame来筛选预测因子(我把阈值提高了两倍--2/N,以筛选出不那么潜在的好预测因子)。然后我删除所有相关度大于0.99的预测因子(在随机生成deltas和sum后,我有很多这样的预测因子。而且我看的是预测因子之间的相关性,而不是与目标变量的相关性)。然后,我从遗传学角度 寻找剩余的最佳预测因子集。

我尝试使用文章中关于主成分的其他东西。下面的函数建立了主成分模型,并在我使用所有发现的主成分的情况下返回R^2。它不像文章中的另一个例子那样有 "Y尺度",但这种方式更快。我现在用它来估计预测器集(可能是白费力气,我还不知道:))。 srcTable参数的最后一列是目标变量。如果预测器的值太少,可能会有错误,函数可能不适合某些数据。

以前我的R^2约为0.1,现在已经达到0.3。这还是不够的,他们建议至少使用0.95。另一件奇怪的事情是,在R^2=0.1的情况下,我在fronttest中的误差是37%,而在R^2=0.3的情况下,这个误差已经增长到45%。也许问题在于,我在预测器集合中添加了更多的条形图和更多的指标。前进一步,后退两步,现在我需要分析整套指标,并删除不必要的指标。或者主成分模型根本不适用于外汇(很难验证,首先我需要达到R^2>0.95,然后看看fronttest的结果如何,用一个未经训练的模型得出结论还为时过早)。

我还比较了GA包(遗传学)和GenSA(梯度退火,来自Alexey的例子)。两套方案都取得了相同的结果。遗传学知道如何多线程工作,所以它在时间上获胜。但GenSA似乎在一条线上获胜。还有一个缓存结果的技巧,我想亚历克斯会欣赏它。

重点是,如果这样的预测器集至少已经遇到过一次,中间函数fitness_GenSA_bin_Memoise会从缓存中获取数据。fitness_GenSA_bin应该包含健身函数的计算本身,并且对每个独特的集合只调用一次。

到目前为止,我只是在使用指标的标准参数。我认为它们应该被调整。 我同意,一般来说,如果指标主要是为D1开发的,那么它们在这个时间框架上的标准参数会更有用。我无法将结果从D1转移到H1,我使用的指标越多,就越是卡在D1。事实证明,指标参数需要根据时间框架和时间来改变,没错。

缓存的问题很好。我试着自己写。但有一个现成的解决方案。Cueru。谢谢你,伙计。

那么,在超额完成任务时,你使用什么健身函数?错过了这一次。是线性依赖还是某种统计学?
 
Dr.Trader:

没有像文章中的另一个例子那样的 "Y尺度"。

我认为这就是这篇文章的全部意义所在。我重读了一遍,它明确地这样说。

不过,回到编制预测器清单的一般方案上。

噪声屏蔽只是问题的一部分,并不能解决这一领域的其他问题和建议。

如果这一切都完成了,那么接下来的工作算法是在一个循环中,如下所示。

1.我们取一个经过选择和处理的预测器集合。这个名单是不变的。

2.对于当前 窗口,我们通过其中一种算法选择预测器。例如,在caret中有两种算法。

3.拟合模型。

4.

5.转移窗口,进入第2步。

在我手中的那些最初的预测器组中,噪音预测器的数量超过了80个!

然后,标准算法选择大约一半的剩余预测器,该算法不将其归类为噪声。随着窗口的移动,这一半的组成也在不断变化。但总是训练集上的误差和样本外的误差大致相等。由此我得出结论,我的模型没有过度训练,这是上述预测器选择算法的结果。

 

你在使用蛮力时使用什么健身函数?

我用来训练森林,并在验证样本上返回一个错误。原则上,它是有效的--如果森林过度训练,哪怕是一点点,误差都会趋于50%。

现在我使用GetPCrsquared(),即上面那段代码。我也有你的例子,来自feature_selector_modeller.txt,但我需要弄清楚,在那里得到正确的代码,所以我还没有在我的数据上测试。

 
SanSanych Fomenko:

我想这就是这篇文章的内容。我重读了一遍,它明确说了。

我也试过Y尺度,两种情况下的R^2(有Y尺度和没有Y尺度)得出的结果是一样的(尽管他们使用不同的软件包!)。

我想,Y-scale可能会在主成分数量较少的情况下得到同样好的结果。但是,如果即使使用所有的组件,结果仍然不令人满意(就像我的情况一样)--那就没有什么区别了。另外,它的工作速度更快,这对我来说现在更重要。但我还没有通过理论或实践证明这种方法是否适合于选择预测因子......起初我有一个想法,在所有预测因子上建立主要成分模型,通过观察成分的系数来选择预测因子。但后来我注意到,随着添加垃圾--模型的R^2下降了。尝试不同的预测器组并寻找那些具有较高R^2的预测器是合乎逻辑的,但它仍然只是一个理论。