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

 
interesting articlehttps://geektimes.ru/post/144405/, 多分、誰かがRでこれをシミュレートする方法を理解するでしょう。
Прогнозирование финансовых временных рядов
Прогнозирование финансовых временных рядов
  • geektimes.ru
Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста. Пометьте топик понятными вам метками, если хотите или закрыть
 

先ほどの動機から、クラスターを使った実験を始めました。問題が発生しました。1つのクラスターに対応するピースから価格を接着しようとしたところ、接着した場所が価格のギャップになってしまいました(これは論理的なことですが、私には思いつきませんでした))。)問題は、これらのギャップをどう解決するかです

#  типа какая то цена
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.トレーダー

私もこの問題を抱えています。通常、attributes(KZP)を実行して利用可能な変数のリストを取得し、KZP$windowなどの変数を調べて必要な数値を見つければよいのです。しかし、ここでは、これらの数値は関数Summary自体で生成され、どこにも保存されません。

以下はソースコードです。https://cran.r-project.org/web/packages/kza/index.html、このように実行する必要があります。

ところで、あなたが指標を使用する場合、それはあなたのために有用であるかもしれません、この関数は、非常にノイズの多いデータの周期的なコンポーネント、短い期間で検出し、この期間は、市場で絶えず変化しています。

他の人がやっているような固定的なパラメーターではなく、常にこの支配的な期間を特定し、それに合わせて指標を調整することです。この方法をごく表面的にランダムなデートで試してみたところ、通常のアプローチと比較してポジティブな結果が得られました。RSIインジケータを使用したところ、固定パラメータでは負け、適応パラメータでは稼ぎました。使いたい人は使えばいいし、研究結果を読んでみたい人もいるはずだ

 
mytarmailS:

先ほどの動機から、クラスターを使った実験を始めました。問題が発生しました。1つのクラスターに対応するピースから価格を接着しようとしたところ、接着した場所が価格のギャップになってしまいました(これは論理的なことですが、私には思いつきませんでした))。)問題は、これらのギャップをどう解決するかです

価格系列を対数化し、差分系列に変換する。シリーズを接着するために、見つかった条件に対応する間隔だけをシリーズに残します。そして、この系列から和算によって新しい系列を作る。そして、必要であれば、その後に露出させる。
 
アントン・ズベレフ
価格系列を対数化し、差の系列に変換する。シリーズを接着するために、見つかった条件に対応する区間だけを残す。そして、この系列から和算によって新しい系列を作る。そして、必要であれば、その後に露出させる。
ありがとうございます、だいたいイメージ通りです、やってみましょう
 

さらに興味深いことを学びました。

先ほど掲載した予測変数の選別関数(designTreatmentsN$scoreFrame)は、明らかに最終的な予測変数のセットを与えていません。100%相関のある予測変数の削除もできないし、欲しいものが削除されるかもしれないし、ゴミが残るかもしれない。私は、彼らのふるい分け方法を少し複雑にしました。最初は、designTreatmentsN$scoreFrameを介して、古い方法で予測変数をふるい分けました(潜在的に良い予測変数をふるい落とすために、しきい値を2倍-2/Nに増やしました)。そして,相関が0.99を超える予測変数はすべて削除します(差分と合計をランダムに生成した結果,たくさんの予測変数ができました).そして、ターゲット変数ではなく、予測因子同士の相関を見ます)。そして、残った予測変数の中から最適なものを遺伝的に 探し出すのです。

主成分の記事から別のものを使ってみたりしています。以下の関数は、主成分モデルを構築し、見つかった主成分をすべて使用した場合の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ではフロントテストに37%の誤差があったのに、R^2=0.3では45%に増えていることです。多分、問題は、予測変数のセットに、より多くのバーとより多くの指標を追加したことです。一歩進んで二歩下がる。今度は指標を全部分析して、不要なものを削除する必要があるんだ。あるいは、主成分モデルがFXに適用できないだけかもしれません(検証は難しく、まずR^2 > 0.95を達成し、fronttestでどんな結果になるかを見る必要があり、訓練されていないモデルでは結論を出すのは早計です)。

また、GAパッケージ(genetics)とGenSA(gradient annealing、Alexeyの例)を比較しました。どちらのパッケージも同じ結果になりました。遺伝子がマルチスレッドで動く方法を知っているので、間に合わせで勝ったのです。でも、GENSAは一本道で勝てるようです。また、結果をキャッシュする仕掛けもあり、Alexはそれを喜ぶと思います。

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.トレーダー

さらに興味深いことを学びました。

以前掲載した予測因子をふるいにかける関数(designTreatmentsN$scoreFrame)は、明らかに最終的な予測因子のセットを与えてはいない。100%相関のある予測変数の削除もできないし、欲しいものが削除されるかもしれないし、ゴミが残るかもしれない。私は、彼らのふるい分け方法を少し複雑にしました。最初は、designTreatmentsN$scoreFrameを介して、古い方法で予測変数をふるい分けました(潜在的に良い予測変数をふるい落とすために、しきい値を2倍-2/Nに増やしました)。そして,相関が0.99を超える予測変数はすべて削除します(差分と合計をランダムに生成した結果,たくさんの予測変数ができました).そして、ターゲット変数ではなく、予測因子同士の相関を見ます)。そして、残った予測変数の中から最適なものを遺伝的に 探し出すのです。

主成分の記事から別のものを使ってみたりしています。以下の関数は、主成分モデルを構築し、見つかった主成分をすべて使用した場合のR^2を返します。記事中の別の例のように「Yスケール」があるわけではありませんが、この方法の方が高速です。srcTableパラメータの最後の列は、ターゲット変数です。予測変数の値が少なすぎる場合、関数が一部のデータに適合しない場合、エラーが発生することがあります。

以前はR^2が0.1程度だったのですが、現在は0.3を達成しました。それでも足りず、最低でも0.95を使用することを推奨している。もう一つ不思議なのは、R^2=0.1ではフロントテストに37%の誤差があったのに、R^2=0.3では45%に増えていることです。多分、問題は、予測変数のセットに、より多くのバーとより多くの指標を追加したことです。一歩進んで二歩下がる。今度は指標を全部分析して、不要なものを削除する必要があるんだ。あるいは、主成分モデルがFXに適用できないだけかもしれません(検証は難しく、まずR^2 > 0.95を達成し、fronttestでどんな結果になるかを見る必要があり、訓練されていないモデルでは結論を出すには早すぎます)。

また、GAパッケージ(genetics)とGenSA(gradient annealing、Alexeyの例)を比較しました。どちらのパッケージも同じ結果になりました。遺伝子がマルチスレッドで動く方法を知っているので、間に合わせで勝ったのです。でも、GENSAは一本道で勝てるようです。また、結果をキャッシュする仕掛けもあり、Alexはそれを喜ぶと思います。

ポイントは、中間関数 fitness_GenSA_bin_Memoise は、そのような予測変数のセットが少なくとも一度は遭遇している場合、キャッシュからデータを取得することです。fitness_GenSA_bin にはフィットネス関数の計算結果そのものが格納され、一意のセットに対して一度だけ呼び出されます。

今のところ、インジケータの標準パラメータを使っているだけです。一般的に、D1を中心に開発された指標は、このタイムフレームでのみ標準的なパラメータを使用した方が有用であることは、私も同意します。D1からH1への結果シフトが全くできない、インジケータを使えば使うほどD1に引っかかる。インジケーターのパラメーターは、タイムフレーム、時間によって変える必要があることがわかりました、はい。

キャッシュについてはクールです。自分で書こうとしたんです。しかし、解決策は用意されている。Cueru.ありがとうございます。

また、オーバーシュート時に使用するフィットネス関数は?見逃した。線形依存性、あるいは何らかの統計学?
 
Dr.トレーダー

記事中の別の例のように「Yスケール」はありません。

それが、この記事のポイントだと思うんです。読み直したら、そうはっきり書いてある。

予測リストの作成という一般的なスキームに戻りますが。

ノイズ・スクリーニングは問題の一部に過ぎず、この分野の残りの問題や推奨事項を解決するものではありません。

これがすべて達成されると、次の作業アルゴリズムが次のようにループする。

1. 選択され、処理された予測変数のセットを取ります。このリストは不変です。

2.現在の ウィンドウについて、アルゴリズムの1つによって予測子を選択 する。例えば、caretには2つのアルゴリズムがあります。

3.モデルのフィッティング

4.

5.ウィンドウを移動して、手順2へ進みます。

ノイズ予測器の数は、最初に手にした予測器セットのうち、80個以上でした

そして、標準的なアルゴリズムでは、アルゴリズムがノイズとして分類しない残りの予測子の約半分を選択する。窓の移動に伴い、この半分の構成は常に変化しています。しかし、常にトレーニングセットでの誤差とサンプル外での誤差はほぼ等しい。このことから、私のモデルは過剰に訓練されておらず、これは上述の予測変数の選択アルゴリズムの結果であると結論づけられます。

 

また、ブルートフォース時に使用するフィットネス関数は何ですか?

以前はforestを学習させ、検証サンプルでエラーを返していました。原理的にはうまくいきました。森が少しでもオーバートレーニングになると、誤差が50%になる傾向があるのです。

今はGetPCrsquared()、その上のコードを使っています。feature_selector_modeller.txt にあるあなたの例も持っていますが、そこを理解して正しいコードの断片を得る必要があるので、まだ私のデータでテストしていません。

 
SanSanych Fomenko:

というのが記事の内容だと思います。読み直したら、はっきり書いてある。

Yスケールも試してみましたが、(Yスケールありとなしの)両方のケースでR^2が同じになりました(違うパッケージを使っているにもかかわらず!)。

Yスケールなら、もっと少ない主成分数で、同じような結果が得られるのではないでしょうか。しかし、すべてのコンポーネントを使用しても、満足のいく結果が得られない場合(私の場合)、違いはないのです。それに、今の私にとってより重要なのは、動作が速いことです。しかし,この方法が予測変数の 選択に適しているかどうかは,理論的にも実践的にも証明されていません.当初は,すべての予測変数で主要成分をモデル化し,成分の係数を見て予測変数を選択するというアイデアを持っていました.しかし、ゴミを追加すると、モデルのR^2が低下することに気づきました。いろいろな予測因子を試してみて、R^2が高いものを探すのが理にかなっていると思いますが、それでもあくまで理論上の話です。

理由: