我们主要是通过设计通通量化软件,来学习python编程,另外也是一个量化软件基础功能学习开发的过程.
我的文章给出的都是经过自己学习总结的最终代码.读者可以通过学习来掌握编写量化软件的思路和程序.
前面我们写了BOLL指标和双均线策略,很多读者感觉用python改写通达信大智慧公式指标非常不方便.能不能直接使用?或者简单改写就能使用呢?
我经过学习尝试,认为完全可以。
我们这篇文章以通达信KDJ指标的移植到通通量化系统的过程为例子。
作者打算用python设计一个普及型量化分析回测和能够深度学习以及人工智能分析平台。普及型通通量化平台,对用户来说不需要掌握过多专业知识,只要复制别人的策略,经过简单修改,就能使用。但是这个平台不是你有热情就能做好的,对于python来说,作者接触至今不到3个月,好在作者会c++,java等多个编程语言,不熟悉python语法,但对于程序逻辑和算法来说,作者还是比较精通的。
首先我们看看通达信KDJ公式的代码是什么,请看下图。
通达信公式的命令格式和python的命令格式不同。有什么不同,读者去百度,我们这里只给结论和干货。
对于通通量化平台来说,目前还处在建立基础模块的阶段。如果读者下载了通通量化包,可以直接阅读我写的代码,或者引用我写的函数来用。
如果你已经下载了通通量化包,请在目录中创建新文件HP_formula.py
HP_formula.py文件内容如下:
# -*- coding: utf-8 -*-
"""
通通量化仿通达新大智慧公式基础库 Ver1.00
#版本:Ver1.00
#设计人:独狼荷蒲
#电话:18578755056
#QQ:2775205
#百度:荷蒲指标
#开始设计日期: 2018-07-08
#公众号:独狼股票分析
#使用者请同意最后<版权声明>
#最后修改日期:2018年9月26日
#主程序:HP_main.py
*********************************************
通达信公式转为python公式的过程
1.‘:=’为赋值语句,用程序替换‘:=’为python的赋值命令‘=。
2.‘:’为公式的赋值带输出画线命令,再替换‘:’为‘=’,‘:’前为输出变量,顺序写到return 返回参数中。
3.全部命令转为英文大写。
4.删除绘图格式命令。
5.删除掉每行未分号; 。
6.参数可写到函数参数表中.例如: def KDJ(N=9, M1=3, M2=3):
###################基本函数库##############################
"""
import platform
import pandas as pd
import numpy as np
import math
import HP_global
import HP_set
def EMA(s,n):
EMA=s.ewm(span = n, min_periods = n - 1,adjust=True,ignore_na=False).mean()
return EMA
#通用MA计算
def MA(Series,n):
G_pyver=int(platform.python_version()[0:1])
G_ma=None
if G_pyver==2:
G_MAstr='pd.rolling_mean(Series,n)'
G_ma=eval(G_MAstr)
else :
G_MAstr='Series.rolling(window=n,center=False).mean()'
G_ma=eval(G_MAstr)
return G_ma
#通用STD计算
def STD(Series,n):
G_pyver=int(platform.python_version()[0:1])
G_ma=None
if G_pyver==2:
G_MAstr='pd.rolling_std(Series,n)'
G_ma=eval(G_MAstr)
else :
G_MAstr='Series.rolling(window=n,center=False).std()'
G_ma=eval(G_MAstr)
return G_ma
#上穿函数
def CROSS(tp1,tp2):
i = 1
CR_l = [0]
y=0
while i < len(df):
if ((tp1[i-1]=tp2[i])):
y=1
else:
y=0
CR_l.append(y)
i = i + 1
CR_s = pd.Series(CR_l)
CR = pd.Series(CR_s, name = na)
df = df.join(CR)
return df
def DMA(tp1,tp2):
i = 1
ZB_l = [0]
y=tp1[i-1]*tp2[i-1]
i=i+1
while i < len(tp1):
y=tp1[i-1]*tp2[i-1]+(1-tp2[i-1])*y
ZB_l.append(y)
i = i + 1
ZB_s = pd.Series(ZB_l)
return df_s
#取前n周期数值函数
def REF(tp1, n):
i = 0
ZB_l = []
y = 0
while i < n:
y=tp1[i]
ZB_l.append(y)
i=i+1
while i < len(tp1):
y=tp1[i-n]
ZB_l.append(y)
i = i + 1
ZB_s = pd.Series(ZB_l)
return ZB_s
#取前n周期数值的最高价
def HHV(tp1, n):
i = 0
ZB_l = []
y=tp1[i]
while i < n:
if ytp1[i]:
y=tp1[i]
ZB_l.append(y)
i=i+1
while i < len(tp1):
j=1
y=tp1[i]
while j < n:
if y>tp1[i-j] :
y=tp1[i-j]
j=j+1
ZB_l.append(y)
i = i + 1
ZB_s = pd.Series(ZB_l)
return ZB_s
#SMA(X,N,M),求X的N日移动平均,M为权重。算法:若Y=SMA(X,N,M) 则 Y=(M*X+(N-M)*Y')/N,其中Y'表示上一周期Y值,N必须大于M。
def SMA(tp1,n,m):
i = 0
ZB_l = []
y=1
while i < len(tp1):
y=(tp1[i]*m+(n-m)*y)/n
ZB_l.append(y)
i=i+1
ZB_s = pd.Series(ZB_l)
return ZB_s
通达信公式转为python公式的过程
1.‘:=’为赋值语句,用程序替换‘:=’为python的赋值命令‘=。
2.‘:’为公式的赋值带输出画线命令,再替换‘:’为‘=’,‘:’前为输出变量,顺序写到return 返回参数中。
3.全部命令转为英文大写。
4.删除绘图格式命令。
5.删除掉每行未分号; 。
6.参数可写到函数参数表中.例如: def KDJ(N=9, M1=3, M2=3):
例如通达信 KDJ指标公式描述如下。
参数表 N:=9, M1:=3, M2:=3
RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))100;
K:SMA(RSV,M1,1);
D:SMA(K,M2,1);
J:3K-2*D;
def KDJ(N=9, M1=3, M2=3):
RSV = (CLOSE - LLV(LOW, N)) / (HHV(HIGH, N) - LLV(LOW, N)) * 100
K = SMA(RSV,M1,1)
D = SMA(K,M2,1)
J = 3*K-2*D
return K, D, J
下面我们给出完整测试代码。
# -*- coding: utf-8 -*-
#通通量化包 通达信KDJ测试
#tushare 数据测试
#日期:2018-09-26
#QQ:2775205
import tushare as ts
import matplotlib.pyplot as plt
import pandas as pd
from HP_global import *
from HP_set import *
from HP_formula import *
df1 = ts.get_k_data('000001',ktype='D')
##仿通达信系统公式初始化
#mydf是一个股票数据序列。将股票数据赋值给mydf
mydf=df1
CLOSE=mydf['close']
LOW=mydf['low']
HIGH=mydf['high']
OPEN=mydf['open']
VOL=mydf['volume']
C=mydf['close']
L=mydf['low']
H=mydf['high']
O=mydf['open']
V=mydf['volume']
#KDJ python随机指标
def KDJ(N=9, M1=3, M2=3):
RSV = (CLOSE - LLV(LOW, N)) / (HHV(HIGH, N) - LLV(LOW, N)) * 100
K = SMA(RSV,M1,1)
D = SMA(K,M2,1)
J = 3*K-2*D
return K, D, J
#使用KDJ指标,返回K,D,J序列。
K,D,J=KDJ(9,3,3)
#下面显示KDJ指标线
# 开启一个双图例的窗口,定义为211和212
plt.figure(2, figsize=(12,8), dpi=80)
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
ax1 = plt.subplot(211)
ax2 = plt.subplot(212)
# ax1(211窗口)
plt.sca(ax1)
plt.title('价格线')
# 显示网格:grid='on'
mydf.close.plot(color='red', grid='on')
# ax2(212窗口)
plt.sca(ax2)
ax2.axhline(80, color='r')
ax2.axhline(20, color='r')
K.plot(color='green', grid='on')
D.plot(color='red', grid='on')
J.plot(color='blue', grid='on')
#添加标题
plt.title('KDJ')
plt.show()
通过KDJ公式移植的尝试,我们可以通过简单的修改,来使用网上无数的通达信自编公式了。
如果你有兴趣尝试,可以百度读者设计各种公式:荷蒲公式或独狼公式。