記事「価格変動の角度分析:金融市場予測のためのハイブリッドモデル」についてのディスカッション

 

新しい記事「価格変動の角度分析:金融市場予測のためのハイブリッドモデル」はパブリッシュされました:

金融市場の角度分析とは何でしょうか。プライスアクションにおける「角度」をどのように活用すれば、機械学習によって67%の予測精度を達成できるのでしょうか。さらに、角度特徴量を用いた回帰モデルと分類モデルをどのように統合し、実用可能なアルゴリズムへと落とし込むことができるのでしょうか。ギャンはこれとどのような関係があるのでしょうか。価格変動の角度が機械学習において有効な指標である理由は何でしょうか。

毎日、為替、株式、先物のチャート上に何千本ものローソク足が形成されます。それらはパターンを構成し、トレンドを作り、レジスタンスとサポートを形成します。しかしその背後には、ほとんど意識されない数学的構造があります。それが、連続する価格点間の角度です。

EURUSDチャートを見てください。そこに見えるのは何でしょうか。ラインやバーでしょうか。ここで、隣接する2点間の各セグメントが水平軸に対して特定の角度を持つと考えてください。この角度には正確な数学的値があります。正の角度は上昇を意味し、負の角度は下降を意味します。角度が大きいほど、価格変動は急になります。

単純に見えますが、この単純さの中に深さがあります。角度は同一ではなく、それぞれがパターンを形成します。それは独自のリズムのようなものです。そしてこのリズムが、将来の市場動向の手がかりを含む可能性があります。


作者: Yevgeniy Koshtenko

 

3冊続けての出版、驚きです。"愚か者にも似たような考えがある"。:-)

私たちは、ほぼ同じことを同時に、独立して行っています。

コーナーと似たような口論が、唯一のカートの前に馬(予測される唯一のものは、個人的なバランスであり、引用符は気にしない):

私はガンについてスクリーンショットをしませんが、私の意見では - すべてがそことそこの角度=自然サイクルの典型的なボラティリティは悪くないです。
直感的に、個人的な経験によって、手元にあるものを持って、ガンは彼が推論したものを推論した。しかし、MACDよりも客観的な:-)

 
24小節はほんの一例ですか?
 

もう一つ質問です。

ONNXに結果をアップロードし、EAを実装する際、問題が発生しました。次元{1,31}のデータを最初の分類モデルに転送する際には問題はなく、次のような値が得られます。

2025.04.22 19:47:28.268 test_gann (ORDIUSDT,M5) directionUpDn = 1 directionStrength=0.44935011863708496


しかし、同じデータを2番目のモデルに渡すと、次のようなエラーが出続けます: ONNX: parameter is empty, inspect code '° :àh½5E' (705:10)。渡されたパラメータはいずれも0ではありません。

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 0, input_matrix[0][i] = -12.92599868774414

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 1, input_matrix[0][i] = -12.925998687414

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 2, input_matrix[0][i] = -42.55295181274414

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 3, input_matrix[0][i] = 72.71257781982422

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 4, input_matrix[0][i] = 74.29901123046875

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 5, input_matrix[0][i] = -61.42539596557617

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 6, input_matrix[0][i] = 56.164878845214844

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 7, input_matrix[0][i] = -80.11347198486328

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 8, input_matrix[0][i] = 79.91580200195312

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 9, input_matrix[0][i] = -48.93017578125

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 10, input_matrix[0][i] = 80.48663330078125

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 11, input_matrix[0][i] = -79.71015930175781

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 12, input_matrix[0][i] = -45.92404556274414

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 13, input_matrix[0][i] = -82.36412048339844

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 14, input_matrix[0][i] = -56.164878845214844

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 15, input_matrix[0][i] = -10.630552291870117

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 16, input_matrix[0][i] = 62.323272705078125

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 17, input_matrix[0][i] = 13.0

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 18, input_matrix[0][i] = 10.0

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 19, input_matrix[0][i] = -12.92599868774414

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 20, input_matrix[0][i] = -61.48434829711914

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 21, input_matrix[0][i] = -36.735313415527344

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 22, input_matrix[0][i] = -23.80649185180664

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 23, input_matrix[0][i] = 0.33333332674408

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 24, input_matrix[0][i] = 6.955999851226807

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 25, input_matrix[0][i] = 0.029581977054476738

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 26, input_matrix[0][i] = -0.5281187295913696

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 27, input_matrix[0][i] = 0.4025301933288574

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 28, input_matrix[0][i] = 420.0

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 29, input_matrix[0][i] = 641.6666870117188

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 30, input_matrix[0][i] = 0.6545454263687134

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) ONNX: parameter is empty, inspect code '° :àh½5E' (705:10)

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) 実行エラー です:5805

もしかしたら、このエラーについて教えてくれるかもしれない(広大なインターネットは役に立たなかった)。




 

netronaでは、モデル自体は正常に表示される。

ファイル:
 

バーの指標:バック=60、フォワード=30

訓練精度:0.9200|テスト精度:0.8713|GAP:0.0486

訓練F1スコア:0.9187|テストF1スコア:0.8682|GAP:0.0505


CatBoostは短い距離ではうまくいかない、モデルは過剰訓練されている

 
このコードを実行するには、seabornがインストールされている必要がある:
インポート seaborn as sns
 

こんにちは、 エフゲニー

とても素晴らしく、興味深い仕事だ。おめでとう。

バックテストは データセット全体に対して行われたのでしょうか?トレーニングセットも含まれているような気がするのですが、私の勘違いでしょうか?

 
Paolo Miocchi バックテストは データセット全体に対して行われたのでしょうか?トレーニングセットも含まれているような気がするのですが、私の勘違いでしょうか?

詳細に注意してください。


テストのタイムフレームは4ヶ月で、ざっと計算すると161280秒です。総取引回数は17500回を超え、平均取引時間は9数秒です。9秒間のEURUSDの平均的な動きを考えてみよう。儲けはない。このモデルの大部分は、価格シリーズを入力として使用する他のAIモデルと同様に、最後の価格を予測します。AIモデルは価格系列に非常に悪く収束します。

 
Enrique Dangeroux #:

細部にもご注目ください。


テストのタイムフレームは4ヶ月で、ざっと計算すると161280秒です。総取引回数は17500回を超え、平均取引時間は9数秒です。9秒間のEURUSDの平均的な動きを考えてみよう。儲けはない。このモデルの大部分は、価格シリーズを入力として使用する他のAIモデルと同様に、最後の価格を予測します。AIモデルは価格系列に非常に悪く収束します。

コードを調べると、バックテスト・ルーチンでは、予測された取引の確率が0.6を超えなければならないというチェック条件を作者が入れていないため、実際の条件よりもはるかに多くの取引が行われていることがわかります。そのため、実際の取引回数はそれよりはるかに少ない。
 
Aliaksandr Kazunka # :

バー・バック=60、フォワード=30

トレーニング精度:0.9200|テスト精度:0.8713|GAP:0.0486

トレーニングF1スコア:0.9187|テストF1スコア:0.8682|GAP:0.0505


短い距離では、CatBoostは何の役にも立たない。

こんにちは、Aliaksandr

このコードの問題は、train_test_score の

shuffle=True

引数の使用です。

これを

shuffle=False

に変更すると、パフォーマンスが大幅に低下します。というのも、テストセットとトレーニングセットが原理的には分割されて互いに切り離されているとしても、分割が非常に 細かいため、2つのセットの間には非常に 類似したXの「値」がたくさん存在するからです。実際、各X[i]とX[i+1]の間には1バーのシフトの違いしかなく、トレーニングセットとテストセットは実際には非常に似ている。したがって、(shuffle=Trueで)我々が目にする優れた結果は、本質的にオーバーフィッティングによるものである。シャッフルを取り除くと、テスト集合はある数の連続したバー(最新のバー)で構成され、CatBoost分類器はその中でうまく予測できなくなります。これは明らかにオーバーフィッティングの兆候です。この現象は、(シャッフルされていない)テスト・セット内のごく一部のバーでも発生するため、パフォーマンスの低下は市場環境の変化では説明できません。