自己做量化交易软件(8)通通量化自编公式-仿通达信大智慧公式指标

117 篇文章 122 订阅
116 篇文章 46 订阅

我们主要是通过设计通通量化软件,来学习python编程,另外也是一个量化软件基础功能学习开发的过程.
我的文章给出的都是经过自己学习总结的最终代码.读者可以通过学习来掌握编写量化软件的思路和程序.
前面我们写了BOLL指标和双均线策略,很多读者感觉用python改写通达信大智慧公式指标非常不方便.能不能直接使用?或者简单改写就能使用呢?
我经过学习尝试,认为完全可以。
我们这篇文章以通达信KDJ指标的移植到通通量化系统的过程为例子。
作者打算用python设计一个普及型量化分析回测和能够深度学习以及人工智能分析平台。普及型通通量化平台,对用户来说不需要掌握过多专业知识,只要复制别人的策略,经过简单修改,就能使用。但是这个平台不是你有热情就能做好的,对于python来说,作者接触至今不到3个月,好在作者会c++,java等多个编程语言,不熟悉python语法,但对于程序逻辑和算法来说,作者还是比较精通的。
首先我们看看通达信KDJ公式的代码是什么,请看下图。
通达信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-1]) and (tp1[i] >=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 y<tp1[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

#取前n周期数值的最低价
def LLV(tp1, n):  
    i = 0 
    ZB_l = []
    y=tp1[i]
    while i < n: 
         if y>tp1[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:3
K-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测试程序运行结果

通过KDJ公式移植的尝试,我们可以通过简单的修改,来使用网上无数的通达信自编公式了。
如果你有兴趣尝试,可以百度读者设计各种公式:荷蒲公式或独狼公式。

### 回答1: 您好,我是AI语言助手,以下是对您的回复: 20201022-成信大-c语言程序设计-20201学期《c语言程序设计b》是一门面向大学生的C语言程序设计课程,主要教授C语言的基础知识和编程技巧,包括数据类型、运算符、流程控制语句、函数、指针、数组、结构体等内容。通过本课程的学习,学生可以掌握C语言的基本语法和编程思想,提高编程能力和解决问题的能力,为以后的编程学习和工作打下坚实的基础。 ### 回答2: 20201学期的《c语言程序设计b》是一个深入学习C语言的课程,教授的是C语言的高级应用。在本次课程中,学生将会进一步学习C语言的语法、程序设计思路以及具体的编码实践。 首先,学生将会学习C语言中的函数、指针、结构体、联合体、枚举等高级概念。这些概念是C语言面向对象编程中至关重要的概念,也是学生在日后编写复杂程序时所必须了解的内容。此外,在学习这些概念的同时,学生还将学习如何使用宏定义和预编译指令来进一步优化程序性能。 其次,学生将会进行具体的编码实践,包括基于C语言的数据结构设计和实现、字符串处理、文件操作、网络编程等等。这些项目和实践将会提供给学生大量的机会来将所学的概念应用到具体的场景中,帮助学生更深入地理解C语言的应用。 此外,学生还将参加课堂讨论、代码评审等活动,通过这些活动来提高自己的编程能力、代码质量和团队协作能力。教师也将会给学生提供详细的反馈,帮助他们改善自己的问题和提高自己的能力。 总之,《c语言程序设计b》是一门非常重要的课程,对于学生日后从事计算机编程工作具有非常重要的意义。通过学习这门课程,学生将会大幅提高自己的编程能力、透彻理解C语言并将其应用到实际工作中。 ### 回答3: 成信大-20201学期《c语言程序设计b》是一门针对深入学习C语言的高级课程,内容涵盖了高级数据结构、算法设计、动态内存分配、文件操作等等。 在这门课程中,学生将通过实践和理论学习,掌握C语言的高级编程技巧和策略。课程的重点之一是高级数据结构,包括链表、树、哈希表、图等等,学生将深入理解数据结构的实现和应用。 除此之外,课程还将涉及算法设计和分析,学生将学习如何设计出高效的算法,并进行时间和空间复杂度分析。动态内存分配和文件操作也是这门课程的重点,这些技术对于C语言程序设计来说非常重要。 学生在课程中还将开展实践项目,以实现理论学习。通过项目实践,学生将在实际中应用学到的技术,发现其中存在的问题并解决。 总之,成信大-20201学期《c语言程序设计b》是一门非常高级的、面向深度学习的课程。通过系统学习和实践的方式,学生将深入掌握C语言的高级编程技巧。这门课程对于想要深入学习C语言的学生来说是非常重要的。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荷蒲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值