線形 MACD TradingView で線形回帰の魔法を解き放つ


作成日: 2023-12-15 10:22:50 最終変更日: 2023-12-15 10:22:50
コピー: 0 クリック数: 928
1
フォロー
1621
フォロワー

線形 MACD TradingView で線形回帰の魔法を解き放つ

策略名:動力駆動の線形MACD策略

概要:これは,株価を予測する線形回帰を活用し,MACD指数と組み合わせた定量策である. 線形回帰を活用して,歴史的な価格と取引量を分析し,将来の価格傾向を予測する. 利益の機会が生じたときに,MACD指数と組み合わせて,入場タイミングを判断する.

戦略の原則:

  1. 価格の線形回帰係数を計算する. 将来の価格を予測するために,歴史的な取引量に基づいて線形回帰線を合わせる.
  2. 予測価格の描画:ステップ1の帰帰帰係数に基づいて,価格の予測ラインを描画する.
  3. 買取シグナルを生成する:予測価格が開盤価格と閉盤価格の間にあり,MACDが上昇すると,買取シグナルを生成する.
  4. 販売シグナルを生成する:MACDが下落し,同時に価格が予測価格より低いとき,販売シグナルを生成する.

優位分析: これは,統計予測と技術指標判断を組み合わせた戦略である. それは,線形回帰を利用して価格予測を導き,主観的な推測を避けている. 同時に,MACD指標は,市場の買取力方向を効果的に判断し,機会を正確に捉える. 全体的に,これは,体系化程度が高く,予測が正確で,リスクが制御可能な戦略である.

リスク分析: 線形回帰は,歴史データのみに依存し,重大利空ニュースなどの突発的な出来事に対して不敏感であり,誤信号を生じることがあります.また,回帰周期長さなどのパラメータ設定も,戦略のパフォーマンスに影響を与えます.我々は,曲線振動が戦略に与える影響を軽減するために,vwmaの平滑予測価格を採用することを推奨します.

改善する方向: この戦略は,以下の観点から改善できる:

  1. ストップ・メカニズムの加入. 価格がストップ・ラインを破るときに平仓し,個々の誤信号による損失を効果的に制御する.
  2. 機械学習モデルの導入.より効率的なモデルを使用して,価格動向を予測し,戦略の正確性を向上させる.
  3. 感情指数と組み合わせて. 市場恐怖指数などの感情指数を導入し,市場での買い物雰囲気を判断し,戦略の勝率を向上させる.
  4. 複数の時間枠を組み合わせます.異なる時間周期の予測は相互に検証され,組み合わせ戦略を形成し,単一の時間枠の制限を軽減します.

結論から言うと この戦略は,線形回帰予測価格とMACD指標判断によって,体系化された量化取引戦略を形成する. 予測論理の明確性,リスクの制御性,最適化スペースの広さなどの優位性がある. 継続的な最適化と代によって,そのパフォーマンスはますます優れたものになるだろうと私たちは信じています. それは,科学的な予測方法を使用して量化取引を行うための考え方を私たちに提供し,私たちの深入な研究と応用に値する.

ストラテジーソースコード
/*backtest
start: 2023-12-07 00:00:00
end: 2023-12-14 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © stocktechbot

//@version=5
strategy("Linear On MACD", overlay=true, margin_long=100, margin_short=100)



fast_length = input(title="Fast Length", defval=12)
slow_length = input(title="Slow Length", defval=26)
tolerance = input.string(title="Risk tolerance", defval = "LOW", options=["LOW", "HIGH"])

chng = 0
obv = ta.cum(math.sign(ta.change(close)) * volume)
if close < close[1] and (open < close)
    chng := 1
else if close > close[1]
    chng := 1
else
    chng := -1
obvalt = ta.cum(math.sign(chng) * volume)
//src = input(title="Source", defval=close)
src = obvalt
signal_length = input.int(title="Signal Smoothing",  minval = 1, maxval = 50, defval = 9)
sma_source = input.string(title="Oscillator MA Type",  defval="EMA", options=["SMA", "EMA"])
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"])

// Calculating
fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
hist = macd - signal
//hline(0, "Zero Line", color=color.new(#787B86, 50))
//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below)))
//plot(macd, title="MACD", color=col_macd)
//plot(signal, title="Signal", color=col_signal)
[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9)

//Linear Regression

vol = volume

// Function to calculate linear regression
linregs(y, x, len) =>
    ybar = math.sum(y, len)/len
    xbar = math.sum(x, len)/len
    b = math.sum((x - xbar)*(y - ybar),len)/math.sum((x - xbar)*(x - xbar),len)
    a = ybar - b*xbar
    [a, b]

// Historical stock price data
price = close

// Length of linear regression
len = input(defval = 21, title = 'Lookback')

// Calculate linear regression for stock price based on volume
[a, b] = linregs(price, vol, len)

// Predicted stock price based on volume
predicted_price = a + b*vol

// Check if predicted price is between open and close
is_between = open < predicted_price and predicted_price < close


// Plot predicted stock price
plot(predicted_price, color=color.rgb(218, 27, 132), linewidth=2, title="Predicted Stock Price")
plot(ta.vwma(predicted_price,len), color=color.rgb(199, 43, 64), linewidth=2, title="Predicted Stock Price")

//BUY Signal
lincrossunder = close > predicted_price
macdrise = ta.rising(macd,2)
//macdvollong = ta.crossover(macd, signal)
//macdlong = ta.crossover(macdLine, signalLine)
macdvollong = macd > signal
macdlong = macdLine > signalLine
longCondition=false
if macdlong and macdvollong and is_between and ta.rising(predicted_price,1)
    longCondition := true

if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)
//Sell Signal
lincrossover = close < predicted_price
macdfall = ta.falling(macd,1)
macdsell = macd < signal
shortCondition = false
risklevel = predicted_price
if (tolerance == "HIGH")
    risklevel := ta.vwma(predicted_price,len)


if macdfall and macdsell and (macdLine < signalLine) and (close < risklevel)
    shortCondition := true


if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)