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)
date instrument name pre_close open high \ 0 2015-01-05 000001.SH 上证指数 3234.677 3258.627 3369.281 1 2015-01-05 000016.SH 上证50指数 2581.567 2612.850 2678.443 2 2015-01-05 000300.SH 沪深300指数 3533.705 3566.089 3669.042 3 2015-01-05 000852.SH 中证1000指数 6027.520 6025.747 6052.442 4 2015-01-05 000903.SH 中证100指数 3440.600 3480.649 3583.094 ... ... ... ... ... ... ... 20095 2023-08-18 000905.SH 中证500指数 5874.360 5875.110 5891.400 20096 2023-08-18 399001.SZ 深证成指 10644.520 10637.680 10655.610 20097 2023-08-18 399006.SZ 创业板指 2147.060 2145.800 2156.170 20098 2023-08-18 399330.SZ 深证100 4828.300 4825.230 4832.570 20099 2023-08-18 899050.BJ 北证50成份指数 809.180 808.950 810.220 low close volume amount change change_ratio 0 3253.883 3350.519 53135239100 5.497601e+11 115.842 0.0358 1 2583.554 2649.639 18242556600 2.297636e+11 68.072 0.0264 2 3551.510 3641.541 45119809800 5.198498e+11 107.836 0.0305 3 5948.272 6049.787 9480519100 1.012880e+11 22.267 0.0037 4 3463.378 3551.909 31349979900 3.495385e+11 111.309 0.0324 ... ... ... ... ... ... ... 20095 5777.800 5777.800 102931800 1.097660e+11 -96.560 -0.0164 20096 10458.510 10458.510 363919164 4.242249e+11 -186.010 -0.0175 20097 2118.920 2118.920 113529808 2.024156e+11 -28.140 -0.0131 20098 4755.190 4755.190 25548380 6.587729e+10 -73.110 -0.0151 20099 799.650 801.990 887700 1.013000e+09 -7.190 -0.0089 [20100 rows x 12 columns] DataSource(427b265c35df4fbbaf2f4e8fa587952aT)
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计算公式
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)
#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)
#000300例子
df1=df[df['instrument']=='000300.SH']
print(df1)
date instrument name pre_close open high low \ 2 2015-01-05 000300.SH 沪深300指数 3533.705 3566.089 3669.042 3551.510 11 2015-01-06 000300.SH 沪深300指数 3641.541 3608.428 3683.226 3587.231 20 2015-01-07 000300.SH 沪深300指数 3641.059 3620.924 3671.190 3601.698 29 2015-01-08 000300.SH 沪深300指数 3643.790 3650.073 3659.945 3552.100 38 2015-01-09 000300.SH 沪深300指数 3559.259 3547.574 3689.753 3536.395 ... ... ... ... ... ... ... ... 20047 2023-08-14 000300.SH 沪深300指数 3884.250 3840.890 3859.470 3814.070 20058 2023-08-15 000300.SH 沪深300指数 3855.910 3858.370 3865.280 3811.680 20069 2023-08-16 000300.SH 沪深300指数 3846.540 3830.830 3852.420 3817.630 20080 2023-08-17 000300.SH 沪深300指数 3818.330 3801.200 3836.150 3782.500 20091 2023-08-18 000300.SH 沪深300指数 3831.100 3832.460 3844.200 3784.000 close volume amount change change_ratio 2 3641.541 45119809800 5.198498e+11 107.836 0.0305 11 3641.059 42096218500 4.985296e+11 -0.482 -0.0001 20 3643.790 32019123200 3.987317e+11 2.731 0.0008 29 3559.259 29500304500 3.558320e+11 -84.531 -0.0232 38 3546.723 34998267200 4.302106e+11 -12.536 -0.0035 ... ... ... ... ... ... 20047 3855.910 115966299 1.976240e+11 -28.350 -0.0073 20058 3846.540 103097099 1.774370e+11 -9.370 -0.0024 20069 3818.330 94616900 1.693240e+11 -28.200 -0.0073 20080 3831.100 98415500 1.740940e+11 12.770 0.0033 20091 3784.000 95549599 1.684460e+11 -47.100 -0.0123 [2100 rows x 12 columns]
#sar
sar=SAR(df1)
print(sar)
2 3505.992843 11 3509.253826 20 3516.212713 29 3522.893245 38 3529.306555 ... 20047 4057.155600 20058 4042.570464 20069 4024.099227 20080 4007.105689 20091 3984.645120 Length: 2100, dtype: float64
psar=PSAR(df1)
print(psar)
psar psarbear psarbull 2 3641.541000 NaN NaN 11 3641.059000 NaN NaN 20 3669.042000 NaN NaN 29 3683.226000 NaN NaN 38 3552.100000 3552.1 3552.1 ... ... ... ... 20047 4060.757800 NaN NaN 20058 4050.890288 NaN NaN 20069 4036.537671 NaN NaN 20080 4023.046210 NaN NaN 20091 4003.802514 NaN NaN [2100 rows x 3 columns]
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()
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)
/home/aiuser/.local/lib/python3.8/site-packages/pandas/core/frame.py:4438: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy return super().rename( /tmp/ipykernel_25697/3159532200.py:15: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy df_1_daily['Date']=pd.to_datetime(df_1_daily['Date'])
#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)
/home/aiuser/.local/lib/python3.8/site-packages/pandas/core/frame.py:4438: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy return super().rename( /tmp/ipykernel_25697/3822988857.py:16: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy df_1_daily['Date']=pd.to_datetime(df_1_daily['Date'])