一、抛物线指标SAR概述
-
SAR指标的计算公式拆解
二、交易信号的生成
-
买入信号:当价格从SAR之下向上穿越SAR时,视为买入信号。
-
卖出信号:当价格从SAR之上向下穿越SAR时,视为卖出信号。
三、SAR抛物线指标策略量化实战
import pandas as pd
import numpy as np
import 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是包含股票价格的DataFrame
df['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
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!