当前位置 : 主页 > 编程语言 > python >

Python 金融量化 随机指标交易策略

来源:互联网 收集:自由互联 发布时间:2022-06-18
df['Date'] = pd.to_datetime(df['Date']) # 转换日期列的格式,便于作图 df.set_index(['Date'], inplace=True) # 将日期列作为行索引 df = df.sort_index() # 倒序以便作图 return df df = get_data('000001.SZ') [](()4. 计算

df['Date'] = pd.to_datetime(df['Date']) # 转换日期列的格式,便于作图

df.set_index(['Date'], inplace=True) # 将日期列作为行索引

df = df.sort_index() # 倒序以便作图

return df

df = get_data('000001.SZ')

[](()4. 计算RSV

===============================================================================

若以9日为时间跨度:

import numpy as np

import matplotlib.pyplot as plt

close = df.Close

high = df.High

low = df.Low

获取日期数据

date = close.index.to_series()

ndate = len(date)

定义初始变量最高价High,取值均为0

periodHigh = pd.Series(np.zeros(ndate-8),index=date.index[8:])

定义初始变量最低价为Low,取值均为0

periodLow = pd.Series(np.zeros(ndate-8),index=date.index[8:])

定义初始变量RSV,取值均为0

RSV = pd.Series(np.zeros(ndate-8), index=date.index[8:])

计算9日未成熟随机指标RSV的值

for j in range(8,ndate):

period = date[j-8:j+1]

i = date[j]

periodHigh[i] = high[period].max()

periodLow[i] = low[period].min()

RSV[i] = 100 * (close[i]-periodLow[i])/(periodHigh[i]-periodLow[i])

periodHigh.name = 'periodHigh'

periodLow.name = 'periodLow'

RSV.name = 'RSV'

写到这里,查看一下生成的数据:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

对RSV作简要描述性分析

RSV.describe()

在这里插入图片描述

然后,我们绘制平安银行2020年数据的收盘价曲线图和RSV曲线图

提取数据

C_RSV=pd.DataFrame([close['2020'],RSV['2020']]).transpose()

在这里插入图片描述

绘图

plt.rcParams['font.sans-serif'] = ['SimHei']

C_RSV.plot(subplots=True, title='未成熟随机指标RSV')

在这里插入图片描述

RSV的取值在0~100之间,且波动范围较大。且有很多时候RSV取值接近或等于0或者100。

接下来,再绘制其K线图进一步对照:

import mplfinance as mpf

s = mpf.make_mpf_style(base_mpf_style='blueskies', rc={'font.family': 'SimHei'})

add_plot=[mpf.make_addplot(RSV['2020'])]

mpf.plot(df['2020'],type='candle', style=s, title='平安银行2020年K线图及未成熟随机指标RSV', addplot=add_plot,volume=True)

图像效果如下:

在这里插入图片描述

分析图像可知,处于上涨行情时,蜡烛图的上影线较短或者没有上影线,在部分交易日中收盘价接近或等于最高价。

由RSV计算公式和n=9可推知,若收盘价等于9日最高价,RSV取值则为100。

在下跌行情时,蜡烛图的下影线较短或者几乎没有,收盘价很有可能等于9日最低价,当收盘价接近或等于等于9日最低价的时候,RSV取值接近或为0。

当市场处于连续上涨行期的时候,未成熟随机指标RSV取值也逐渐增大,并且可能在较多日期中取值为100;当市场处于连续下跌行期的时候,RSV取值可能在较多行期中取值为0。

当RSV连续多期取值为0或100的时候,RSV则会出现所谓“钝化”的现象。

例如当收盘价在上涨行情高位变化的时候,RSV一段时间的取值均为100,不随收盘价的变化而波动,则失去了捕捉收盘价变化的作用。

需要注意的是,RSV的波动幅度较大,也可能会造成“假信号”。一种可能的情况是,在上涨行期中收盘价上涨幅度稍微增大,则可能造成RSV取值过大,进而释放出“超买”行期的假信号。

为了解决RSV波动幅度较大的问题,我们引入K指标。它是对RSV值进行平滑得到的结果。

[](()5. 计算K、D指标值

==================================================================================

[](()5.1 K值、D值指标概述


K值由前一日的K值和当期RSV值经过一定权重调整后相加得到,一般来说,K值的计算为:

K 值 = 2 3 × 前 一 日 K 值 + 1 3 × 当 日 R S V \displaystyle K值=\frac{2}{3}×前一日K值+\frac{1}{3}×当日RSV K值\=32?×前一日K值+31?×当日RSV

即 K t = 2 3 × K t ? 1 + 1 3 × R S V t \displaystyle K_t=\frac{2}{3}×K_{t-1}+\frac{1}{3}×RSV_t Kt?\=32?×Kt?1?+31?×RSVt?

D值是由前一日的D值和当期K值经过一定权重相加而得到。一般来说,D值的计算为:

D 值 = 2 3 × 前 一 日 D 值 + 1 3 × 当 日 K 值 \displaystyle D值=\frac{2}{3}×前一日D值+\frac{1}{3}×当日K值 D值\=32?×前一日D值+31?×当日K值

即 D t = 2 3 × D t ? 1 + 1 3 × K t \displaystyle D_t=\frac{2}{3}×D_{t-1}+\frac{1}{3}×K_t Dt?\=32?×Dt?1?+31?×Kt?

此外,在计算第一期K和D值时,如果没有指定,则K值和D值都默认取值为50。在K值和D值的求解过程中,平滑权重2/3和1/3是较为常用的权重,这两个权重也可以根据股价走势的特点进行适当修改。

(通过递归和迭代,我们可以发现K值是由未成熟随机指标RSV通过指数移动平均而得到的。D值是K值的指数移动平均数。)


[](()5.2 计算代码


计算K值

KValue = pd.Series(0.0, index=RSV.index)

KValue[0] = 50

for i in range(1,len(RSV)):

KValue[i] = 2/3*KValue[i-1] + RSV[i]/3

KValue.name = 'KValue'

接着计算D值

DValue = pd.Series(0.0, index=RSV.index)

DValue[0] = 50

for i in range(1, len(RSV)):

DValue[i] = 2/3*DValue[i-1] + KValue[i]/3

DValue.name = 'DValue'

KValue = KValue[1:]

DValue = DValue[1:]

然后,绘制曲线图

plt.rcParams['font.sans-serif'] = ['SimHei']

plt.subplot(211)

plt.title('2020年平安银行收盘价')

plt.plot(close['2020'])

plt.subplot(212)

plt.title('2020年平安银行RSV与KD线')

plt.plot(RSV['2020'])

plt.plot(KValue['2020'],linestyle='dashed')

plt.plot(DValue['2020'],linestyle='-.')

图像效果如下:

在这里插入图片描述

如图可以看出RSV曲线波动最大,K线在RSV基础上进行适当平滑,而D线波动幅度最小。收盘曲线上涨时,RSV曲线、KD线也呈上涨趋势;当收盘价在高位段上涨时,RSV曲线,K值,D值取值也较高,并在较高位处波动。

[](()6.计算J值

============================================================================

J指标是KD指标的辅助指标,进一步反映了K指标与D指标的乖离程度。第t日J值的计算公式为:

J t = 3 × K t ? 2 × D t \displaystyle J_t=3×K_t-2×D_t Jt?\=3×Kt??2×Dt?

计算J值

JValue = 3KValue - 2DValue

JValue.name='JValue'

[](()7.绘制KDJ线

==============================================================================

plt.rcParams['font.sans-serif'] = ['SimHei']

【文章转自中东服务器 http://www.558idc.com/dibai.html欢迎留下您的宝贵建议】
上一篇:Python基础教程:str、list
下一篇:没有了
网友评论