トレーディングにおける機械学習:理論、モデル、実践、アルゴトレーディング - ページ 136

 

また、R^2は具体的にどのように計算するのですか、どのような関数ですか?

rattleで様々なモデルを学習させようとしたところ、相関による「疑似r^2」、すなわちcor(fitpoints[,1], fitpoints[,2])^2がカウントされましたが、比較のために皆さんと同じ手法でr^2を計算したいのですが、どうすればよいでしょうか?

このコード[1 - sum((y-x)^2)/sum((y-mean(y))^2)] はうまくいくのでしょうか?

 
Dr.トレーダー

また、R^2は具体的にどのように計算するのですか、どのような関数ですか?

rattleで様々なモデルを学習させようとしたところ、相関による「疑似r^2」、すなわちcor(fitpoints[,1], fitpoints[,2])^2がカウントされましたが、比較のために皆さんと同じ手法でr^2を計算したいのですが、どうすればよいでしょうか?

このコード[1 - sum((y-x)^2)/sum((y-mean(y))^2)] はうまくいくのでしょうか?


その通りです。Xはモデルです。

 
Dr.トレーダー

隠れ層のニューロンの数が多ければ多いほど、つまりニューロンで記述できる機能が複雑であればあるほど、隠れ層とその中のニューロンの数が必要になります。

しかし、その場合、ニューロンは連続した加算と乗算(例えば活性化関数にシグモイド)を使って対象を記述することになります。つまり、明らかに元の関数ではなく、ある種の近似を得ることになります。また、この近似式は学習データの特徴を覚えているため、新しいデータでは正しく動作しないことが判明することもあります。ですから、時にはトレーニングを中断して、テストサンプルの誤差が小さくなったかどうかを確認し、問題がなければトレーニングを継続する必要があります。ある時点でテストデータに対する誤差が大きくなり始めると、学習を完全に停止しなければならなくなる。

また、neuronkeyの出力は活性化関数によって制限される。シグモイドは(0;1)、レルは(0;inf)です。目標値は別の間隔にスケーリングする必要があります。間隔 (-7;7) の出力は、多くのパケットでは単に達成不可能です。

すべてのデータをcf 0 st.off 1でスケーリングしています。

は、-1;1 をターゲットにすることが可能です。しかし、これは出力ニューロンがタンジェント活性化を持つ場合にのみ本当に必要なことです。

同様のケースでSigmoidの場合は0:;1。

また、そこにアイデンティティがあれば、その必要はありません。 しかし、実際のデータ範囲を考慮する必要があります。ウェイトがそこまで飽和しないこともある。

そして、trayneの出力カーブで学習し、どこで止めるかテストしています。
 

もう一度、ガラケーを取り、nnetを訓練し、ログから完成したコードを取りました。ラトルがnnetで正しく動作しないので、トレーニングを時間内に停止させるコードを追加しました。

新しいデータでの最高のR^2 = 0.18。最高のネットワーク構成は、唯一の内層に1つのニューロンを持つ、かなりおかしな結果となった。内層にもう2つニューロンを入れても、ほぼ同じ結果になる。ニューロンの数を増やし続けると、グラフはネットワークの再学習が非常に早くなり、新しいデータに対するパフォーマンスが低下することを示唆している。

右のグラフでは、青い線がモデルの新しいデータで、20001ラインからです。あとはトレーニングとクロスバリデーションです。

畳み込みネットワークがリードしているようです。

ファイル:
 
Dr.Trader(ドクタートレーダー

もう一度、ガラケーを取り、nnetを訓練し、ログから完成したコードを取りました。ラトルがnnetで正しく動作しないので、トレーニングを時間内に停止させるコードを追加しました。

新しいデータでの最高のR^2 = 0.18。最高のネットワーク構成は、唯一の内層に1つのニューロンを持つ、かなりおかしな結果となった。内層にもう2つニューロンを入れても、ほぼ同じ結果になる。ニューロンの数を増やし続けると、グラフから、ネットワークの再学習が非常に早く、新しいデータに対してどんどん性能が落ちていくことがわかります。

右のグラフでは、青い線がモデルの新しいデータで、20001ラインからです。あとはトレーニングとクロスバリデーションです。

畳み込みネットワークがリードしているようです。

結果は上々!おめでとうございます!私のシンプルなNSに勝りましたね。

チップを用意したり、そのままラグを食べさせたりしたのでしょうか?この問題は、純粋なラグでは解決できないようです。チップの下ごしらえが必要です。

接線方向の活性化を行った後、出力を逆変換しなかったか、あるいは他の何かです。

そして、参考までに。mxnetパッケージのコンバージドネットワーク(深層学習)。今のところgitを使ったバージョンだけ。でも、基本的なものはちゃんと動くんですよ。
 
アレクセイ・ブルナコフ

そして、参考までに。mxnetパッケージのコンバージドネットワーク(深層学習)。今のところgitを使ったバージョンだけ。しかし、基本的にはすべてうまくいきます。

余談ですが私mxnetの ヘルプを求め、mxnetのパッケージを指差したとき、皆は何も言わず黙っていました。:)私もずいぶん前に注目したquantstratというパッケージに、100ページも経てば誰かが気づいてくれるだろうか......。

でも、私は賢くないし、あまり理解できないし、英語も苦手で、あなたの4行のコードに説明をつけても、正しく理解するのに何週間もかかるかもしれないし、それでもいつも成功するとは限りません。

 
mytarmailS:

蛇足ながら私 が畳み込みネットワークについて助けを求め、MXnetのパッケージを指摘したとき、みんな黙って何も言わなかったのに、私が50ページ前に話していたことに突然興味を示した。:)私もずいぶん前に注目したquantstratというパッケージに、100ページも経てば誰かが気づいてくれるだろうか......。

でも、私は賢くないし、あまり理解できないし、英語も苦手で、あなたの4行のコードに説明をつけても、正しく理解するのに何週間もかかるかもしれないし、それでもいつも成功するとは限りません。

ただ、同僚さん、素晴らしいコメントですね。) ハ

私のビジョンに沿って、順を追ってお答えします。

1)ここにいる9割の人は、自己満足、思考段階、実験段階によって動いている。そのため、良いアイデアでも長い間お蔵入りになってしまうことがあるのです。面白い事例や課題を提示しないので、誰も興味を示さないのです。シンプルでしょう?

2)知識を得るための戦略には、「掘り下げる」「悶々とやってみる」の2つがある(程度の差こそあれ、みんなやっている。例えば、「村人よ、稼ぐことを学べ!」のスレッドで、数年かけて使えるExpert Advisorの動作検証をしていたオッサンを思い出した。そして、それらはすべて失敗した)。また、誰かが助けてくれて、既製のものを投稿してくれることを期待して待つという方法もあります。そのため、事情があって2番目の戦略を選択した場合、既製のEAの待ち時間が非常に長くなる可能性があります。

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でのスケーリングも試しましたが、それ以降は(-0.2;0.2)の範囲でネットワークが結果を出すようになりました。なぜか結果はいつも必要以上に狭い範囲に収まってしまう。おそらく、わずか250回の反復ですぐに学習が止まってしまったことが原因だろう。
さらにニューロンを追加し、学習を止めなければ、最後にはネットワークが正しい不変量を学習することになる。学習データで100%の精度を得るには、内層100ニューロンでほぼ十分である。ログによると、20000*0.7(後で修正)の 全結果の残差和は200程度でした。しかし、この場合、クロスバリデーションの結果は、必要なものと全く相関がなくなり、必要な区間ではあるが、単なるランダムな値になってしまう。

 
Dr.トレーダー

すべて原文のまま、手を加えずに提出しました。正しい指標の値を計算し、予測にも利用することで、より良い結果を得ることができるのではと思います。しかし、どれが正しい指標なのでしょうか?(修辞的な質問で、まだ答えはない)。

答えの「-1;1」についてですが、全部おかしいです。最後のニューロンの出力は、活性化関数を持たない線形であり、つまり何にも制限されない。目標値も-1;1でスケーリングしてみましたが、それ以降は(-0.2;0.2)の範囲で結果が出力されるようになりました。なぜか結果はいつも必要以上に狭い範囲に収まってしまう。おそらく、わずか250回の反復ですぐに学習が止まってしまったことが原因だろう。
さらにニューロンを追加し、学習を止めなければ、最後にはネットワークが正しい不変量を学習することになる。学習データで100%の精度を得るには、内層100ニューロンでほぼ十分である。対数によると、20000*100の予測変数の残差の合計は約200でした。しかし、クロスバリデーションの結果は、全く相関がなく、必要な区間ではあるが、ただのランダムな値になってしまう。

それは面白いですね。考えないといけないですね。

HH: おそらく、この範囲[-1;1] では、ネットワークは入力で最も一貫した信号を得て、この関数の断片は最もモデル化しやすい(NSは最も簡単なものを学習する)。そしてもちろん、勾配降下が最小値を見つけたときにも、この変形をする。反論の余地なし...。

よし、まだ練習したいという人のために、ヒントをつけてあげよう。

まず、R^2 0.55は、「メタ関数」に何らかの小さな関数変換を施すことで、本当に実現することができます。もうひとつは、見た目がちょっと複雑な機能になってしまうことです。

また、取るようにしてください。

rowMeans(df[, 1:10])

rowMeans(df[, 1:20])

rowMeans(df[, 1:30])

...

rowMeans(df[, 1:100])

これら10個のメタフィッシュには、意味のある入力の望ましい組み合わせが含まれています。

ところで、畳み込み層は、どこを掘ればいいのかが分かれば、学習過程ですでにそれを拾い出すことができます。

なぜ催促しているかというと、実は、マッピングするものがわかっていても、出力近似を再現するために頑張る必要があるからです。また、内部の人間として、解決できない問題を人に売りつけようとする感覚は好きではありません。

 
アレクセイ・ブルナコフ

ただ、同僚さん、素晴らしいコメントですね。) ハ

私のビジョンにそって、一点一点お答えします。

お気持ちはわかります、もっと荒っぽい対応を期待していました、叩かないでくれてありがとうございます)) そしてコードもありがとうございます、今は別のアイディアで忙しいので週末に何とか しようと思います・・・。

助けが必要だ...

slidingで共和分検定をしたいのですが、エラーが出ます...。

静的なデータでの簡単なテストです。


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(非NA)例

スライディングウィンドウテスト

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 "が原因だそうですが、私はそれを持っていません、それは確か です...。

何が問題 なのか、教えてください。

理由: