一、抛物线指标SAR概述
-
SAR指标的计算公式拆解

二、交易信号的生成
-
买入信号:当价格从SAR之下向上穿越SAR时,视为买入信号。
-
卖出信号:当价格从SAR之上向下穿越SAR时,视为卖出信号。
三、SAR抛物线指标策略量化实战

import pandas as pdimport numpy as npimport matplotlib.pyplot as plt
def calculate_sar(df, initial_af=0.02, af_increment=0.02, max_af=0.2): df['SAR'] = np.nan # 初始化SAR列 df['SAR'][0] = df['Low'][0] # 第一个SAR值设为第一个周期的最低价 df['EP'] = np.nan # 初始化极值点列 df['EP'][0] = df['High'][0] # 第一个极值点设为第一个周期的最高价 af = initial_af # 初始化加速因子 trend = None # 初始趋势
for i in range(1, len(df)): if trend is None and df['High'][i] > df['EP'][i-1]: trend = 'up' af = initial_af df['EP'][i] = df['High'][i] elif trend is None and df['Low'][i] < df['SAR'][i-1]: trend = 'down' af = initial_af df['EP'][i] = df['Low'][i] if trend == 'up': df['SAR'][i] = df['SAR'][i-1] + af * (df['EP'][i-1] - df['SAR'][i-1]) if df['Low'][i] < df['SAR'][i]: trend = 'down' af = initial_af df['EP'][i] = df['Low'][i] elif trend == 'down': df['SAR'][i] = df['SAR'][i-1] - af * (df['SAR'][i-1] - df['EP'][i-1]) if df['High'][i] > df['SAR'][i]: trend = 'up' af = initial_af df['EP'][i] = df['High'][i] af = min(max_af, af + af_increment) # 更新加速因子
return df['SAR']
# 假设df是包含股票价格的DataFramedf['SAR'] = calculate_sar(df)
# 生成交易信号df['Signal'] = np.where(df['Close'].shift(1) < df['SAR'].shift(1), -1, 0)df['Signal'] = np.where(df['Signal'].shift(-1) == -1 and df['Close'] > df['SAR'], -df['Signal'].shift(-1), df['Signal'])df['Signal'] = np.where(df['Close'].shift(1) > df['SAR'].shift(1), 1, df['Signal'])
# 绘制SAR指标和交易信号plt.figure(figsize=(14, 7))plt.plot(df['Close'], label='Close Price')plt.plot(df['SAR'], label='SAR', linestyle='--')plt.plot(df[df['Signal'] == 1].index, df['Close'][df['Signal'] == 1], '^', markersize=10, color='green', label='Buy Signal')plt.plot(df[df['Signal'] == -1].index, df['Close'][df['Signal'] == -1], 'v', markersize=10, color='red', label='Sell Signal')plt.legend()plt.show()
-
策略回测
四、结语
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/106022
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!