Advertisement

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

阅读量:

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

随机指数(KDJ)又被视为衡量市场超买与超卖程度的重要工具。它最初在期货交易领域得到应用后逐渐拓展至股票市场的广泛使用。

KDJ的基本交易思想基于 Williams %R(简称W%R)。当使用威廉指标分析资产价格时,默认会考虑每日收盘价之外,并综合考虑从开盘到收盘期间的价格变动情况。其计算方法通常涉及设定一个时间段(例如14天),确定该时间段内的最高价位和最低价位所构成的价格波动范围;接着评估该时间段最后一个交易日的收盘价位相对于这段时间内最高价位的具体位置;最后依据这个具体位置来判断市场是否处于超买或超卖状态。

W%R指标可以表述为:

过去 n 天中最高收盘价与第 n 天收市盘价格之差除以过去 n 天中最高收市盘价格与最低收市盘价格之差的结果乘以 100%,即得到 WR 值

随机指标的最初形态由期货公司交易员George Lane于某个时期提出并发展成为KD指标 ,后演变为广为人知的随机震荡指数 。其分析思路与威廉指数相似,在判断市场可能出现的过度交易情况时具有显著价值。相较于威廉指数而言的主要区别在于,随机震荡指数着重关注收盘价与其所在时间段内最高价位和最低价位之间的比例关系,并通过引入额外的数据点来更全面地反映市场动态。

KDJ指标 则是通过在随机震荡指标中的K线和D线基础上增加了一条J线来实现对市场买卖信号的捕捉,并进一步增强了随机震荡指标在这一过程中的捕捉能力。


2.随机指标原理

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

该技术由三条核心线——K线、D线及J线构成。基于设定的时间周期(常见于9天或9周)内的资产最高价、最低价以及最新收盘价及其比例关系来计算出最后一个时间点对应的未成熟随机值RSV(Raw Stochastic Value),并运用移动平均算法得出相应的K值、D值与J值序列。随后将每个时间点对应的K、D及J数值依次标出,并连接成连续曲线即可形成完整的K线图、D线图与J线图。

计算RSV的值是求KDJ指标的第一步,RSV的计算公式为:

当前交易日K线图中RSV值计算公式为:RSV=(当日收盘价格-过去N个交易日内的最低收盘价格)/(过去N个交易日内的最高收盘价格-过去N个交易日内的最低收盘价格)×100

其中n为时间跨度。

也即:其计算公式为 RSV_t = \frac{Close\_price\_at\_time\_t - Minimum\_low\_price\_over\_period_n}{Difference between Maximum\_high\_price and Minimum\_low\_price over period n}

3.获取数据

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

数据照常从tushare获取 平安银行股价数据

import tushare as ts

import pandas as pd

token = 'Your token' (请提供您的接口密钥);更多信息及获取方式可参考Tushare官网

pro = ts.pro_api(token)

def get_data(tscode):

df = pro.daily(ts_code=tscode)

df = df.loc[:, [‘trade_date’, ‘open’, ‘high’, ‘low’, ‘close’, ‘vol’]]

df.rename(

columns={

‘trade_date’: ‘Date’, ‘open’: ‘Open’,

‘high’: ‘High’, ‘low’: ‘Low’,

‘close’: ‘Close’, ‘vol’: ‘Volume’},

inplace=True) # 重定义列名,方便统一规范操作。

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的数值位于介于[公式]区间内,并且波动范围较大。通常情况下,在许多情况下RSV数值会接近或达到边界值如最低点(即为零)或最高点(即为一百)。

接下来,再绘制其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(dataframe[‘dataframe’, ‘year’, ‘value’], type=candlestick, appearance=s, title="平安银行 2019 年 K 线 图及开发中 RSIV 指标", addplot=added plot; volume is enabled")

图像效果如下:

在这里插入图片描述

通过分析图表数据可知,在出现上涨行情时,蜡烛图中的上方线条较短或完全没有上影线;而在某些交易日中,收盘价趋近于或达到当日最高点。

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

当市场出现下跌趋势时,在蜡烛图中可以看到其下影线通常较短或完全没有。此时,在大多数情况下(即该时段内的)收盘价格很可能达到9日最低水平;然而,在某些特定情况下(即其收盘价格接近或达到9日最低水平时),RSV指标的值通常会接近于零点

当价格走势呈现连续上涨趋势时,在一段时间内未成熟随机指标RSV的数值逐渐升高,并且可能会有多个时期达到100;当价格走势呈现连续下跌趋势时,在一段时间内未成熟随机指标RSV的数值可能会有多个时期降至0。

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

当在上涨行情中达到高位后进行变动的时候,在一段时间内RSV始终维持在100水平,则其数值并未因收盘价的变化而发生变动;从而丧失了对价格变动的敏感度作用

需要注意的是,在RSV指标的变化幅度较大时也有可能会引发虚假警示(false signal)。具体而言,在上升周期中若收盘价上扬幅度稍有扩大,则可能导致RSV指数过高从而释放出"超买"时期的虚假警示信号

为了缓解RSV值波动幅度较大的问题,我们采用K指标来解决这一问题。它通过平滑RSV值来得出结果。

5. 计算K、D指标值

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

5.1 K值、D值指标概述


K值通过特定权重进行加权处理后相加得出,通常情况下,K值的计算方式为:

K 值 = \frac{2}{3} \times 前一日常數 + \frac{1}{3} \times 經過R S V

即 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 值与当期 K 值相加的方式进行计算。

计算当前D值时,请记住它是前一天D值的三分之二与当天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值时,默认情况下它们都被设定为数值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

遍历从1到len(RSV)的范围。
自我介绍一下, 我是一名自2013年起毕业于上海交通大学的学者, 曾在小型机构工作过, 并曾在华为、OPPO等大型机构有过历练, 2018年加入阿里巴巴至今。

普遍发现的是大多数Python工程师在寻求技能提升时通常选择自主学习或参加培训课程。然而高昂的培训机构费用给许多人带来了经济负担较重的问题。自主学习虽然有效但缺乏系统性的努力往往难以取得显著成效且耗时较长;而且在遇到技术瓶颈时往往难以突破

由于本人出于个人需求/目的/意图等特意进行了相关资料的收集与整理,《2024年Python开发全套学习资料》也随之诞生了》【其出发点很简单

由于本人出于个人需求/目的/意图等特意进行了相关资料的收集与整理,《2024年Python开发全套学习资料》也随之诞生了

img
img
img
img
img
img

不仅专为小白设计的零基础学习资料库中包含丰富的资源内容,还为具备3年以上开发经验的小伙伴精心打造了深入学习提升的专业课程套餐。这些课程内容覆盖了前端开发领域的95%以上知识点,并且整个体系非常系统化且全面。

因为文件较大,在此仅对部分目录大纲进行了截图展示。其中每个节点中均包含大厂面经、学习笔记、源码讲义等丰富资源,并且后续将持续进行更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)

img
img

提供了各类 cater to 不同学习阶段的学习者的资源:既有专门针对初级学习者的零基础材料,
也有专为 3 年以上经验积累的学习者设计的深入课程,
几乎涵盖了 95%以上的前端知识点,
并且系统全面!

因为文件较大,在此仅提供部分目录大纲的截图。每个节点都包含大厂面经、学习笔记、源码讲义、实战项目以及讲解视频等内容,并会持续更新中

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)

全部评论 (0)

还没有任何评论哟~