ロングショート線形クロスオーバー戦略


作成日: 2024-03-27 17:52:02 最終変更日: 2024-03-27 17:52:02
コピー: 0 クリック数: 576
1
フォロー
1617
フォロワー

ロングショート線形クロスオーバー戦略

概要

多空線形交差策略は,線形回帰モデルに基づく株式の将来の価格動向を予測する技術分析策策である.策略の基本原理は,株価の動向は,一定の線形トレンドに従う傾向があり,価格の線形回帰を計算することによって,将来の価格を予測することができる.予測価格が現在の価格を上回るときに多めに,下を通るときに平めにする.

戦略原則

この戦略は,まず,期間中の株価の線形回帰を計算する. 線形回帰は,最小二乗を用いて,価格が時間とともに変化する傾向を表す直線を整合する. 戦略は,予測価格線と現在の価格をグラフに描く.

政策は2つの信号を定義しています.

  1. 複数のシグナルで,予測価格が現在の価格の上に乗るときにトリガーされます.
  2. 空気シグナル:予測価格が現在の価格を下回った時に発動する

多行シグナルが出たとき,戦略で多行を; 短行シグナルが出たとき,平行を.

戦略の重要なステップは以下の通りです.

  1. 価格の線形回帰を計算する
  2. 予想価格と現在の価格の線をグラフに描く
  3. オーバーとオフの信号を定義する
  4. 複数のシグナルがトリガーされれば,より多くのポジションが作られます.
  5. 空気信号が発動すると平仓

優位分析

多空線形交差策には以下の利点があります.

  1. シンプルで効果的: この戦略は論理的に明確で,実行しやすいもので,価格の線形的な傾向を捉えることができます.
  2. 戦略は,トレンド状況と震動状況の両方で取引信号を生成します.
  3. 最適化性強:戦略には,線形回帰周期,移動平均などの重要なパラメータが含まれ,これらのパラメータを最適化することで,戦略の性能を向上させることができる.

リスク分析

多空線形交差策には多くの利点があるが,いくつかのリスクもある.

  1. トレンド認識リスク:価格が線形なトレンドに従わない場合,例えば揺動的な動きの場合,策略は誤ったシグナルを生じることがあります.MACDなどの他の指標と組み合わせることでリスクを軽減することができます.
  2. パラメータ設定のリスク:戦略性能はパラメータ設定に敏感であり,不適切なパラメータは損失を引き起こす可能性がある.したがって,実盤前に十分なパラメータの反測と最適化が必要である.
  3. 過適合のリスク:パラメータを過度に最適化すると,戦略が過去データに過適合し,将来のパフォーマンスは悪くなる可能性があります.過適合を避ける方法には,単純化,データセット外テストなどがあります.

最適化の方向

  1. 他の指標と結合: 線形回帰信号は,MACD,ブリン帯など他の技術指標と結合して,信号の正確性を向上させることができる.
  2. ダイナミックパラメータ最適化:パラメータの自己適応メカニズムを設計して,市場の状況に応じてパラメータを動的に調整して,適応性を向上させることができる.
  3. リスク管理モジュールへの追加: ストップ・ロス,資金管理などのリスク管理措置を戦略に追加し,単一取引のリスクを軽減し,累積収益を向上させる.
  4. 機械学習最適化:機械学習アルゴリズムを使用して,線形帰帰帰モデルを継続的に最適化し,予測をより正確にする.

要約する

多空線交差策略は価格の線形回帰を基礎として,価格と現在の価格を比較して取引信号を生成する.この策略の論理はシンプルで明快で,価格の線形傾向を捉え,あらゆる状況に適用できる.同時に,策略は実装・最適化が容易で,パラメータを柔軟に調整し,他の指標と組み合わせ,リスク管理モジュールなどを追加して,戦略のパフォーマンスを継続的に向上させることができる.しかし,策略には,トレンドの不正確さ,パラメータの設定の不適切さ,歴史データの過度なフィットネスのリスクなども存在し,実際の運用では慎重である.全体的に,多空線交差策略はシンプルで効果的な量化取引策略であり,さらなる探索と最適化の価値があります.

ストラテジーソースコード
/*backtest
start: 2024-02-25 00:00:00
end: 2024-03-26 00:00:00
period: 3h
basePeriod: 15m
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 Cross", overlay=true, margin_long=100, margin_short=0)

//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 = 'Strategy Length')
linearlen=input(defval = 9, title = 'Linear Lookback')
[a, b] = linregs(price, vol, len)

// Calculate linear regression for stock price based on volume
//eps = request.earnings(syminfo.ticker, earnings.actual)
//MA For double confirmation

out = ta.sma(close, 200)
outf = ta.sma(close, 50)
outn = ta.sma(close, 90)
outt = ta.sma(close, 21)
outthree = ta.sma(close, 9)

// 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

//MACD
//[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9)

// Plot predicted stock price
plot(predicted_price, color=color.rgb(65, 59, 150), linewidth=2, title="Predicted Price")
plot(ta.sma(predicted_price,linearlen), color=color.rgb(199, 43, 64), linewidth=2, title="MA Predicted Price")
//offset = input.int(title="Offset", defval=0, minval=-500, maxval=500)
plot(out, color=color.blue, title="MA200")
[macdLine, signalLine, histLine] = ta.macd(predicted_price, 12, 26, 9)

//BUY Signal

longCondition=false
mafentry =ta.sma(close, 50) > ta.sma(close, 90)
//matentry = ta.sma(close, 21) > ta.sma(close, 50)
matwohun = close > ta.sma(close, 200)
twohunraise = ta.rising(out, 2)
twentyrise = ta.rising(outt, 2)
macdrise = ta.rising(macdLine,2)
macdlong = ta.crossover(predicted_price, ta.wma(predicted_price,linearlen))  and (signalLine < macdLine)
if macdlong and macdrise
    longCondition := true

if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)
//Sell Signal
lastEntryPrice = strategy.opentrades.entry_price(strategy.opentrades - 1)
daysSinceEntry = len
daysSinceEntry := int((time - strategy.opentrades.entry_time(strategy.opentrades - 1)) / (24 * 60 * 60 * 1000))
percentageChange = (close - lastEntryPrice) / lastEntryPrice * 100
//trailChange = (ta.highest(close,daysSinceEntry) - close) / close * 100

//label.new(bar_index, high, color=color.black, textcolor=color.white,text=str.tostring(int(trailChange)))
shortCondition=false
mafexit =ta.sma(close, 50) < ta.sma(close, 90)
matexit = ta.sma(close, 21) < ta.sma(close, 50)
matwohund = close < ta.sma(close, 200)
twohunfall = ta.falling(out, 3)
twentyfall = ta.falling(outt, 2)
shortmafall = ta.falling(outthree, 1)
macdfall = ta.falling(macdLine,1)
macdsell = macdLine < signalLine
if macdfall and macdsell and (macdLine < signalLine) and ta.falling(low,2)
    shortCondition := true

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