記事「機械学習に基づく平均回帰戦略の作成」についてのディスカッション - ページ 8

削除済み  
sibirqk #:

もちろん、Savitsky_Golayの使用はmuveの使用と大差ありません。SGフィルターは、指定されたスライディング・ウィンドウにおける多項式回帰の中間点であり、指定された次数の多項式である。次数1の場合は、対応する期間のmuveと完全に一致します。

平均への回帰を特定するには、振幅フィルタリング(連動、連次、ジグザグ)を使う方が理にかなっていると私は思います。HgとLwの差は一定です。HgとLwの差は一定ですから。

まあ、ZZはより悪いことが証明されている。
削除済み  

フーリエ分解と特異値分解は、フィルターとして非常に優れている。私はパラメータの選択には関与していない。


削除済み  

記事の最初のマークアップ関数に基づき、フィルタリング処理に指数関数的 減衰を加えた例。最後の例は、より最近のデータを調整するために、マークアップでより多くの重みが与えられている。

def get_labels_filter(dataset, rolling=200, quantiles=[.45, .55], polyorder=3, decay_factor=0.95) -> pd.DataFrame:
    """
    Generates labels for a financial dataset based on price deviation from a Savitzky-Golay filter,
    with exponential weighting applied to prioritize recent data.

    Args:
        dataset (pd.DataFrame): DataFrame containing financial data with a 'close' column.
        rolling (int, optional): Window size for the Savitzky-Golay filter. Defaults to 200.
        quantiles (list, optional): Quantiles to define the "reversion zone". Defaults to [.45, .55].
        polyorder (int, optional): Polynomial order for the Savitzky-Golay filter. Defaults to 3.
        decay_factor (float, optional): Exponential decay factor for weighting past data. 
                                        Lower values prioritize recent data more. Defaults to 0.95.

    Returns:
        pd.DataFrame: The original DataFrame with a new 'labels' column and filtered rows:
                       - 'labels' column: 
                            - 0: Buy
                            - 1: Sell
                       - Rows where 'labels' is 2 (no signal) are removed.
                       - Rows with missing values (NaN) are removed.
                       - The temporary 'lvl' column is removed. 
    """

    # Savitzky-Golayフィルターを使って平滑化された価格を計算する。
    smoothed_prices = savgol_filter(dataset['close'].values, window_length=rolling, polyorder=polyorder)
    
    # 実際の終値と平滑化価格との差を計算する。
    diff = dataset['close'] - smoothed_prices
    
    #「diff」の値に指数関数的な重み付けを適用する
    weighted_diff = diff * np.exp(np.arange(len(diff)) * decay_factor / len(diff)) 
    dataset['lvl'] = weighted_diff # 重み付けされた差を'lvl'として追加する。

    # NaN値の行を削除する 
    dataset = dataset.dropna()
    
    # lvl'列の分位数(価格偏差)を計算する。
    q = dataset['lvl'].quantile(quantiles).to_list() 

    # 終値と計算された'lvl'の値をNumPyの配列として取り出す。
    close = dataset['close'].values
    lvl = dataset['lvl'].values
    
    # calculate_labels_filter」関数を使って売買ラベルを計算する。 
    labels = calculate_labels_filter(close, lvl, q) 

    # 計算されたラベルの長さに合うようにデータセットをトリミングする
    dataset = dataset.iloc[:len(labels)].copy()
    
    # 計算されたラベルを、新しい「labels」列としてDataFrameに追加する。
    dataset['labels'] = labels
    
    # NaN値の行を削除する
    dataset = dataset.dropna()
    
    # ラベル」列の値が2.0(売りシグナル)の行を削除する。
    dataset = dataset.drop(dataset[dataset.labels == 2.0].index)
    
    # lvl' カラムを削除した変更後の DataFrame を返す。
    return dataset.drop(columns=['lvl'])


  • decay_factorパラメータ(デフォルト0.95)をコードに追加し、過去のデータに与える重みを制御する。
  • 各データポイントについて、np.exp(np.arange(len(diff))) を用いて重みを計算する。* decay_factor / len(diff))を用いて重みを計算し、それに差分値を乗じる。これにより、最近の差分にはより大きな重みが与えられ、古い差分にはより小さな重みが与えられる。重み付けされた「lvl」カラム: lvlカラムに指数関数的に重み付けされた差分が格納されるようになり、マークアップ処理が最近の値動きに敏感に反応するようになった。
  • decay_factorの値を小さくする(0に近づける)と、重み付けがより積極的になり、最近の価格変動をより強く強調します。つまり、平滑化された価格トレンドからの最近の乖離に対して、 アルゴリズムがより速く反応するようになります。
  • decay_factorの値を大きくすると(1に近くなる)、加重がよりスムー ズになり、過去のデータをより重視するようになります。これは、短期的なノイズの影響を低減し、長期的なトレンドを識別するのに有用である。
削除済み  

より短いインターバル、例えば2018年から2024年まででトレーニングする場合、ハイパーパラメータでn_clusters = 10とすると、ほとんど取引が得られない可能性がある。クラスター数を例えば5-3に減らすと、より多くの取引が得られるようになります。

このように、より短い期間で訓練し、さまざまなパラメータを変化させることで、その期間で良いパターンを探すことができます。

また、取引サンプラーのフィルター周期(Savitzky-Golei フィルターやスプライン)を短くすることもできます。


 
こんにちは、マックス!マキシム・ドミトリエフスキー」の記事を楽しみにしていることをお伝えしたくて書きました。あなたが投稿する各記事を勉強するために、私は過去2年間、あなたの仕事を注意深く見てきました。私はブラジル出身で、勉強し、新しい価値あるものを学んでいます。

私は心の底から、マキシム、あなたが知識研究を共有し続け、メタクォーツチームが尊敬される著者としてあなたを評価し、あなたが素晴らしい仕事を続けることを奨励するために「利益を共有」することを願っています。マキシム、あなたが最高であることを願っています!

どうか@MetaQuotesと@MetaQuotes @alexx チーム、この男に昇給を与えてください!彼はそれに値します <3

ブラジルからの挨拶
Maxim Dmitrievsky
Maxim Dmitrievsky
  • 2025.03.07
  • www.mql5.com
Профиль трейдера
削除済み  
Vinicius Barenho Pereira #:
こんにちは、マックス!マキシム・ドミトリエフスキー」の記事を楽しみにしていることをお伝えしたくて書きました。あなたが投稿する各記事を勉強するために、私は過去2年間、あなたの仕事を注意深く見てきました。私はブラジル出身で、勉強して新しい価値あるものを学んでいます。

私は心の底から、マキシム、あなたが知識研究を共有し続け、メタクォーツチームが尊敬される著者としてあなたを評価し、あなたが素晴らしい仕事を続けることを奨励するために「利益を共有」することを願っています。マキシム、あなたが最高であることを願っています!

どうか@MetaQuotesと@MetaQuotes @alexx チーム、この男に昇給を与えてください!彼はそれに値する <3

ブラジルからの挨拶

ありがとう。将来、何か面白いこと、役に立つことをやってみるよ。)

 

この記事の最後では、Pythonでさまざまな機械学習モデルを 訓練し、MetaTrader 5取引ターミナルの取引システムに変換することが可能になります。

もっと詳しく調べてみます!

削除済み  
Roman Shiredchenko 機械学習モデルを 訓練し、MetaTrader 5取引ターミナルの取引システムに変換することが できます。

この記事に感謝します!

どういたしまして。)
 

こんにちは、Maximです、

Pythonのget_features関数とMetaTrader 5のget_features関数の値生成に問題を見つけました。

この問題はPythonの "skew "統計量とMQL5の "skewness "統計量にあります。私が行ったテストでは、2つの言語によって生成された値はわずかに異なっています。例えば

MQL5では-0.087111
、Pythonでは
-0.092592

これは些細なことに思えるかもしれませんが、meta_labelsを分類した後、これは予測の遅れにつながり、EAが通常ローソク足を1本遅らせてエントリーする原因となり、ストラテジーを効果的なものにしてくれません。MQL5ではこの統計値を使用しないか、同じ値になるように手動で計算することをお勧めします。

ブラジルからのご挨拶

削除済み  
KleversonGerhardt #:

こんにちは、マキシム、

PythonとMetaTrader 5のget_features関数の値生成に問題を見つけました。

この問題はPythonの "skew "統計量とMQL5の "skewness "統計量にあります。私が行ったテストでは、2つの言語によって生成された値はわずかに異なっています。例えば

MQL5では-0.087111
、Pythonでは
-0.092592

これは些細なことに思えるかもしれませんが、meta_labelsを分類した後、これは予測の遅れにつながり、EAが通常ローソク足を1本遅らせてエントリーする原因となり、ストラテジーを効果的なものにしてくれません。MQL5ではこの統計量を使用しないか、同じ値に一致させるために手動で計算することをお勧めします。

ブラジルからのご挨拶

ありがとうございます!確認してみます。