트레이딩의 머신러닝: 이론, 모델, 실전 및 알고리즘 트레이딩 - 페이지 136

 

그리고 R ^ 2, 어떤 기능을 정확히 어떻게 생각합니까?

나는 딸랑이를 통해 다른 모델을 훈련하려고 시도했지만 상관 관계, 즉 cor(fitpoints[,1], fitpoints[,2])^2를 통해 "의사 r^2"를 고려했지만 동일한 방법으로 r^2를 계산하고 싶습니다. 당신이 비교를 위해.

[1 - sum((yx)^2)/sum((y-mean(y))^2)] 작동합니까?

 
트레이더 박사 :

그리고 R ^ 2, 어떤 기능을 정확히 어떻게 생각합니까?

나는 딸랑이를 통해 다른 모델을 훈련하려고 시도했지만 상관 관계, 즉 cor(fitpoints[,1], fitpoints[,2])^2를 통해 "의사 r^2"를 고려했지만 동일한 방법으로 r^2를 계산하고 싶습니다. 비교를 위해 당신으로.

[1 - sum((yx)^2)/sum((y-mean(y))^2)] 작동합니까?


정확히. X - 모델.

 
트레이더 박사 :

은닉층에 뉴런이 많을수록 뉴런으로 설명할 수 있는 기능이 더 복잡해지고 그 안에 더 많은 은닉층과 뉴런이 필요합니다.

그러나 문제는 뉴런이 목표를 설명하기 위해 연속적인 덧셈과 곱셈(예: 활성화 함수의 S자형)을 사용한다는 것입니다. 즉, 분명히 원래 함수가 아니라 일종의 근사값이 될 것입니다. 그리고 이 근사값은 훈련 데이터의 일부 기능을 기억할 것이므로 새 데이터에서 올바르게 작동하지 않을 것입니다. 따라서 때때로 훈련을 중단하고 테스트 세트의 오류가 감소했는지 확인하고 모든 것이 정상이면 추가 훈련을 계속해야 합니다. 어느 시점에서 테스트 데이터의 오류가 커지기 시작하면 학습을 완전히 중지해야 합니다.

또한 뉴런의 출력은 활성화 함수에 의해 제한됩니다. 대중적인 것들의 경우, sigmoid는 (0; 1), relu는 [0; inf)입니다. 목표 값은 다른 간격으로 조정해야 하며 간격(-7, 7)의 출력은 많은 패키지에서 단순히 달성할 수 없습니다.

모든 데이터를 avg.0 sdv.1로 확장하고 있습니다.

-1;1을 타겟팅할 수 있습니다. 그러나 이것은 출력 뉴런에 비선형 활성화 탄젠트가 있는 경우에만 실제로 필요합니다.

0:;1 유사한 경우의 시그모이드에 대해.

그리고 정체성이 있다면 원칙적으로 필요하지 않습니다. 그러나 데이터의 실제 범위를 고려해야 합니다. 가중치가 이 수준으로 만족되지 않을 수 있습니다.

그리고 기차에서 커브의 출력으로 가르치고 어디에서 멈출지 테스트하고 확인합니다.
 

다시 한 번 나는 덜컥 거리는 소리를 듣고 nnet을 가르쳤고 로그에서 완성된 코드를 가져왔습니다. Rattle은 nnet에서 제대로 작동하지 않습니다. 제 시간에 학습을 중단하기 위해 코드를 추가했습니다.

새 데이터에 대한 최상의 R^2 = 0.18. 최고의 네트워크 구성은 단일 내부 레이어에 하나의 뉴런이 있는 매우 재미있는 것으로 나타났습니다. 내부 레이어에 두 개의 뉴런이 있을 수도 있습니다. 결과는 거의 같습니다. 계속해서 숫자를 늘리면 일정에 따라 네트워크가 매우 빠르게 재교육되고 새 데이터에서 더 나빠집니다.

오른쪽 그래프에서 파란색 선은 20001행의 모델에 대한 새 데이터입니다. 나머지는 훈련 및 교차 검증입니다.

컨볼루션 네트워크가 선두에 있는 것 같습니다.

파일:
 
Dr.Trader :

다시 한 번 나는 덜컥 거리는 소리를 듣고 nnet을 가르쳤고 로그에서 완성된 코드를 가져왔습니다. Rattle은 nnet에서 제대로 작동하지 않습니다. 제 시간에 학습을 중단하기 위해 코드를 추가했습니다.

새 데이터에 대한 최상의 R^2 = 0.18. 최고의 네트워크 구성은 단일 내부 레이어에 하나의 뉴런이 있는 매우 재미있는 것으로 나타났습니다. 내부 레이어에 두 개의 뉴런이 있을 수도 있습니다. 결과는 거의 같습니다. 계속해서 숫자를 늘리면 일정에 따라 네트워크가 매우 빠르게 재교육되고 새 데이터에서 더 나빠집니다.

오른쪽 그래프에서 파란색 선은 20001행의 모델에 대한 새 데이터입니다. 나머지는 훈련 및 교차 검증입니다.

컨볼루션 네트워크가 선두에 있는 것 같습니다.

결과는 좋다! 축하합니다, 당신은 내 간단한 NS를 우회했습니다.

기능이 준비되었거나 지연으로 제공되었습니까? 이 문제는 순수 로그에서 해결할 수 없는 것 같습니다. 기능 준비가 필요합니다.

또 다른 관찰 - 예를 들어 네트워크 출력은 엄격하게 -1, 1입니다. 활성화 탄젠트를 취한 다음 출력의 역변환을 수행하지 않았거나 다른 작업을 수행하지 않았습니다.

그리고 참고용으로만. mxnet 패키지의 컨볼루션 네트워크 (딥 러닝). 지금까지 버전은 git 만 있습니다. 그러나 기본적으로 모든 것이 작동합니다.
 
알렉세이 버나코프 :

그리고 참고용으로만. mxnet 패키지의 컨볼루션 네트워크(딥 러닝). 지금까지 버전은 git에만 있습니다. 그러나 기본적으로 모든 것이 작동합니다.

주제에서 벗어난 관찰이지만 .... 내가 convolutional network 에 대한 도움을 요청하고 mxnet 패키지에 주의를 기울였을 때 모두가 침묵했다고 말합니다. 혼자 놀아요. 이제 모두가 갑자기 제가 50페이지 전에 이야기한 것을 하는 데 관심을 갖게 되었습니다. 왜 이런 일이 발생합니까? :) 흥미롭게도 100페이지 후에 누군가가 quantstrat 패키지를 알아차릴 것입니다. 저도 오래전에 관심을 가졌던 패키지입니다....

당신은 말할 것입니다 - 하, 글쎄요, 당신이 너무 똑똑해지면 스스로 취하십시오. 사실은 그것이 그렇게 똑똑하지도 않고 똑똑하지도 않다는 것입니다. 나는 많이 이해하지 못합니다. 영어는 모든 것이 매우 나쁩니다. 설명이 포함된 4줄의 코드는 스스로 알아내려고 노력한 시간과 같을 수 있지만 항상 해결되는 것은 아닙니다...

 
mytarmailS :

주제에서 벗어난 관찰이지만 .... 내가 convolutional network에 대한 도움을 요청하고 mxnet 패키지에 주의를 기울였을 때 모두가 침묵했다고 말합니다. 혼자 놀아요. 이제 모두가 갑자기 제가 50페이지 전에 이야기한 것을 하는 데 관심을 갖게 되었습니다. 왜 이런 일이 발생합니까? :) 흥미롭게도 100페이지 후에 누군가가 quantstrat 패키지를 알아차릴 것입니다. 저도 오래전에 관심을 가졌던 패키지입니다....

당신은 말할 것입니다 - 하, 글쎄요, 당신이 너무 똑똑해지면 스스로 취하십시오. 사실은 그것이 그렇게 똑똑하지도 않고 똑똑하지도 않다는 것입니다. 나는 많이 이해하지 못합니다. 영어는 모든 것이 매우 나쁩니다. 설명이 포함된 4줄의 코드는 스스로 알아내려고 노력한 시간과 같을 수 있지만 항상 해결되는 것은 아닙니다...

멋진 댓글이군요, 동료! ) 하

내 비전에 따라 요점별로 대답하겠습니다.

1) 여기에서 사람들은 90% 자신의 관심, 사고의 단계, 실험의 단계에 의해 인도됩니다. 따라서 일부 좋은 아이디어는 보류됩니다. 흥미로운 예와 문제를 제시하지 않았기 때문에 아무도 관심을 갖지 않았습니다. 간단하죠?

2) 지식을 얻기 위한 두 가지 전략이 있습니다: 자신을 파헤치고 고통스럽게 무언가를 시도합니다(우리 모두는 다양한 정도에 이것을 합니다. 예를 들어, 나는 "돈 버는 법을 배우십시오, 마을 사람들!" 주제에서 몇 년을 보낸 친구를 기억합니다. 사용 가능한 고문의 성능을 테스트 한 그의 삶의 모든 것이 누출되었습니다.) 또 다른 옵션은 누군가가 도와주고 완성 된 것을 배치 할 것이라는 희망으로 기다리는 것입니다. 따라서 상황으로 인해 두 번째 전략을 선택한 경우 완료된 전략을 기다리는 시간이 매우 길어질 수 있습니다.

mxnet에 관해서는 이미 채택했기 때문에 코드를 게시하는 데 신경 쓰지 않습니다. 그건 그렇고, 인터넷에 거의 같은 형식으로 있습니다.

install.packages ( "drat" , repos = "https://cran.rstudio.com" )
drat ::: addRepo ( "dmlc" )  

install.packages ( "mxnet" )  

 

 

train.x = data.matrix(dat_ready_scale[1:(nrow(dat_ready_scale) / 2), 1:100])

train.y = dat_ready_scale[1:(nrow(dat_ready_scale) / 2), 101]

test.x = data.matrix(dat_ready_scale[!rownames(dat_ready_scale) %in% rownames(train.x), 1:100])

test.y = dat_ready_scale[!rownames(dat_ready_scale) %in% rownames(train.x), 101]



########

train.x <- t(train.x)

test.x <- t(test.x)


dim(train.x) <- c(100, 1, 1, ncol(train.x))

dim(test.x) <- c(100, 1, 1, ncol(test.x))

#########



############ BUILD NET


library(mxnet)


# first conv layer


data <- mx.symbol.Variable('data')


conv1 <- mx.symbol.Convolution(data = data,

  kernel=c(14, 1),

  stride=c(1, 1),

  num.filter = 1)


tanh1 <- mx.symbol.Activation(data = conv1, 

 act.type = 'relu')


pool1 <- mx.symbol.Pooling(data = tanh1, 

     pool_type = "avg",

     kernel=c(5, 1), 

     stride=c(1, 1))



# second conv layer


conv2 <- mx.symbol.Convolution(data = conv1,

  kernel=c(12, 1),

  stride=c(1, 1),

  num.filter = 1)


tanh2 <- mx.symbol.Activation(data = conv2, 

 act.type = 'relu')


pool2 <- mx.symbol.Pooling(data = tanh2, 

     pool_type = "avg",

     kernel=c(5, 1), 

     stride=c(1, 1))



# third conv layer


conv3 <- mx.symbol.Convolution(data = conv2,

  kernel=c(10, 1),

  stride=c(1, 1),

  num.filter = 1)


tanh3 <- mx.symbol.Activation(data = conv3, 

 act.type = 'relu')


pool3 <- mx.symbol.Pooling(data = tanh3, 

     pool_type = "avg",

     kernel=c(2, 1), 

     stride=c(1, 1))



# first fully connected layer


flatten <- mx.symbol.Flatten(data = conv3)


fc1 <- mx.symbol.FullyConnected(data = flatten

   , num_hidden = 10)


tanh4 <- mx.symbol.Activation(data = fc1, act.type = 'tanh')



# second fully connected layer


fc2 <- mx.symbol.FullyConnected(data = tanh4, num_hidden = 1)


lenet <- mx.symbol.LinearRegressionOutput(data = fc2)


#### train


device <- mx.cpu()

log <- mx.metric.logger$new()


model <- mx.model.FeedForward.create(lenet, 

 X = train.x,

 y = train.y,

 ctx = device, 

 num.round = 100, 

 array.batch.size = 128,

 learning.rate = 0.01, 

 momentum = 0.9,

 eval.metric = mx.metric.rmse,

 eval.data = list(data = test.x, label = test.y),

 optimizer = 'sgd',

 initializer = mx.init.uniform(0.5),

 #array.layout = 'rowmajor',

 epoch.end.callback = mx.callback.log.train.metric(1, log))


plot(log$train, type = 'l', col = 'blue', ylim = c(min(c(log$train, log$eval)), max(c(log$train, log$eval))))

lines(log$eval, type = 'l', col = 'red')


mx.ctx.internal.default.value = list(device="cpu",device_id=0,device_typeid=1)

class(mx.ctx.internal.default.value) = "MXContext"


preds <- as.numeric(predict(model, test.x))

1 - sum((test.y - preds)^2) / sum((test.y - mean(test.y))^2)

당연히 기본적인 논리를 보여주는 물고기일 뿐입니다.

 
알렉세이 버나코프 :
기능이 준비되었거나 지연으로 제공되었습니까? 이 문제는 순수 로그에서 해결할 수 없는 것 같습니다. 기능 준비가 필요합니다.

또 다른 관찰 - 예를 들어 네트워크 출력은 엄격하게 -1, 1입니다. 활성화 탄젠트를 취한 다음 출력의 역변환을 수행하지 않았거나 다른 작업을 수행하지 않았습니다.

나는 모든 것을 변경하지 않고 원래대로 제공했습니다. 올바른 지표의 값을 세고 예측에도 사용하면 더 나은 결과를 얻을 수 있다고 확신합니다. 그러나 어떤 지표가 정확합니까? (수사적 질문, 아직 답변 없음).

대답에 "-1; 1"은 모든 것이 웃기다. 마지막 뉴런의 출력은 활성화 함수 없이 선형입니다. 즉, 어떤 것에 의해 제한되지 않습니다. 목표 값을 -1;1로도 스케일링하려고 시도했지만 그 후 네트워크는 간격(-0.2;0.2)에서 결과를 제공하기 시작했습니다. 어떤 이유로 결과는 항상 필요한 것보다 더 좁은 범위에 있을 것입니다. 아마도 빠르게 중단된 훈련으로 인해 250회만 반복했을 것입니다.
뉴런을 더 추가하고 학습을 멈추지 않으면 결국 네트워크는 원하는 간격까지 훈련합니다. 내부 레이어에 있는 100개의 뉴런은 훈련 데이터에서 100% 정확도를 달성하기에 거의 충분합니다. 로그로 판단하면 모든 20000 * 0.7(나중에 수정됨) 결과에 대한 잔차의 합은 약 200이었습니다. 그러나 동시에 교차 검증의 결과는 일반적으로 원하는 결과와 상관 관계가 중단되고 다음과 같이 됩니다. 원하는 간격이지만 임의의 값.

 
트레이더 박사 :

나는 모든 것을 변경하지 않고 원래대로 제공했습니다. 올바른 지표의 값을 세고 예측에도 사용하면 더 나은 결과를 얻을 수 있다고 확신합니다. 그러나 어떤 지표가 정확합니까? (수사적 질문, 아직 답변 없음).

대답에 "-1; 1"은 모든 것이 웃기다. 마지막 뉴런의 출력은 활성화 함수 없이 선형입니다. 즉, 어떤 것에 의해 제한되지 않습니다. 목표 값을 -1;1로도 스케일링하려고 시도했지만 그 후 네트워크는 간격(-0.2;0.2)에서 결과를 제공하기 시작했습니다. 어떤 이유로 결과는 항상 필요한 것보다 더 좁은 범위에 있을 것입니다. 아마도 빠르게 중단된 훈련으로 인해 250회만 반복했을 것입니다.
뉴런을 더 추가하고 학습을 멈추지 않으면 결국 네트워크는 원하는 간격까지 훈련합니다. 내부 레이어에 있는 100개의 뉴런은 훈련 데이터에서 100% 정확도를 달성하기에 거의 충분합니다. 로그로 판단하면 모든 20000*100 예측 변수에 대한 잔차의 합은 약 200이었습니다. 그러나 동시에 교차 검증 결과는 더 이상 원하는 결과와 상관 관계가 없으며 무작위 값일 뿐입니다. 원하는 간격.

재미있다. 생각해야 합니다.

추신: 아마도 이 범위 [-1; 1] 에서 네트워크가 가장 일관된 입력 신호를 수신하고 이 함수의 단편이 가장 쉽게 모델링됩니다(신경망이 가장 쉬운 것을 학습함). 물론 이 옵션은 경사하강법이 최소값을 찾을 때입니다. 그걸로 반박하기 힘드네요...

알겠습니다. 그래도 연습하고 싶다면 힌트를 추가하겠습니다.

첫째, R^2 0.55는 "메타피체"에 약간의 기능적 변환을 적용하여 실제로 달성할 수 있습니다. 또 다른 점은 기능이 외관상 다소 복잡하다는 것입니다.

또한 다음을 시도하십시오.

rowMeans(df[, 1:10])

rowMeans(df[, 1:20])

rowMeans(df[, 1:30])

...

rowMeans(df[, 1:100])

이 10개의 메타픽션에는 의미 있는 입력의 올바른 조합이 포함되어 있습니다.

그건 그렇고, 컨볼루션 레이어를 사용하면 발굴할 위치를 알고 있다면 이미 학습 과정에서 이것을 강조 표시할 수 있습니다.

사실 제가 제안하는 이유는 무엇으로 갈아야 하는지 알더라도 출력의 근사치를 재현하기 위해 열심히 노력해야 합니다. 그리고 내부자로서 나는 사람들에게 풀리지 않는 문제를 팔려고 한다는 느낌을 좋아하지 않습니다.

 
알렉세이 버나코프 :

멋진 댓글이군요, 동료! ) 하

내 비전에 따라 요점별로 대답하겠습니다.

이해했습니다. 더 거친 반응을 예상했습니다. 저를 때리지 않아서 감사합니다.)) 코드도 감사합니다. 다른 아이디어로 이미 바쁘기 때문에 주말에 알아 내려고 노력할 것입니다 ....

도움이 필요하다...

이동 평균에서 공적분 검정을 실행하고 싶지만 오류가 발생합니다...

 

다음은 정적 데이터에 대한 테스트일 뿐입니다.


 library(tseries)  
ri <- cumsum(rnorm( 10000 ))   # типа цены
si <- cumsum(rnorm( 10000 ))   # типа цены
ln <- length(ri)

data <- as.data.frame(cbind(ri,si))

#проводим линейную регрессию для определения правильного соотношения
model <- lm(  ri ~ si + 0 , data)
#вычисляем разницу цен (спред)
spread <- ri - coef(model)[ 1 ] * si
#проводим тест Дики-Фуллера на стационарность
test <- adf.test(as.vector(spread), k= 0 )

test$p.value

모든 것이 작동합니다...

그러나 슬라이딩 창에서 동일한 작업을 수행하면 오류가 발생합니다. Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) :

0(해당 사항 없음) 사례

슬라이딩 윈도우 테스트

ri <- cumsum(rnorm( 10000 ))   # типа цены
si <- cumsum(rnorm( 10000 ))   # типа цены
ln <- length(ri)


data <- as.data.frame(cbind(ri,si))


test_vec <- rep( 0 ,ln) # тут будем хранить показатели теста 

for (i in 151 :ln){
  print(i)
          idx <- (i- 150 ):i
                 #проводим линейную регрессию для определения правильного соотношения
                model <- lm(  ri[idx] ~ si[idx] + 0 , data[idx,])
                 #вычисляем разницу цен (спред)
                spread <- ri[idx] - coef(model)[ 1 ] * si[idx]
                 #проводим тест Дики-Фуллера на стационарность
                test <- adf.test(as.vector(spread), k= 0 )
                
                test_vec[i] <- test$p.value
                
}

비슷한 문제에서 스택 오버플로가 발생하면 데이터의 "NA" 때문이라고 하는데 저는 그런 것이 없습니다.

무엇이 문제인가? 도와주세요, 제발

사유: