Python量化交易学习入门

量化交易-Python实现

  • 一.量化交易的流程和概念
    • 1.数据分析I2O流程
    • 2.量化交易和高频交易、自动交易的区别
    • 3.量化交易的流程
  • 二.量化交易的分类
  • 三:常用量化框架
  • 四.一个完整的策略
  • 五.常用数据源和模块库
    • 1.tushare模块库获取数据
      • 1.1获取历史行情数据
      • 其他做法类似
    • 2.pandas获取数据
  • 六.策略的评价指标
  • 七.量化交易策略的实现
    • 1.RSI策略
    • 2.SMA策略
      • 2.1计算20天和50天的移动平均线
    • 3.VWAP策略
    • 4.三连涨策略
    • 5.布林带策略
    • 6.MACD策略
    • 7.简易波动指标(EMV)
    • 8.海龟策略
    • 9.ATR指标
    • 10.KDJ指标

一.量化交易的流程和概念

1.数据分析I2O流程

在了解量化交易概念之前,我们先了解数据分析领域的流程划分模式。
Python量化交易学习入门_第1张图片
I2O模式不仅适用于IT行业和数据分析,实际上大部分行业和日常工作中都可以采用。对于量化交易而言,"I"就是数据采集,“2”(to)就是量化分析、策略分析,是其中最重要的环节 ,"o"就是交易,即下单环节。
总的来说量化交易就是借助统计学和数学(机器学习)的方法,利用计算机技术来进行交易的证券投资方式

2.量化交易和高频交易、自动交易的区别

量化交易:核心是策略分析,通过对历史数据、实时数据的分析,选择最佳的交易股票的品种以及交易(买进,卖出)的时间点。侧重于选股与择时。

高频交易:从及其短暂的市场变化中寻求获利的计算机化交易。

自动交易:有专门的自动交易软件,它会让计算机按照用户设定好的添加自动交易。当然盈利或亏损取决于用户的交易策略的好坏。

3.量化交易的流程

Python量化交易学习入门_第2张图片
其中重点是构建策略,常用策略一般有以下几种:

Python量化交易学习入门_第3张图片

学习量化交易应当掌握的技能:
(1)投资策略:金融市场与经济环境
(2)科学研究:模型与数据挖掘技术
(3)计算机技术:IT和互联网

二.量化交易的分类

Python量化交易学习入门_第4张图片

注意:股票的量化投资是一种价值投资,我们所做的是挖掘市场中的价值股票,而不是预测股票的涨跌来进行投资。

三:常用量化框架

Python量化交易学习入门_第5张图片

四.一个完整的策略

Python量化交易学习入门_第6张图片

五.常用数据源和模块库

Python量化交易学习入门_第7张图片

1.tushare模块库获取数据

1.1获取历史行情数据

import datetime
import tushare as ts
ts.set_token('你的token')
ts=ts.pro_api()
#start=datetime.datetime(2020,12,1)
#end=datetime.datetime(2021,1,1)
#获取拼多多的数据
ts.get_hist_data('PDD',start='2020-12-01',end='2020-01-01')

返回结果有
date:日期
open:开盘价
high:最高价
low:最低价
volume:成交量
price_change:价格变动
p_change:跌涨幅
ma5: 5日均价
ma10: 10日均价
ma20: 20日均价
v_ma5: 5日均量
v_ma20: 20日均量
turnover:换手率

其他做法类似

2.pandas获取数据


import numpy as np 
import pandas as pd
import matplotlib.pyplot as plt
import datetime
import pandas_datareader.data as web# set start and end dates 
start = datetime.datetime(2018, 2, 1) 
end = datetime.datetime(2020, 2, 1) # extract the closing price data
ultratech_df = web.DataReader('PDD', 'yahoo', start = start, end = end)['Close']
ultratech_df.columns = ['Close Price']
ultratech_df['Close Price'].plot(figsize = (14,7))
plt.grid()
plt.ylabel("Price in Rupees")
plt.show()

六.策略的评价指标

Python量化交易学习入门_第8张图片
Alpha策略:利用管理人在选股和择时上的优势寻找具有稳定的Aalpha收益的现货组合,它是基于Beta调整后的预期收益率的超额收益率。
alpha=0, 表明收益和无风险收益相同;alpha>0, 表明超额收益,alpha<0, 收益比无风险收益低。追求最大alpha 就是所谓的最求最大超额收益。

Beta策略:就是当判断股票要上涨时增大Beta值,多买点股票,预测要下跌时卖点股票,被动跟踪指数的策略,假如一只股票的价格和市场价格的波动性是一致的,那么这只股票的Beta值为1,如果一只股票的Beta值为1.1,当市场价格上升10%时,该股票的价格上升11%,市场价格下降10%时,该股票的价格下降11%。

七.量化交易策略的实现

1.RSI策略

‘’’
RSI(Relative Strength Index)根据一定时期内上涨和下跌幅度之和的比率反映出市场在一定时期内的景气程度.
RSI1一般是6日相对强弱指标
RSI2一般是12日相对强弱指标
RSI3一般是24日相对强弱指标

RSI变动范围:
80-100 极强,卖出
50-80 强,买入
20-50 弱,观望
0-20 极弱 买入
‘’’

‘’’
计算公式:
UP_AVG = UP_AMOUNT/PERIODS (周期内上涨数量平均)
DOWN_AVG = DOWN_AMOUNT/PERIODS(周期内下跌数量平均)
RS = UP_AVG/DOWN_AVG(相对平均)
RSI = 100 - 100 / (1 + RS) (相对强弱指数)

快速计算公式
利用前一个UP_AVG, DOWN_AVG快速计算当前UP_AVG, DOWN_AVG

UP_AVG = (UP_AVG_PREV * (PERIODS - 1) + UP) / PERIODS
DOWN_AVG = (UP_AVG_PREV * (PERIODS - 1) + DOWN) / PERIODS
RS = UP_AVG/DOWN_AVG
RSI = 100 - 100 / (1 + RS)

‘’’
代码:

# -*- coding: utf-8 -*-
"""
Created on Thu Jan  7 12:37:07 2021

@author: 守住1.份坚持
"""


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#数据可以用tushare模块获取或pandas的Datereaderv获取
data1=pd.read_csv('d://anaconda3//拼多多.csv')

def RSI(t, periods=10):
    length = len(t)
    rsies = [np.nan]*length
    #数据长度不超过周期,无法计算;
    if length <= periods:
        return rsies
    #用于快速计算;
    up_avg = 0
    down_avg = 0

    #首先计算第一个RSI,用前periods+1个数据,构成periods个价差序列;
    first_t = t[:periods+1]
    for i in range(1, len(first_t)):
        #价格上涨;
        if first_t[i] >= first_t[i-1]:
            up_avg += first_t[i] - first_t[i-1]
        #价格下跌;
        else:
            down_avg += first_t[i-1] - first_t[i]
    up_avg = up_avg / periods
    down_avg = down_avg / periods
    rs = up_avg / down_avg
    rsies[periods] = 100 - 100/(1+rs)

    #后面的将使用快速计算;
    for j in range(periods+1, length):
        up = 0
        down = 0
        if t[j] >= t[j-1]:
            up = t[j] - t[j-1]
            down = 0
        else:
            up = 0
            down = t[j-1] - t[j]
        #类似移动平均的计算公式;
        up_avg = (up_avg*(periods - 1) + up)/periods
        down_avg = (down_avg*(periods - 1) + down)/periods
        rs = up_avg/down_avg
        rsies[j] = 100 - 100/(1+rs)
    return rsies  
data=data1['Close']
d1=RSI(data,10)

#将列表转换为数据框
c={
     "RSI":d1}
c1=pd.DataFrame(c)
c2=data1['Date']
plt.figure(figsize = (20,10))
plt.plot(c2,c1,markersize = 15,color='g')
plt.ylabel('RSI', fontsize = 15 )
plt.xlabel('date', fontsize = 15 )
plt.title('RSI指标', fontsize = 20)
plt.legend()
#绘制刻度线的网格线
plt.grid()
plt.show()

结果:本次案例是从2018年的数据到2021年1月的数据,数据量多,所以日期坐标显示不清楚Python量化交易学习入门_第9张图片

2.SMA策略

SMA策略有三种类型:

Simple Moving Average(SMA)
简单移动平均线(SMA)
简单移动平均线是通过将最近n天的收盘价加起来然后除以天数(时间段)得出的.

Weighted Moving Average(WMA)
加权移动平均线(WMA)

Exponential Moving Average (EMA or EWMA)
指数移动平均线(EMA或EWMA)

指数移动平均线赋予最近时期更大的权重。 这使它们比SMA更可靠,因为它们可以更好地表示资产的近期表现。

2.1计算20天和50天的移动平均线

import numpy as np 
import pandas as pd
import matplotlib.pyplot as plt
data=pd.read_csv('d://anaconda3//拼多多.csv')
data['Close'].plot(figsize = (15, 8))
plt.grid()
plt.ylabel("Price in pdd")
plt.show()

data['20_SMA'] = data['Close'].rolling(window = 20, min_periods = 1).mean()
# create 50 days simple moving average column
'''window : 窗口的大小
min_periods : 最小的观察数值个数'''
data['50_SMA'] =data['Close'].rolling(window = 50, min_periods = 1).mean()
# display first few rows
print(data.head())

下图是拼多多从2018年到2021年的收盘价。Python量化交易学习入门_第10张图片Python量化交易学习入门_第11张图片
移动平均线本身就是一条线,通常会覆盖在价格图表中以指示价格趋势。 当更快的移动平均线(即,较短时间段的移动平均线)与慢速移动平均线(即较长时间段的移动平均线)相交时,就会发生交叉。 在股票交易中,此汇合点可用作购买或出售资产的潜在指标。

当短期移动均线超过长期移动均线时,表明买入信号。

相反,当短期移动均线低于长期移动均线时,可能是卖出的好时机。

于是我们可以:
创建一个新的“ Signal ”列,以便如果20天SMA大于50天SMA则将Signal值设置为1,否则当50天SMA大于20天SMA时设置其值为0。

根据这些“ 信号 ”值,可以生成头寸订单以表示交易信号。 当更快的移动平均线和慢的移动平均线交叉时发生交叉,即“信号”从0变为1 (或从1变为0)。 因此,要合并此信息,请创建一个新的“ 位置 ”列,该列与“ 信号 ”列的日常差异无关。

设置头寸position.
当“ 头寸 ” = 1时,表示信号已从0变为1,这意味着短期(较快)移动均线已经超过长期(较慢)移动均线,从而触发买入买单 。

当“ 头寸 ” = -1时,表示信号已从1变为0,这意味着短期(较快)移动均线已低于长期(较慢)移动均线,从而触发卖出。


import numpy as np 
import pandas as pd
import matplotlib.pyplot as plt
data=pd.read_csv('d://anaconda3//拼多多.csv')
data[['Date','Close']].plot(figsize = (15, 8))
data['20_SMA'] = data['Close'].rolling(window = 20, min_periods = 1).mean()
# create 50 days simple moving average column
'''window : 窗口的大小
min_periods : 最小的观察数值个数'''
data['50_SMA'] =data['Close'].rolling(window = 50, min_periods = 1).mean()

#在我们现有的熊猫数据框中,创建一个新的“ Signal ”列,以便如果20天SMA大于50天SMA则将Signal值设置为1,否则当50天SMA大于20天SMA时设置其值为0。
#iloc()函数根据行号提取行数据
#diff()某列或者某行数据的差分
data['Signal'] = 0
for i in range(20, data.shape[0]):
 if data['20_SMA'].iloc[i] > data['50_SMA'].iloc[i]:
  data['Signal'].iloc[i] = 1
 else:
  data['Signal'].iloc[i] = 0
  
data['Position'] = data['Signal'].diff()# display first few rows
print(data[:20])

#当position=1时,说明信号已经从0到1,买入,当postion=-1时说明信号从1到0,卖出
plt.figure(figsize = (20,10))
# plot close price, short-term and long-term moving averages 
data['Close'].plot(color = 'k', label= 'Close Price') 
data['20_SMA'].plot(color = 'b',label = '20-day SMA') 
data['50_SMA'].plot(color = 'g', label = '50-day SMA')# plot ‘buy’ signals
plt.plot(data[data['Position'] == 1].index, 
         data['20_SMA'][data['Position'] == 1], 
         '^', markersize = 15, color = 'g', label = 'buy')# plot ‘sell’ signals
plt.plot(data[data['Position'] == -1].index, 
         data['20_SMA'][data['Position'] == -1], 
        'v', markersize = 15, color = 'r', label = 'sell')
plt.ylabel('Price in pdd', fontsize = 15 )
plt.xlabel('Date', fontsize = 15 )
plt.title('RSI', fontsize = 20)
plt.legend()
#绘制刻度线的网格线
plt.grid()
plt.show()




Python量化交易学习入门_第12张图片

Python量化交易学习入门_第13张图片
蓝线表示较快的移动平均线(20天平均线),绿线表示较慢的移动平均线(50天平均线),黑线表示实际收盘价。 短期移动平均线非常类似于实际价格,因为考虑到最近的价格,这非常有意义。 相比之下,长期移动平均线的滞后时间相对较大,并且与实际价格曲线大致相似。

当快速移动平均线超过慢速移动平均线时,将触发买入信号(以绿色的向上三角形表示)。 这表明趋势发生了变化,即过去20天的平ASP格已经高于过去50天的平ASP格。 同样,当快速移动平均线低于慢速移动平均线以下时,会触发卖出信号(以红色的向下三角形表示),表明过去20天的平ASP格已降至最近50天的平ASP格以下。

3.VWAP策略

算法交易其实主要是用在基金公司、券商量化比较多。例如我已经选好股,要大量买入,但是单凭交易员的操作海量单而且要完成买入100万股这些的操作是有点的困难的。那么这时候怎样解决拆单,防止冲击成本的问题呢?只有依靠算法交易了,现在市面上的流行算法交易有两种,第一种是VWAP,一种是TWAP。但是每种算法交易也有它的坏处,就是很容给人看出操作手法(如果策略比较简单的情况下),所以这种需要不断优化。

      VWAP是Volume Weighted Average Price 的缩写,译为成交量加权平均价。
      VWAP策略即是一种拆分大额委托单,在约定时间段内分批执行
      ,以期使得最终买入或卖出成交均价尽量接近该段时间内
      整个市场成交均价的算法交易策略。
import pandas as pd
import matplotlib.pyplot as plt
data=pd.read_csv('d://anaconda3//拼多多.csv')
#vwap=(high_price+low_price)/2*volume 的总和然后除以volume_sum
# calculate vwap value
def calc_vwap(marketDataTable):
    n = len(marketDataTable) - 1
    total_sum = 0.0
    volume_sum = 0
    for i in range(1, n + 1):
        high_price = float(marketDataTable[i][1])
        low_price = float(marketDataTable[i][2])
        price = (high_price + low_price) / 2
        volume = int(marketDataTable[i][5])
        total_sum += price * volume
        volume_sum += volume
 
    return total_sum / volume_sum
#twap=(high_price+low_price)/2的总和除以n
# calculate twap value
def calc_twap(marketDataTable):
    n = len(marketDataTable) - 1
    price_sum = 0.0
    for i in range(1, n + 1):
        high_price = float(marketDataTable[i][1])
        low_price = float(marketDataTable[i][2])
        price = (high_price + low_price) / 2
        price_sum += price
 
    return price_sum / n

4.三连涨策略

假设通过分析历史数据得知某股票如果连涨三天,则第四天也会涨(当然一般看期望而不是概率),那么就可以在3天连续牛市末建仓,第四天末清仓。

5.布林带策略

源自Boll指标,布林线由约翰*布林创造,即利用统计原理,求出股价的标准差和信赖区间,从而确定股价的波动范围和未来走势。
Boll指标利用“股价通道”显示股价的各种价位:
当股价波动小、处于盘整时,股价通道就会变窄,预示着股价波动处于平静期。
当股价波动超过股价通道的上轨时,预示着股价异常激烈的向上波动即将开始。
当股价波动超出股价通道的下轨时,预示着股价异常激烈的向下波动即将开始。

股价通道由三条线组成:上下两条线可以看成股价的压力线和支撑线,中间的先是股价平均线。
中轨线:N日的移动平均线
上轨线:中轨线+两倍的标准差
下轨线:中轨线-两倍的标准差

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

##布林带策略函数
def boll_brand(df,n):
    length=len(df['Close'])
    res=[]
    ups=[]
    downs=[]
    means=[]
    for i in range(length):
        mean=df['Close'].mean()
        std=df['Close'].std()
        up=mean+n*std
        down=mean-n*std
        ups.append(up)
        downs.append(down)
        means.append(mean)
        if df['Close'].values[-1]>up:
            res.append(1)
        elif df['Close'].values[-1]<down:
            res.append(0)
        else:
            res.append(-1)
    df['boll_brand']=res
    df['up']=ups
    df['down']=downs
    df['mean']=means
    return df

df=pd.read_csv('d://anaconda3//a.csv')
df1=df['Close']
print(df1.head())
#获取被方差的布林带策略的上下轨线值,判断是否买入和卖出
data=boll_brand(df,2)
#data[data['boll_brand']==0]

plt.figure(figsize = (20,10))
data['Close'].plot(color='k',label='Close price')
data['mean'].plot(color='b',label='mean')
data['down'].plot(color='g',label='down')
data['up'].plot(color='r',label='up')

plt.ylabel('Price ', fontsize = 15 )
plt.xlabel('Date', fontsize = 15 )
plt.legend()
#绘制刻度线的网格线
plt.grid()
plt.show()

这两张图的来源:量化交易

Python量化交易学习入门_第14张图片
Python量化交易学习入门_第15张图片

6.MACD策略

MACD(Moving Average Congeregence and Divergence)指数平滑移动平均线。由短期(通常12日)的指数移动平均线减去长期的(通常26日)指数移动平均线。
当MACD由负数变正数,是买的信号,反之是卖的信号。

MACD的相关参数如下:

Python量化交易学习入门_第16张图片
MACD交易时机如下:
DIF从下而上的穿过DEA时,买进。
DIF从上而下的穿过DEA时,卖出。

7.简易波动指标(EMV)

简易波动指标(EMV),它是根据成交量和人气的变化,构成一个完整的股价系统循环。指示投资者在人气聚集且成交热的时候买进股票,并且在成交量逐渐展现无力,而狂热的投资者尚未察觉能量即将用尽时,卖出股票。EMV指标是一个将价格与成交量的变化结合在一起的指标。

2计算公式
A=(今日最高+今日最低)/2
B=(前日最高+前日最低)/2
C=今日最高-今日最低
EM=(A-B)*C/今日成交额
EMV=N日内EM的累和

如何使用简易波动指标EMV:
第一,用于判断股票价格趋势的方向。EMV大于0,表示主力在收集股票;EMV小于0,表示主力在派发股票。所以,当股票价格在上升趋势时,EMV上形成的峰值比较高,谷值比较浅,整体摆荡区间比较比较靠上(大于0的方向);当股票价格在下降趋势时,EMV上形成的峰值比较低,谷值比较深,整体摆荡区间比较比较靠下(小于0的方向)。


# Load the necessary packages and modules
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# Ease of Movement 
def EVM(data, ndays): 
 dm = ((data['High'] + data['Low'])/2) - ((data['High'].shift(1) + data['Low'].shift(1))/2)
 br = (data['Volume'] / 100000000) / ((data['High'] - data['Low']))
 EVM = dm / br 
 EVM_MA =np.round(pd.Series.rolling(EVM,window=ndays).mean())
 data['EVM']= data.join(EVM_MA) 
 return data 

data=pd.read_csv('d://anaconda3//拼多多.csv')


# Compute the 14-day Ease of Movement for pdd
n = 14
pdd_EVM = EVM(data, n)
EVM = pdd_EVM['EVM']

# Plotting the Price Series chart and the Ease Of Movement below
fig = plt.figure(figsize=(7,5))
ax = fig.add_subplot(2, 1, 1)
ax.set_xticklabels([])
plt.plot(data['Close'],lw=1)
plt.title('pdd Price Chart')
plt.ylabel('Close Price')
plt.grid(True)
bx = fig.add_subplot(2, 1, 2)
plt.plot(EVM,'k',lw=0.75,linestyle='-',label='EVM(14)')
plt.legend(loc=2)
plt.ylabel('EVM values')
plt.grid(True)
plt.setp(plt.gca().get_xticklabels(), rotation=30)


Python量化交易学习入门_第17张图片

8.海龟策略

该策略以海龟交易法则为核心。海龟交易法则,起源于八十年代的美国,是一套简单有效的交易法则。这个法则以及使用这个法则的人的故事被写成了一本书——《海龟交易法则》。这是一本入门量化投资的经典书籍,每谈及此,当时我看这本书的欣喜和激动又映入了脑海。

海龟交易的具体规则是:

当今天的收盘价,大于过去20个交易日中的最高价时,以收盘价买入;
买入后,当收盘价小于过去10个交易日中的最低价时,以收盘价卖出。

9.ATR指标

均幅指标Average true range(ATR)是取一定时间周期内的股价波动幅度的移动平均值,主要用于研判买卖时机。

均幅指标是显示市场变化率的指标,由威尔德(Welles Wilder)在《技术交易系统中的新概念》一书中首次提出,已成为众多指标经常引用的技术量。威尔德发现较高的ATR值常发生在市场底部,并伴随恐慌性抛盘。当其值较低时,则往往发生在合并以后的市场顶部。

由于惊恐抛售所驱使的价格的剧烈下跌,这一指标在市场底部通常可以达到一个较高的价值。这一指标对于长期持续边幅移动的时段是非常典型的,这一情况通常发生在市场的顶部,或者是在价格巩固期间。平均波幅通道技术指标依据同样的原则,可以被解释成为其他一些易变指数。根据这个指标来进行预测的原则可以表达为:该指标价值越高,趋势改变的可能性就越高;该指标的价值越低,趋势的移动性就越弱。
Python量化交易学习入门_第18张图片

import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_csv('d://anaconda3//拼多多.csv')

for i in range(0, len(df)):
    df.loc[df.index[i], 'TR'] = max((df['Close'][i] - df['Low'][i]), 
            (df['High'][i] - df['Close'].shift(-1)[i]), (df['Low'][i] - df['Close'].shift(-1)[i]))
df['ATR'] = df['TR'].rolling(12).mean()

fig = plt.figure(figsize=(7,5))
ax = fig.add_subplot(2, 1, 1)
ax.set_xticklabels([])
plt.plot(df['Close'],lw=1)
plt.title('pdd Price')
plt.ylabel('Close Price')
plt.grid(True)
bx = fig.add_subplot(2, 1, 2)
plt.plot(df['ATR'],'k',lw=0.75,linestyle='-',label='ATR')
plt.legend(loc=2)
plt.ylabel('values')
plt.grid(True)
plt.setp(plt.gca().get_xticklabels(), rotation=30)
plt.show()

Python量化交易学习入门_第19张图片

10.KDJ指标

KDJ中文名称是随机指标,最早是以KD的指标的形式出现的,而KD指标又是子威廉指标的基础上发展起来的,KDJ是利用N日内最高价、最低价、收盘价计算得到的,常用来判断标的超买超卖、价格波动。被广泛运用与股市的中短期趋势分析中。
在计算KDJ时,首先要计算周期的RSV值,RSV是(今收与最低的差值)与(最高与最低的差值比),当RSV较高时,说明今天标的价格走势不错。但今天走势不错并非意味着已经形成较为明确的上涨趋势,只有当最近一段时间一直上涨,才能说明标的有了非常明显的上涨趋势.计算完KDJ后,再计算K值,D值,J值

计算公式:

N日RSV=((第N日收盘价)-(N日内最低价)) / ((N日内最高价)-(N日内最低价))*100

当日K值=2/3前一日k值+1/3当日RSV
当日D值=2/3前一日D值+1/3当日K值

若前一日无K值或D值,可以用50来代替。

J值=3当日K值-2当日D值

使用方法:
(1)K与D的值永远介于0到100之间,当D大于80时,行业呈现超买现象。当D小于20时呈现超卖现象。
(2)在上涨趋势中,K值大于D值,当K向上突破D线为买进信号,在下跌趋势中,K值小于D值,当K线向下突破D线为卖出信号。

import matplotlib.pyplot as plt
import pandas as pd
#解决中文显示问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False


def KDJ(N,M1,M2):
    data=pd.read_csv('d://anaconda3//拼多多.csv')
    data=data[:1000]
    # 计算前N日最低和最高,缺失值用前n日(n
    lowest = data['Low'].rolling(N).min()
    lowest.fillna(value=data['Low'].expanding().min(), inplace=True)
    highest = data['High'].rolling(N).max()
    highest.fillna(value=data['High'].expanding().max(), inplace=True)
    RSV=(data['Close']-lowest)/(highest-lowest)*100
    data['K值'] = RSV.ewm(alpha=1/M1, adjust=False).mean()     # ewm是指数加权函数
    data['D值'] = data['K值'].ewm(alpha=1/M2, adjust=False).mean()
    data['J值'] = 3.0 * data['K值'] - 2.0 * data['D值']
    return data

data=KDJ(9,3,3)

plt.figure(figsize=(8,6))
ax1=plt.subplot(211)
plt.title('PDD')
plt.plot(data['Close'],color='r',label='Close')
plt.plot(data['K值'],color='b',label='K')
plt.plot(data['D值'],color='y',label='D')
plt.plot(data['J值'],color='g',label='J')

ax2=plt.subplot(212)
plt.title('KDJ')
plt.plot(data['K值'],color='b',label='K')
plt.plot(data['D值'],color='y',label='D')
plt.plot(data['J值'],color='r',label='J')

plt.show()

Python量化交易学习入门_第20张图片

你可能感兴趣的:(量化交易)