
Chiến lược này thực hiện một phiên bản cải tiến của chiến lược mua và nắm giữ bằng cách thêm một bộ lọc dựa trên biến động lịch sử. Chức năng của bộ lọc là đóng các vị trí mua vào thời gian thị trường biến động cao, và tái lập các vị trí mua vào thời điểm biến động thấp, do đó giảm khả năng rút tối đa của chiến lược.
So với chiến lược mua và nắm giữ đơn giản không có bộ lọc, chiến lược này có lợi nhuận hàng năm tăng lên (7,95% so với 9,92%) trong thời gian đánh giá 28 năm, trong khi mức thu hồi tối đa giảm đáng kể (50,79% so với 31,57%). Điều này cho thấy thêm bộ lọc biến động thị trường có thể nâng cao lợi nhuận chiến lược và giảm rủi ro.
Rủi ro chính của chiến lược này nằm ở cách tính toán tỷ lệ dao động và độ chính xác của cài đặt tham số bộ lọc. Nếu tính toán tỷ lệ dao động không chính xác, bộ lọc sẽ bị hỏng; nếu cài đặt tham số bộ lọc quá bảo thủ hoặc quá quyết liệt, sẽ ảnh hưởng xấu đến lợi nhuận của chiến lược. Ngoài ra, hiệu suất quá khứ không phải là dấu hiệu của kết quả trong tương lai.
Bạn có thể xem xét thêm các Indicators bộ lọc khác như tín hiệu xác nhận, chẳng hạn như đường trung bình di chuyển dài, chỉ số ADX của chỉ số đĩa lớn, v.v.
Chiến lược này đã cải thiện đáng kể lợi nhuận của chiến lược SPY mua và giữ thông qua một bộ lọc đơn giản dựa trên biến động lịch sử, đồng thời giảm đáng kể mức thu hồi tối đa. Điều này chứng minh tầm quan trọng của việc nhận diện trạng thái thị trường và phân bổ tài sản. Chúng ta có thể hoàn thiện chiến lược này hơn nữa bằng cách tiếp tục tối ưu hóa mô hình biến động và thêm tín hiệu xác nhận.
/*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")