暗号通貨市場における月の周期に基づいたモメンタム定量取引戦略

Lunar Calendar Cyclical Trading ETHUSDT Fixed Date Entry/Exit Quantitative Strategy
作成日: 2025-08-11 09:09:22 最終変更日: 2025-08-11 09:09:22
コピー: 0 クリック数: 182
2
フォロー
319
フォロワー

暗号通貨市場における月の周期に基づいたモメンタム定量取引戦略 暗号通貨市場における月の周期に基づいたモメンタム定量取引戦略

概要

この戦略は,カレンダー日に基づく暗号通貨取引方法であり,カレンダーサイクルの特定の日を活用して取引を行う.この戦略は,カレンダー新年から始まり,当年のカレンダー12月の終わりまで継続し,簡単な規則に従います:各カレンダー月の5日に購入し,各カレンダー月の26日に販売します.この方法は,カレンダーサイクルの関連性のある市場パターンを捕捉しようとし,トレーダーに構造化され,簡単に従うことができる取引の枠組みを提供します.この戦略は,手数料と滑り点の要因を考慮し,100%の可用資本投資を使用して,2020年から2026年の期間に適用されます.

戦略原則

この戦略の核心となる原理は,カレンダー周期が暗号通貨市場に与える影響に基づいている.コードは,以下の方法でこの理念を実現している.

  1. まず,2020年から2026年の周期をカバーする各年の暦新年の開始日と月々の日の数を定義します.
  2. 現在の暦月と日付を,現在の日付と暦新年の間の日数の差を計算して決定する.
  3. カレンダー日付が5日目であり,現在所持がない場合,買取シグナルをトリガーします.
  4. カレンダー日付が26日であり,ポジションを保有しているときは,セールシグナルをトリガーします.
  5. スライドポイントと手数料の影響を考慮して,利用可能なすべての資金を使って,できるだけ多くの暗号通貨を購入してください.
  6. 売却時,所有するすべての資産を清算し,利益を得たり,損失をなくしたりする.

策略は,正確な日付計算方法を使用し,各暦月の日を数列で保存し,暦新年からの合計の日数を累積して,現在の暦日付を正確に決定します.この方法は,取引シグナルの正確なトリガーを保証します.

戦略的優位性

この戦略のコードを分析すると,以下の利点が明らかになる.

  1. シンプルで明確なルール: 固定した買入と売却の日付は,戦略を非常に直感的で,理解し,実行しやすくし,トレーダーの主観的な判断を減らす.
  2. 市場摩擦を考慮する戦略は,手数料と滑点0.1%を考慮して,実際の取引環境に近い結果をもたらしました.
  3. 資金の利用効率が高く取引ごとに利用可能な資金の100%を使用し,潜在的利益を最大化します.
  4. 月経周期の独特な見方についてこの戦略は,伝統的な技術分析とは異なり,暦の要素を導入し,アジア市場における投資家の行動に関連する独特のパターンを捉えることができる.
  5. 長期にわたって戦略は2020年から2026年の暦データを提供し,トレーダーに長期的にこの方法を適用できるようにする.
  6. 視覚支援: グラフにカレンダー日付のタグを表示することで,トレーダーが戦略の実行を直視的に追跡できるようにする.
  7. 過剰な取引を避ける農月ごとに”回の取引のみで,過剰取引によるコストとリスクが軽減されます.

戦略リスク

この戦略は,上記の利点にもかかわらず,いくつかの潜在的リスクも伴います.

  1. リスク管理の欠如: 戦略は止損点を設定していないので,市場が買い後に急激に下落すれば,著しい損失を引き起こす可能性があります.
  2. 市場動向や現状を無視する戦略は,市場の全体的な傾向,波動性,または他の技術指標を考慮せずに,日付のみに基づいて取引する.
  3. 周期的な法則が存在すると仮定するこの戦略は,月経周期と暗号通貨の価格との何らかの関連性を想定していますが,この関連性は不安定または存在しない可能性があります.
  4. 特定の時間帯の制限2020年~2026年のデータを提供しているものの,将来の暦のデータは更新されなければならず,この範囲の外では戦略が機能しない可能性があります.
  5. 流動性のリスク市場流動性に関する問題,特に大金を使う場合.
  6. 日付計算誤差の可能性: 暦日付の計算に誤りがある場合,誤った取引信号が発生する可能性があります.
  7. 適応力の欠如: 固定取引日は,市場の状況の変化に適応できず,より良い買取や販売の機会を逃す可能性があります.

これらのリスクを軽減するために,トレーダーは,他の技術指標と組み合わせた取引の確認を考慮するか,単一取引の損失を制限するために固定ストップロスを設定することができます.

戦略最適化の方向性

プログラミングの詳細を分析すると,以下のような改善の方向性が見られます.

  1. ストップロスメカニズムの導入: パーセンテージまたは絶対金額のストップ条件を追加し,損失が特定の値に達すると自動的に平仓し,大幅な損失を回避します. 最適化コードは,類似の値を増やすことができますif strategy.position_size > 0 and close < entry_price * (1 - stop_loss_percent)条件を判断する

  2. 統合技術指標確認: 傾向指標 ((例えば移動平均) または動量指標 ((例えば相対的に強い指数RSI) を併用して,技術指標が有利なシグナルを提供している場合にのみ,暦日取引を実行する.

  3. 購入・売却日数を最適化する: 歴史的データを遡り,特定の日付の組み合わせがよりよいパフォーマンスを発揮する可能性がある5日と26日を固定して使用するのではなく,どの暦の日が組合せに実際に最高の購入と販売の機会を提供しているか分析する.

  4. 部分ポジション管理: 戦略を変更して,部分資金ではなく100%の資金で取引するか,市場変動の動向に応じてポジションサイズを調整して,リスクを分散する.

  5. 市場状況のフィルターを追加する: 極端な市場条件下 (例えば,波動が強い場合や,明らかな熊市の傾向など) で,戦略の実行を一時停止し,不利な状況で取引を避ける.

  6. 適用期間を拡大する: カレンダーデータを追加し,カレンダー日付を自動的に計算する関数を開発し,戦略を無期限に実行できるようにする.

  7. 多品種取引を増やすこと: 戦略を複数の暗号通貨または他の資産クラスに拡張し,異なる市場における農暦周期でのパフォーマンスの違いを観察する.

これらの最適化方向の実施は,戦略の堅強さと適応性を大幅に向上させ,そのシンプルで直感的な核心理念を維持することができます.

要約する

カレンダーサイクルに基づく暗号通貨取引戦略は,特定のカレンダー日付を利用して買取と販売の操作を行うためのユニークな取引の視点を提供します. この戦略の最大の優点は,単純な明確なルールと実行しやすい特性であり,カレンダーサイクルというユニークな要素を組み合わせて,通常の技術分析では無視される市場パターンを捉えることができます.

しかし,この戦略は,リスク管理と市場の適応性の欠如の問題にも直面しています.戦略の有効性を高めるために,ストップダメージメカニズム,技術指標の確認,購入と売買の日付の最適化などの改善措置を導入することが推奨されています.これらの最適化は,潜在的リスクを軽減するだけでなく,異なる市場環境下での戦略の適応性を強化します.

注目すべきは,あらゆる取引戦略は,実際の市場条件下でのそのパフォーマンスを検証するために,十分な反省と前向きなテストを必要としていることです. 交易者は,その戦略を採用する際,自身のリスク承受能力と投資目標に応じて適切な調整を行い,他の分析方法と組み合わせてより全面的な取引決定を行うべきです.

ストラテジーソースコード
/*backtest
start: 2024-08-11 00:00:00
end: 2025-08-09 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=5
strategy("Lunar ETHUSDT Trading 100% Invest with Fee & Slippage (2020~2026)", overlay=true, commission_type=strategy.commission.percent, commission_value=0.1)

// Fee and slippage settings
feePercent = 0.1    // 0.1%
slippageTicks = 3
tickSize = syminfo.mintick
slippage = slippageTicks * tickSize

// Function for lunar new year start date and monthly lengths by year
f_get_lunar_data() =>
    y = year(time)
    if y == 2020
        [timestamp("Asia/Seoul", 2020, 1, 25, 0, 0), array.from(29,30,29,30,29,30,29,30,29,30,30,29)]
    else if y == 2021
        [timestamp("Asia/Seoul", 2021, 2, 12, 0, 0), array.from(30,29,30,29,30,29,30,29,30,29,30,30)]
    else if y == 2022
        [timestamp("Asia/Seoul", 2022, 2, 1, 0, 0), array.from(29,30,29,30,29,30,29,30,30,29,30,29)]
    else if y == 2023
        [timestamp("Asia/Seoul", 2023, 1, 22, 0, 0), array.from(30,29,30,29,30,29,30,30,29,30,29,30)]
    else if y == 2024
        [timestamp("Asia/Seoul", 2024, 2, 10, 0, 0), array.from(30,29,30,29,30,29,30,29,30,29,30,30,29)]
    else if y == 2025
        [timestamp("Asia/Seoul", 2025, 1, 29, 0, 0), array.from(29,30,29,30,29,30,29,30,30,29,30,29)]
    else if y == 2026
        [timestamp("Asia/Seoul", 2026, 2, 17, 0, 0), array.from(30,29,30,29,30,29,30,30,29,30,29,30)]
    else
        [na, array.new_int()]

// Function to create cumulative monthly days array
f_get_lunar_md(days_arr) =>
    arr = array.new_int()
    sum = 0
    for i = 0 to array.size(days_arr) - 1
        sum += array.get(days_arr, i)
        array.push(arr, sum)
    arr

// Get lunar start date and monthly lengths
[ts_start, lunar_lengths] = f_get_lunar_data()
valid = not na(ts_start)
days_since = valid ? math.floor((time - ts_start) / 86400000) : na
cumulative = valid ? f_get_lunar_md(lunar_lengths) : na

// Declare lunar month, day, last day variables
var int lunar_month = na
var int lunar_day = na
var int lunar_last_day = na

// Calculate lunar date
if valid and not na(days_since) and days_since >= 0
    lunar_month := na
    lunar_day := na
    lunar_last_day := na
    for i = 0 to array.size(cumulative) - 1
        cum = array.get(cumulative, i)
        prev = i == 0 ? 0 : array.get(cumulative, i - 1)
        if days_since < cum
            lunar_month := i + 1
            lunar_day := days_since - prev + 1
            lunar_last_day := array.get(lunar_lengths, i)
            break
else
    lunar_month := na
    lunar_day := na
    lunar_last_day := na

// Buy condition: Lunar day 5 and no current position
buy_condition = not na(lunar_day) and lunar_day == 5 and strategy.position_size == 0

// Sell condition: Lunar day 26 and holding position
sell_condition = not na(lunar_day) and lunar_day == 26 and strategy.position_size > 0

// Buy/sell price adjusted for slippage and fee
price_buy = close + slippage
price_buy_with_fee = price_buy * (1 + feePercent * 0.01)

price_sell = close - slippage
price_sell_with_fee = price_sell * (1 - feePercent * 0.01)

// Calculate buy quantity using 100% of equity
qty = math.floor(strategy.equity / price_buy_with_fee)

// Buy order (limit)
if buy_condition and qty > 0
    strategy.entry("Lunar Buy", strategy.long, qty, limit=price_buy)

// Sell order (close all)
if sell_condition and strategy.position_size > 0
    strategy.close("Lunar Buy")

// True range variable (for label position adjustment)
tr = ta.tr(true)

// Date format creation
yr = year(time)
mo = month(time)
dy = dayofmonth(time)
mo_str = mo < 10 ? "0" + str.tostring(mo) : str.tostring(mo)
dy_str = dy < 10 ? "0" + str.tostring(dy) : str.tostring(dy)
solar_str = str.tostring(yr) + "-" + mo_str + "-" + dy_str

// Display solar and lunar date and position label (on bar close)
if barstate.islastconfirmedhistory and not na(lunar_day)
    label.new(bar_index, high - tr * 6,  "Solar: " + solar_str + "\nLunar: " + str.tostring(lunar_month) + "-" + str.tostring(lunar_day) ,
      style=label.style_label_up, size=size.normal, color=color.new(color.teal, 50), textcolor=color.white)

// Display "15" label at bottom on lunar day 15 (lowest of last 50 bars - 1 true range)
if not na(lunar_day) and lunar_day == 15
    low_offset = ta.lowest(low, 50) - tr
    label.new(bar_index, low_offset, "15", style=label.style_label_down, color=color.orange, textcolor=color.white, size=size.normal)