Python 金融量化 随机指标交易策略
==============================================================================
随机指标(KDJ)即为随机指数(The Random Index),它是一种用于识别市场中超买或超卖现象的技术指标。最初应用于期货市场后,在股票领域也得到了广泛应用并被众多投资者认可。
基于威廉指标(Williams %R或W%R)形成的理论基础构成了KDJ交易的核心思想。当使用威廉指标分析资产价格走势时,在关注每日收盘价的同时还综合考察了从市场开盘到收盘期间价格的整体变动情况。其计算方法首先选定一个时间段(例如14天),然后确定该时间段内的最高价位与最低价位;接着考察该时间段最后一个交易日的收盘价位相对于这段时间内最高价位的具体位置关系。
W%R指标可以表述为:
计算结果为过去\mathbf{n}个交易日中最高价位减去当前交易日收盘价位占(除以)最高价位减去最低价位,并乘以百分号。
随机指数最初概念由期货交易所交易员George Lane提出并发展形成KD指标 ,亦被称作随机振荡指数 。其分析思路与威廉指数具有相似之处,在技术分析中主要基于一定时间段内的最新收盘价与其对应期间内的最高价格及最低价格之间的相对位置进行考察。区别在于随机指数通过最新收盘价与其对应时间段内的最高价格及最低价格的比例变化来识别市场超买与超卖状态。
KDJ指标 则是在随机震荡指标K线和D线上增加1条J线的基础上形成的,在进一步增强了随机震荡指标对市场买卖信号捕捉能力的同时也提升了其周延度
==============================================================================
该技术分析工具中的KDJ指标由三条关键指标构成:K线、D线以及J线。该指标基于一定周期(常见于9天或9周等)内资产的历史高点、低点以及最后一个计算时刻的价格数据,并结合这三者之间的比例关系来确定最后一个时点对应的未成熟随机值RSV(Raw Stochastic Value)。随后通过移动平均技术得出各相关数值,并按时间顺序依次绘制这些数值的变化轨迹。
计算RSV的值是求KDJ指标的第一步,RSV的计算公式为:
R S V等于某股票某日的收盘价格减去该股票在过去的n个交易日中的最低收盘价位除以当日交易过程中的最高点位减去该股票在过去的n个交易日中的最低收盘价位再乘以100%
其中n为时间跨度。
也即:
R S V_t = (C l o s e_t - L o w_{[t - n + 1, , t]}) / (H i g h_{[t - n + 1, , t]} - L o w_{[t - n + 1, , t]})
即:
RSVₜ等于(Closingₜ减去[Low从t−n+1到t])除以(High从t−n+1到t减去Low从t−n+1到t)
============================================================================
数据照常从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’)
===============================================================================
若以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.draw_graphic(df['\u{664b\u{6587\u{658d\u{6589}'}}, type='蜡烛图', style=s,
title='平安银行 2020 年 K 线图表及未成熟随机指标 RSV',
addplot=add_plot, volume=True)
图像效果如下:

通过观察图表可知,在出现上涨行情时,蜡烛图的上影线通常较短或完全没有,在一定数量的交易日中收盘价会接近或达到当日最高价位。
由RSV计算公式和n=9可推知,若收盘价等于9日最高价,RSV取值则为100。
在市场出现下跌趋势时,在蜡烛图中通常会观察到以下特征:其下影线通常较短或几乎无长度;一般情况下,收盘价格可能与前九个交易日的日最低价格持平;特别地,在收盘价格接近于或达到前九个交易日的日最低价格的时候(即其附近区域),RSV指标的数值可能趋近于或归于零点
当市场处于连续上涨趋势时,未成熟随机指标RSV的数值逐渐上升,并且可能会有较多天数达到RSV=100的状态;当市场处于持续下行趋势时,则会呈现较低水平并有可能出现多个阶段维持在RSV=0的情形。
当RSV连续多期取值为0或100的时候,RSV则会出现所谓“钝化”的现象。
例如,在上涨行情中的高位期间出现高低起伏时,RSV一段时期的取值始终维持在100,其数值不会因股价变动而改变
需要注意的是,在RSV指标上观察到较大的剧烈度(即波动幅度)也有可能引发虚假警示。在上升周期中出现较大幅度的收盘价上涨时,则可能导致RSV数值过高,并从而释放出‘超买’时期的虚假警示。
需要注意的是,在RSV指标上观察到较大的剧烈度(即波动幅度)也有可能引发虚假警示。在上升周期中出现较大幅度的收盘价上涨时,则可能导致RSV数值过高,并从而释放出'超买'时期的虚假警示。
为了解决RSV值波动幅度较大的问题,我们采用了K指标。该指标是通过对RSV值进行平滑处理后得出的结果。
==================================================================================
K值基于前一日的K值与当期RSV值按照特定权重进行加权后汇总得出;通常情况下,K值的计算方式为:
其中K指标由以下两部分组成:\frac{2}{3}乘以前一日K指标值和\frac{1}{3}乘以当前日的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指标等于三分之二乘以前一天的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指标的过程中,在参数未被指定时,默认情况下设定的K指标与D指标均为50。其中,在确定K指标与D指标的具体数值时,请注意通常采用2/3与1/3作为平滑权重系数。这些权重系数还可以根据市场行情的具体情况作出适当调整。
通过递归算法结合迭代计算的方式,我们能够得出K值是由未成熟随机指标RSV经过指数移动平均运算得到的结果。D值则是这一结果进一步应用指数平滑技术得到的数值。
计算K值
KValue = pd.Series(0.0, index=RSV.index)
KValue[0] = 50
for i in range(1,len(RSV)):
自我介绍下吧!我是2013年毕业于上海交通大学的应届毕业生。此前曾在小公司工作过一段时间,在华为、OPPO等知名企业也有过接触。而2018年入职阿里巴巴后至今一直致力于相关领域的工作。
清楚地认识到大多数Python工程师希望提升技能的人往往会选择自我摸索或参加培训课程来提高自己的技术水平。然而,在培训机构收费普遍较高的情况下(一到几千元),许多人感到压力较大。相比之下,在没有系统化学习的情况下进行自我学习效率低下且耗时较长,并且容易遇到技术瓶颈难以突破!
经过一番努力收集整编了一份《2024年Python开发全套学习资料》,其目的也很单纯——旨在帮助那些希望自主提升却又感到迷茫该怎么开始的人,并且能够让整个学习过程更加轻松愉快。






我们提供了一个全面的学习资源体系:面向小白的学习者设计了入门级学习材料;针对有一定经验的学习者设计的专业课程内容;几乎涵盖了所有前端开发所需的知识点,并且体系化地组织了这些内容。
因为文件较大
说明
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)


不仅专为新手设计的基础学习材料丰富多样,
还为资深开发者提供了深入拓展的专业课程;
这些课程覆盖了超过95%的核心前端知识,
并且系统性强。
因为文件较大, 仅对部分目录大纲进行了截屏, 每个节点中均包含大厂面经、学习笔记、源码讲义等丰富资源, 并将持续进行更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)

