Volatiliti Dinamik Strategi Mengikuti Aliran Dilaraskan


Tarikh penciptaan: 2024-01-24 11:13:39 Akhirnya diubah suai: 2024-01-24 11:13:39
Salin: 0 Bilangan klik: 612
1
fokus pada
1617
Pengikut

Volatiliti Dinamik Strategi Mengikuti Aliran Dilaraskan

Gambaran keseluruhan

Strategi perdagangan sistematik yang unik ini berada dalam kategori trend-following. Ia menggunakan urutan harga yang disatukan dengan harga untuk menghasilkan isyarat perdagangan, dan bukannya menggunakan harga saham secara langsung. Strategi ini menggunakan teknik penyesuaian kedudukan dan pengurusan risiko yang lebih tinggi, yang biasanya digunakan hanya dalam pengurusan portfolio institusi, sebagai bukti penyesuaian kedudukan seperti penasihat perdagangan komoditi (CTA) dan pengurusan dana niaga hadapan.

Prinsip Strategi

Tahap harga yang disatukan adalah kadar pendapatan harian harga yang dikumpul dengan penyesuaian kadar turun naik yang dikira berdasarkan keseluruhan siri masa harga. Julat penyesuaian kadar turun naik ditentukan oleh pengguna.

Strategi perdagangan yang sangat sederhana, harga pengumpulan melakukan lebih banyak ke atas melintasi Hull Moving Average, ke bawah melintasi posisi kosong. Isyarat perdagangan baru akan secara proaktif menebus kedudukan terbalik yang lama.

Saiz pegangan berdasarkan kadar turun naik harga terkini dan sasaran risiko tahunan yang ditakrifkan oleh pengguna. Pada dasarnya, saiz kedudukan disesuaikan dengan kadar turun naik, lebih besar apabila turun naik rendah dan lebih kecil apabila turun naik tinggi. Kadar turun naik terkini adalah 14 hari perbezaan harga yang berbeza dengan standard pulangan harga, ditambah kepada kadar turun naik yang dijangkakan dalam tempoh satu tahun. Kemudian menyesuaikan kedudukan berdasarkan sasaran risiko tahunan yang ditetapkan oleh pengguna.

Penangguhan kerugian berdasarkan perkalian purata harga terkini yang boleh dikonfigurasi oleh pengguna.

Kelebihan Strategik

  • Menggunakan proses penyesuaian harga untuk mengurangkan kemungkinan isyarat palsu
  • Perubahan dinamik kedudukan, kawalan risiko yang berkesan
  • Hentikan Kerosakan Dalam Masa Nyata untuk Mengelakkan Kerosakan Besar
  • Strategi perdagangan mudah, intuitif dan mudah difahami

Risiko Strategik

  • Hull Moving Average sebagai penunjuk utama, agak ketinggalan
  • Menggunakan kadar turun naik untuk mengawal risiko kedudukan dan mungkin mengehadkan ruang keuntungan
  • Hentikan Kerosakan Berhampiran Dengan Kemungkinan Kerosakan

Langkah-langkah kawalan risiko termasuk menggunakan gabungan purata bergerak yang berbeza, menyesuaikan sasaran risiko kedudukan dan sebagainya.

Pengoptimuman Strategi

  • Uji keserasian pelbagai jenis purata bergerak
  • Optimumkan parameter purata bergerak
  • Cuba untuk melakukan lebih atau tidak.
  • Menyesuaikan Stop Loss untuk mencari titik terbaik
  • Ujian lain untuk halangan

ringkaskan

Strategi ini mengintegrasikan pelbagai risiko kawalan teknologi, seperti penggabungan harga, penyesuaian dinamik, dan penutupan kerugian. Ia menggunakan prinsip trend yang mudah untuk berdagang. Ia boleh disesuaikan dengan parameter dan dioptimumkan mengikut keadaan pasaran dan individu. Ia layak untuk diuji dan disahkan lebih lanjut, dan berpotensi untuk digunakan secara praktikal.

Kod sumber strategi
/*backtest
start: 2023-01-17 00:00:00
end: 2024-01-23 00:00:00
period: 1d
basePeriod: 1h
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/
// © Crunchster1

//@version=5
strategy(title="Crunchster's Normalised Trend Strategy", shorttitle="Normalised Trend Strategy", overlay=false )

// Inputs and Parameters
src = input(close, 'Source', group='Strategy Settings')
length = input.int(title="Lookback period for price normalisation filter", defval=14, minval=2, group='Strategy Settings', tooltip='This sets the lookback period for the volatility adjustment of returns, which is used to transform the price series into the "real price"')
hlength = input.int(title="Lookback period for Hull Moving Average", defval=100, minval=2, group='Strategy Settings')
offset = input.int(title="HMA Offset", defval=0, minval=0, group='Strategy Settings')
long = input(true, 'Long', inline='08', group='Strategy Settings')
short = input(true, 'Short', inline='08', group='Strategy Settings', tooltip='Toggle long/short strategy on/off')

stopMultiple = input.float(1, 'Stop multiple', step=0.25, group='Risk Management Settings', tooltip='Multiple for ATR, setting hard stop loss from entry price')
lev = input.float(1, 'Max Leverage', step=0.5, group='Risk Management Settings', tooltip='Max leverage sets maximum allowable leverage of total capital (initial capital + any net profit), capping maximum volatility adjusted position size')
riskT = input.float(10, maxval=75, title='Annualised Volatility Target %', group='Risk Management Settings', tooltip='Specify annual risk target, used to determine volatility adjusted position size. Annualised daily volatility is referenced to this value and position size adjusted accordingly')
comp = input(false, 'Compounding', inline='09', group='Risk Management Settings')
Comppct = input.float(50, '%', step=5, inline='09', group='Risk Management Settings', tooltip='Toggle compounding of profit, and set % of profit to compound')

// Backtesting period
FromDay = input.int(defval=1, title='From Day', minval=1, maxval=31, inline='04', group='Backtest range')
FromMonth = input.int(defval=1, title='From Mon', minval=1, maxval=12, inline='04', group='Backtest range')
FromYear = input.int(defval=2018, title='From Yr', minval=1900, inline='04', group='Backtest range', tooltip='Set start of backtesting period')
ToDay = input.int(defval=1, title='To Day', minval=1, maxval=31, inline='05', group='Backtest range')
ToMonth = input.int(defval=1, title='To Mon', minval=1, maxval=12, inline='05', group='Backtest range')
ToYear = input.int(defval=9999, title='To Yr', minval=1900, inline='05', group='Backtest range', tooltip='Set end of backtesting period')

start = timestamp(FromYear, FromMonth, FromDay, 00, 00)
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)
window = true

// Normalised returns calculation
nRet = (src - src[1]) / ta.stdev((src - src[1]), length)

nPrice = ta.cum(nRet)

//Hull Moving Average - using normalised price series
fHMA = ta.wma(2 * ta.wma(nPrice[offset], hlength / 2) - ta.wma(nPrice[offset], hlength), math.round(math.sqrt(hlength)))

//Risk Management formulae
strategy.initial_capital = 50000
tr = math.max(high - low, math.abs(high - close), math.abs(low - close)) //True range
stopL = ta.sma(tr, 14) //Average true range
stdev = ta.stdev(close-close[1], 14) //volatility of recent returns
maxcapital = strategy.initial_capital+strategy.netprofit //Maximum capital available to invest - initial capital net of profit
annvol = 100*math.sqrt(365)*stdev/close //converts recent volatility of returns into annualised volatility of returns - assumes daily timeframe

risk = 1.1
if comp
    risk := (strategy.initial_capital+(Comppct*strategy.netprofit/100))//adjust investment capital to include compounding
else
    risk := strategy.initial_capital

shares = (risk * (riskT/annvol)) / close //calculates volatility adjusted position size, dependent on user specified annualised risk target
if ((shares*close) > lev*maxcapital) //ensures position size does not exceed available capital multiplied by user specified maximum leverage
    shares := lev*maxcapital/close

//To set the price at the entry point of trade
Posopen() =>
    math.abs(strategy.position_size[1]) <= 0 and math.abs(strategy.position_size) > 0

var float openN = na
if Posopen()
    openN := stopL

// Strategy Rules
if long
    longCondition = ta.crossover(nPrice, fHMA) and window
    exitlong = ta.crossunder(nPrice, fHMA)
    if (longCondition)
        strategy.entry('Go Long!', strategy.long, qty=shares)
    if strategy.position_size > 0    
        strategy.exit('Stop Long', from_entry = 'Go Long!', stop=(strategy.opentrades.entry_price(0) - (openN * stopMultiple)))
    if (exitlong)
        strategy.close('Go Long!', immediately = true)

if short
    shortCondition = ta.crossunder(nPrice, fHMA) and window
    exitshort = ta.crossover(nPrice, fHMA)
    if (shortCondition)
        strategy.entry('Go Short!', strategy.short, qty=shares)
    if strategy.position_size < 0   
        strategy.exit('Stop Short', from_entry = 'Go Short!', stop=(strategy.opentrades.entry_price(0) + (openN * stopMultiple)))
    if (exitshort)
        strategy.close('Go Short!', immediately = true)

// Visuals of trend and direction
plot(nPrice, title='Real Price', color=color.black)

MAColor = fHMA > fHMA[3] ? #00ff00 : #ff0000
MA1 = plot(fHMA, title='Hull MA', color=MAColor)
MA2 = plot(fHMA[3], title='Hull MA Offset', color=MAColor)
fill(MA1, MA2, title='Band Filler', color=MAColor)