In [20]:
import dai
# ---------------------------------------------------------------------------新版 AIStudio 开发环境暂不支持
# 默认导入,需要手动导入相关模块,请在当前或上方代码块中添加如下代码:
from bigdatasource.api import DataSource


df=dai.query("""
    SELECT *
    FROM cn_stock_index_bar1d
    WHERE date > '2015-01-01';
""").df()

# df1=df[df['name']=='科创50指数']
#df=df[df['instrument']=='000300.SH']
print(df)
df.instrument = df.instrument.str.replace("SHI", "SH")
ds = DataSource.write_df(df)
print(ds)

sar原理

SAR指标(Stop and Reverse,即停止和反转指标)是一种用于确定股票或其他资产价格趋势的技术指标。它由J. Welles Wilder在1978年提出。

SAR指标的原理基于价格和时间的关系。它通过分析价格走势和极值点,来确定趋势的转折点。SAR指标在上升趋势中给出买入信号,在下降趋势中给出卖出信号。

SAR指标的计算基于以下两个主要因素:

极值点:SAR指标需要找到价格走势的极值点。在上升趋势中,极值点是最高价;在下降趋势中,极值点是最低价。

加速因子(AF):AF是一个递增的参数,用于确定SAR指标在价格走势中的加速度。在每个转折点,AF的值会增加,从而加速SAR指标的移动。

根据以上两个因素,SAR指标的计算方式如下:

在上升趋势中,SAR指标的初始值等于前一日的SAR值。 在下降趋势中,SAR指标的初始值等于前一日的SAR值。 对于每个交易日,SAR指标的计算公式如下: 在上升趋势中: SAR = 前一日SAR + AF (前一日极值点 - 前一日SAR) 在下降趋势中: SAR = 前一日SAR - AF (前一日SAR - 前一日极值点) 在计算过程中,AF的初始值为一个常数(通常为0.02),然后每个转折点时会递增。通常情况下,AF递增的步长为0.02,但可以根据实际情况进行调整。

SAR指标的结果是一系列的点,可以与价格走势图进行比较,以确定买入或卖出的时机。当SAR指标从上升趋势转变为下降趋势时,为卖出信号;当SAR指标从下降趋势转变为上升趋势时,为买入信号。

需要注意的是,SAR指标在市场横盘或震荡行情中可能会产生较多的错误信号,因此在使用时应结合其他技术指标和市场条件进行综合分析。

sar运用

SAR指标的主要运用是确定价格趋势的转折点,以及确定买入或卖出的时机。以下是SAR指标的几种常见运用方式:

趋势判断:当SAR值位于价格下方时,表明市场处于上升趋势;当SAR值位于价格上方时,表明市场处于下降趋势。根据SAR指标的趋势判断,可以选择跟随趋势进行交易。

买入信号:当SAR值由下方穿越到价格上方时,表明市场可能发生转变,出现买入信号。这时可以考虑买入股票或其他资产。

卖出信号:当SAR值由上方穿越到价格下方时,表明市场可能发生转变,出现卖出信号。这时可以考虑卖出股票或其他资产。

动态止损:在持有头寸时,可以将SAR值作为动态止损的参考。当SAR值与持有头寸的价格相比,出现反向变化时,可以考虑平仓止损。

需要注意的是,SAR指标在市场震荡或横盘行情中可能会产生较多的错误信号。因此,在使用SAR指标时,建议结合其他技术指标和市场条件进行综合分析,以提高判断的准确性。同时,合理的风险管理和止损策略也是交易成功的关键。

In [21]:
#sar计算公式
import pandas as pd
def SAR(ohlc='', af= 0.02, amax= 0.2):
        """SAR 代表“停止和反向”,这是系统中使用的实际指标。
        随着趋势随着时间的推移而延伸,SAR会跟随价格。当价格上涨时,该指标低于价格,当价格下跌时,该指标高于价格。
        在这方面,当价格趋势反转并突破指标上方或下方时,指标停止并反转。"""
        high, low = ohlc.high.tolist(), ohlc.low.tolist()
        # Starting values
        sig0, xpt0, af0 = True, high[0], af
        _sar = [low[0] - (ohlc['high'] - ohlc['low']).std()]

        for i in range(1, len(ohlc)):
            sig1, xpt1, af1 = sig0, xpt0, af0

            lmin = min(low[i - 1], low[i])
            lmax = max(high[i - 1], high[i])

            if sig1:
                sig0 = low[i] > _sar[-1]
                xpt0 = max(lmax, xpt1)
            else:
                sig0 = high[i] >= _sar[-1]
                xpt0 = min(lmin, xpt1)

            if sig0 == sig1:
                sari = _sar[-1] + (xpt1 - _sar[-1]) * af1
                af0 = min(amax, af1 + af)

                if sig0:
                    af0 = af0 if xpt0 > xpt1 else af1
                    sari = min(sari, lmin)
                else:
                    af0 = af0 if xpt0 < xpt1 else af1
                    sari = max(sari, lmax)
            else:
                af0 = af
                sari = xpt0

            _sar.append(sari)

        return pd.Series(_sar, index=ohlc.index)
In [22]:
#psar计算公式

def PSAR(ohlc='', iaf: int = 0.02, maxaf: int = 0.2):
        """
        抛物线SAR指标,由J. Wells Wilder开发,被交易者用来确定趋势方向和潜在的价格反转。
        该指标使用称为“SAR”或止损和反转的追踪止损和反转方法来识别合适的退出和入场点。
        交易者也将该指标称为抛物线止损和反转、抛物线 SAR 或 PSAR。
        """

        length = len(ohlc)
        high, low, close = ohlc.high.tolist(), ohlc.low.tolist(), ohlc.close.tolist()
        psar = close[0 : len(close)]
        psarbull = [None] * length
        psarbear = [None] * length
        bull = True
        af = iaf
        hp = high[0]
        lp = low[0]

        for i in range(2, length):
            if bull:
                psar[i] = psar[i - 1] + af * (hp - psar[i - 1])
            else:
                psar[i] = psar[i - 1] + af * (lp - psar[i - 1])

            reverse = False

            if bull:
                if low[i] < psar[i]:
                    bull = False
                    reverse = True
                    psar[i] = hp
                    lp = low[i]
                    af = iaf
            else:
                if high[i] > psar[i]:
                    bull = True
                    reverse = True
                    psar[i] = lp
                    hp = high[i]
                    af = iaf

            if not reverse:
                if bull:
                    if high[i] > hp:
                        hp = high[i]
                        af = min(af + iaf, maxaf)
                    if low[i - 1] < psar[i]:
                        psar[i] = low[i - 1]
                    if low[i - 2] < psar[i]:
                        psar[i] = low[i - 2]
                else:
                    if low[i] < lp:
                        lp = low[i]
                        af = min(af + iaf, maxaf)
                    if high[i - 1] > psar[i]:
                        psar[i] = high[i - 1]
                    if high[i - 2] > psar[i]:
                        psar[i] = high[i - 2]

            if bull:
                psarbull[i] = psar[i]
            else:
                psarbear[i] = psar[i]

        psar = pd.Series(psar, name="psar", index=ohlc.index)
        psarbear = pd.Series(psarbull, name="psarbull", index=ohlc.index)
        psarbull = pd.Series(psarbear, name="psarbear", index=ohlc.index)

        return pd.concat([psar, psarbull, psarbear], axis=1)
In [23]:
#000300例子
df1=df[df['instrument']=='000300.SH']
print(df1)
In [24]:
#sar
sar=SAR(df1)
print(sar)
In [25]:
psar=PSAR(df1)
print(psar)
In [26]:
from finta import TA
import pandas as pd
import matplotlib.pyplot as plt
import mplfinance as mpf
import akshare as ak
import requests
import json
import jsonpath
import pandas as pd
import os
#建立文件夹保存数据
def plot_kline_figure(df_1_daily=None,df_sar=''):
    '''
    df_1_daily最小周期数据
    df_sar_1周期1的抛点指标数据
    df_sar_2周期2的抛点指标数据
    df_sar_1=3周期3的抛点指标数据
    '''
    macd=TA.MACD(df_1_daily)
    df_1_daily.rename(columns={'date':'Date','open':'Open','close':'Close','high':'High','low':'Low','amoun':'Volume'},inplace=True)
    #时间格式转换
    plt.rcParams['font.family']='SimHei'
    plt.rcParams['axes.unicode_minus']=False
    df_1_daily['Date']=pd.to_datetime(df_1_daily['Date'])
    #出现设置索引
    df_1_daily.set_index(['Date'],inplace=True)
    #设置股票颜
    mc=mpf.make_marketcolors(up='r',down='g',edge='i')
    #设置系统
    s=mpf.make_mpf_style(marketcolors=mc)
    add_plot=[mpf.make_addplot(macd['MACD'],panel=1,title='MACD',color='r'),
        mpf.make_addplot(macd['SIGNAL'],panel=1,color='y'),
        mpf.make_addplot(df_sar,panel=0,title='SAR',type='scatter')]
    #绘制股票图,5,10,20日均线
    mpf.plot(df_1_daily,type='candle',style=s,addplot=add_plot)
    plt.show()
In [27]:
df_1_daily=df1[-300:]
df_sar=sar[-300:]
def plot_kline_figure(df_1_daily=None,df_sar=''):
    '''
    df_1_daily最小周期数据
    df_sar_1周期1的抛点指标数据
    df_sar_2周期2的抛点指标数据
    df_sar_1=3周期3的抛点指标数据
    '''
    macd=TA.MACD(df_1_daily)
    df_1_daily.rename(columns={'date':'Date','open':'Open','close':'Close','high':'High','low':'Low','amoun':'Volume'},inplace=True)
    #时间格式转换
    plt.rcParams['font.family']='SimHei'
    plt.rcParams['axes.unicode_minus']=False
    df_1_daily['Date']=pd.to_datetime(df_1_daily['Date'])
    #出现设置索引
    df_1_daily.set_index(['Date'],inplace=True)
    #设置股票颜
    mc=mpf.make_marketcolors(up='r',down='g',edge='i')
    #设置系统
    s=mpf.make_mpf_style(marketcolors=mc)
    add_plot=[mpf.make_addplot(macd['MACD'],panel=1,title='MACD',color='r'),
        mpf.make_addplot(macd['SIGNAL'],panel=1,color='y'),
        mpf.make_addplot(df_sar,panel=0,title='SAR',type='scatter')]
    #绘制股票图,5,10,20日均线
    mpf.plot(df_1_daily,type='candle',style=s,addplot=add_plot)
    plt.show()
plot_kline_figure(df_1_daily=df_1_daily,df_sar=df_sar)
In [29]:
#pasr
df_1_daily=df1[-100:]
df_sar=psar[-100:]
def plot_kline_figure(df_1_daily=None,df_sar=''):
    '''
    df_1_daily最小周期数据
    df_sar_1周期1的抛点指标数据
    df_sar_2周期2的抛点指标数据
    df_sar_1=3周期3的抛点指标数据
    '''
    macd=TA.MACD(df_1_daily)
    df_1_daily.rename(columns={'date':'Date','open':'Open','close':'Close','high':'High','low':'Low','amoun':'Volume'},inplace=True)
    #时间格式转换
    plt.rcParams['font.family']='SimHei'
    plt.rcParams['axes.unicode_minus']=False
    df_1_daily['Date']=pd.to_datetime(df_1_daily['Date'])
    #出现设置索引
    df_1_daily.set_index(['Date'],inplace=True)
    #设置股票颜
    mc=mpf.make_marketcolors(up='r',down='g',edge='i')
    #设置系统
    s=mpf.make_mpf_style(marketcolors=mc)
    add_plot=[mpf.make_addplot(macd['MACD'],panel=1,title='MACD',color='r'),
        mpf.make_addplot(macd['SIGNAL'],panel=1,color='y'),
        mpf.make_addplot(df_sar['psar'],panel=0,title='SAR',type='scatter'),
        mpf.make_addplot(df_sar['psarbear'],panel=0,type='scatter',color='r'),
        mpf.make_addplot(df_sar['psarbull'],panel=0,type='scatter',color='g')]
    #绘制股票图,5,10,20日均线
    mpf.plot(df_1_daily,type='candle',style=s,addplot=add_plot)
    plt.show()
plot_kline_figure(df_1_daily=df_1_daily,df_sar=df_sar)