Chiến lược thời điểm thị trường dựa trên biến động lịch sử


Ngày tạo: 2024-01-15 12:27:47 sửa đổi lần cuối: 2024-01-15 12:27:47
sao chép: 2 Số nhấp chuột: 697
1
tập trung vào
1617
Người theo dõi

Chiến lược thời điểm thị trường dựa trên biến động lịch sử

Tổng quan

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.

Nguyên tắc chiến lược

  1. Tính biến động lịch sử SPY trong 100 ngày qua
  2. Nếu tỷ lệ biến động hiện tại cao hơn 95 điểm của tỷ lệ biến động trong 100 ngày qua, hãy lọc ngày giao dịch đó và đóng vị trí mua
  3. Xây dựng một vị trí mua nếu biến động dưới 95 điểm

Phân tích lợi thế

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.

Phân tích 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.

Hướng tối ưu hóa

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.

Tóm tắt

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.

Mã nguồn chiến lược
/*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")