Strategi Masa Pasaran yang Difilter Volatiliti

Penulis:ChaoZhang, Tarikh: 2024-01-15 12:27:47
Tag:

img

Ringkasan

Strategi ini melaksanakan strategi beli dan memegang yang dipertingkatkan dengan menambah penapis berdasarkan turun naik sejarah. Penapis menutup kedudukan panjang semasa rejim pasaran turun naik tinggi dan memasuki semula kedudukan panjang apabila turun naik rendah, untuk mengurangkan pengeluaran maksimum.

Logika Strategi

  1. Mengira turun naik sejarah SPY dalam tempoh 100 hari yang lalu
  2. Jika turun naik semasa lebih tinggi daripada persentil ke-95 dari turun naik 100 hari yang lalu, penapis keluar pada hari dagangan itu, tutup kedudukan panjang
  3. Jika turun naik adalah di bawah persentil ke-95, masukkan kedudukan panjang

Analisis Kelebihan

Berbanding dengan membeli dan memegang mudah tanpa penapis, strategi ini meningkatkan pulangan tahunan dalam tempoh 28 tahun backtest (7.95% berbanding 9.92%) dan secara ketara mengurangkan pengeluaran maksimum (50.79% berbanding 31.57%).

Analisis Risiko

Risiko utama berasal dari ketepatan metodologi pengiraan turun naik dan penyesuaian parameter penapis. Jika pengiraan turun naik tidak tepat, penapis akan gagal. Jika parameter penapis disesuaikan dengan buruk (terlalu konservatif atau agresif), ia boleh memberi kesan negatif kepada pulangan strategi. Juga, prestasi masa lalu tidak menjamin hasil masa depan.

Arahan pengoptimuman

Pertimbangkan untuk menambah penunjuk pengesahan lain sebagai penapis tambahan, seperti purata bergerak jangka panjang, indeks ADX dan lain-lain. Penyesuaian parameter juga penting, seperti menguji tempoh kembali yang berbeza, ambang penapisan dan lain-lain. Teknik pembelajaran mesin & analisis siri masa juga boleh digunakan untuk membina dan mengoptimumkan model ramalan turun naik.

Ringkasan

Strategi ini sangat meningkatkan pulangan dan mengurangkan pengeluaran maksimum strategi SPY beli & pegang melalui penapis turun naik yang mudah. Ia menunjukkan kepentingan pengenalan rejim pasaran dan peruntukan aset. Kita boleh menyempurnakan lagi dengan mengoptimumkan model turun naik dan menambah isyarat pengesahan.


/*backtest
start: 2023-01-08 00:00:00
end: 2024-01-14 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/
// 
// @author Sunil Halai
//
// This script has been created to demonstrate the effectiveness of using market regime filters in your trading strategy, and how they can improve your returns and lower your drawdowns
//
// This strategy adds a simple filter (The historical volatility filter, which can be found on my trading profile) to a traditional buy and hold strategy of the index SPY. There are other filters
// that could also be added included a long term moving average / percentile rank filter / ADX filter etc, to improve the returns further.
//
// The filter added closes our long position during periods of volatility that exceed the 95th percentile (or in the top 5% of volatile days)
//
// Have included the back test results since 1993 which is 28 years of data at the time of writing,  Comparing  buy and hold of the SPY (S&P 500), to improved by and hold offered here.
//
// Traditional buy and hold:
//
// Return per year:     7.95   % (ex Dividends)
// Total return :       851.1  %
// Max drawdown:        50.79  %
//
// 'Modified' buy and hold (this script):
//
// Return per year:     9.92    % (ex Dividends)
// Total return:        1412.16 %
// Max drawdown:        31.57   %
//
// Feel free to use some of the market filters in my trading profile to improve and refine your strategies further, or make a copy and play around with the code yourself. This is just 
// a simple example for demo purposes.
//

//@version=4
strategy(title = "Simple way to beat the market [STRATEGY]", shorttitle = "Beat The Market [STRATEGY]", overlay=true, initial_capital=100000, default_qty_type=strategy.percent_of_equity, currency="USD", default_qty_value=100)


upperExtreme = input(title = "Upper percentile filter (Do not trade above this number)", type = input.integer, defval = 95)
lookbackPeriod = input(title = "Lookback period", type = input.integer, defval = 100)

annual = 365
per = timeframe.isintraday or timeframe.isdaily and timeframe.multiplier == 1 ? 1 : 7
hv = lookbackPeriod * stdev(log(close / close[1]), 10) * sqrt(annual / per)

filtered = hv >= percentile_nearest_rank(hv, 100, upperExtreme)

if(not(filtered))
    strategy.entry("LONG", strategy.long)
else
    strategy.close("LONG")

Lebih lanjut