您当前的位置:网站首页 » 实用技术

栏目导航

站内搜索









自己做量化交易软件(41)自编仿通达信公式及自编因子公式的计算速度比较及因子公式结果排名

自己做量化交易软件(41)自编仿通达信公式及自编因子公式的计算速度比较及因子公式结果排名
自编仿通达信指标公式是对单只股票计算,如果对一批股票计算,只能用循环来逐个处理。
自编因子指标公式是对一批股票同步计算,因此可以想象速度肯定会很快。
我们下面做一个速度计算比较。为了能精确计算速度,我们预先读取沪深300指数的300只股票行情,再进行计算比较。
因Python的显示对速度影响很大,我们只显示计算所花费的时间。
计算结果比较请看上一篇博客《自己做量化交易软件(40)小白量化实战13–Alpha101及自编因子公式
下面给出全部程序,和最后计算速度比较结果。

#  仿通达信单只股票计算和因子公式计算速度比较

#购买<零基础搭建量化投资系统>正版书,送小白量化软件源代码。# https://item.jd.com/61567375505.html#独狼荷蒲qq:2775205#通通python量化群:524949939#电话微信:18578755056#微信公众号:独狼股票分析
import time
import numpy as np
import pandas as pd
from scipy.stats import rankdata
import HP_tdx as htdx  #小白量化通达信行情库
from HP_formula2 import *  #小白量化仿通达信公式函数库
    
#连接行情主站
htdx.TdxInit(ip='183.60.224.178',port=7709)#获取板块的所有股票代码
bkn='沪深300'codes=htdx.getblock2(bkn) #返回板块中的股票print(bkn,' 板块的所有股票 :',codes)print('开始获取行情数据!')#小白量化数据池
stocks_dict = {}  #小白量化数据池for c in codes:
    stock =htdx. get_security_bars(nCategory=5,nMarket = 0,code=c,nCount=800)
    # 小白量化仿通达信公式数据格式化
    mydf=stock.reset_index(level=None, drop=True ,col_level=0, col_fill='')  
    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']    
    mydf['rtn']=100*(C-REF(C,1))/C   #收益率,又称回报率
    mydf['vwap']=SUM(C*V, 10)/SUM(V, 10)  #成交量加权平均价
    #加入小白量化数据池
    stocks_dict[c] = mydf

#创建小白量化股票数据池
mdf=MDF(stocks_dict)print('获取行情数据结束!获取了%d 只股票数据。'%len(codes))#  1.首先计算单只股票KDJ指标的速度

## KDJ指标,只能个股计算
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

#获取股票池中股票代码表
codes=mdf.get_code()start=time.time()   #获取开始时间    
gpc= {}  #小白量化数据池
#循环计算单只股票的KDJ指标值for c  in  codes:
    mydf=mdf.get_data(c)

    # 小白量化仿通达信公式数据格式化    #mydf=mydf.reset_index(level=None, drop=True ,col_level=0, col_fill='')  
    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指标值
    mydf['k'],mydf['d'],mydf['j']=KDJ()      #KDJ指标

    #数据加入股票数据池
    gpc[c] = mydf

end=time.time()   #获取结束时间    
print('全部股票循环计算仿通达信指标公式所需时间:')print('时间:',round(start,2),round(end,2),'花费时间:',round(end-start,4),'秒')#创建小白量化股票数据池
mdf2=MDF(gpc)#  2. 计算股票自编因子公式mKDJ指标的速度
#创建小白量化股票数据池,以股票代码为key的字典
#小白量化因子数据初始化
mCLOSE=mdf.to_df('close')mLOW=mdf.to_df('low')mHIGH=mdf.to_df('high')mOPEN=mdf.to_df('open')mVOL=mdf.to_df('volume')mRTN=mdf.to_df('rtn')mVWAP=mdf.to_df('vwap')##下面是Alpha因子及自编因子公式的演示# mKDJ因子指标,不能计算单只股票def mKDJ(N=9, M1=3, M2=3):
    """
    mKDJ 因子随机指标    """
    RSV = (mCLOSE - mLLV(mLOW, N)) / (mHHV(mHIGH, N) - mLLV(mLOW, N)) * 100
    K = mEMA(RSV, (M1 * 2 - 1))
    D = mEMA(K, (M2 * 2 - 1))
    J = K * 3 - D * 2
    return K, D, J

start2=time.time()   #获取开始时间    
# 计算mKDJ因子公式
mK,mD,mJ=mKDJ()end2=time.time()   #获取循环结束时间print('全部股票计算因子指标公式所需时间:')print('时间:',round(start2,2),round(end2,2),'花费时间:',round(end2-start2,4),'秒')123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125

程序计算结果:

开始获取行情数据!获取行情数据结束!获取了300 只股票数据。
全部股票循环计算仿通达信指标公式所需时间:
时间: 1613804417.7 1613804422.77 花费时间: 5.067 秒
全部股票计算因子指标公式所需时间:
时间: 1613804424.25 1613804424.37 花费时间: 0.127 秒123456

从上面比较可知,因子公式计算一批股票数据值有很快的速度。
另外因子公式的第2个强项就是快速对指标计算结果排序,
可在上面程序加入下面几行代码。

#获取最后一行结果
result=mK.tail(1)#获取排名代码print('获取最后一行结果,并获取排名在前20名的股票代码')codes3=get_rank(result,20)print(codes3)123456

程序最后运行的结果如下:

沪深300  板块的所有股票 :。。。
开始获取行情数据!获取行情数据结束!获取了300 只股票数据。
全部股票循环计算仿通达信指标公式所需时间:
时间: 1613804644.75 1613804649.39 花费时间: 4.644 秒
全部股票计算因子指标公式所需时间:
时间: 1613804650.81 1613804650.93 花费时间: 0.127 秒
获取最后一行结果,并获取排名在前20名的股票代码['600763', '300015', '000708', '002493', '600519', '000568', '600309', '002594', '300347', '600176', '603259', '603799', '600346', '600436', '601166', '600809', '601888', '002601', '688036', '000786']123456789

是不是自编因子公式是对自编仿通达信公式的超越,应用范围更加广泛。

请持续关注我的博客,我的进步,就是你的进步