从零学习量化交易56TopQuant函数库28ztools_tqpy

ztools_tq.py

# -*- coding: utf-8 -*- 
'''
TopQuant-简称TQ极宽智能量化回溯分析系统,培训课件-配套教学python程序

Top极宽量化(原zw量化),Python量化第一品牌 
by Top极宽·量化开源团队 2017.10.1 首发
  
  
文件名:ztools_tq.py
默认缩写:import ztools_tq as ztq
简介:Top极宽量化·常用量化工具函数集
 

'''
#

import sys,os,re,pickle
import arrow,bs4,random,copy
import numexpr as ne  
import numpy as np
import pandas as pd
import tushare as ts
import pandas_datareader.data as pdat     # 网络财经数据接口库

#import talib as ta

import pypinyin 
#

import matplotlib as mpl
from matplotlib import pyplot as plt

from concurrent.futures import ProcessPoolExecutor
from concurrent.futures import ThreadPoolExecutor
from concurrent.futures import as_completed
#import multiprocessing
#
'''
import keras as ks

import sklearn
from sklearn import metrics
#
import keras
from keras.models import Sequential,load_model
from keras.utils import plot_model
#
import tflearn
#import tensorflow as tf
'''
#
import zsys
import ztools as zt
import ztools_str as zstr
import ztools_data as zdat




#-------------------
#
import zpd_talib as zta

#
#-------------------




#-------init.TQ.xxx,qx.xxx
def tq_init(rs0,prjNam='TQ001',sybLst=[]):
    pd.set_option('display.width', 450)    
    pd.set_option('display.float_format', lambda x: '%.9g' % x)
    #pd.set_option('display.float_format', zt.xfloat9)    
    np.set_printoptions(suppress=True) #取消科学计数法 #as_num(1.2e-4)
    #
    qx=zsys.TQ_bar()
    qx.prjNam,qx.rdat0,qx.rdat=prjNam,rs0,rs0
    qx.rdatTyp,qx.priceSgn='5m','avg'
    qx.timDayFlag=(rs0.upper().find('MIN')<0)
    qx.timFmt=zt.iff2(qx.timDayFlag,'YYYY-MM-DD','YYYY-MM-DD HH:mm:ss')
    qx.timFmtInv=zt.iff2(qx.timDayFlag,'%Y-%m-%d','%Y-%m-%d %H:%M:%S')
    #
    qx.sybLst=sybLst
    qx.sybNum=len(sybLst)
    #
    print('tq_init name...')
    #
    return qx



def tq_prVar(qx):
    print('\nobj:qx')
    zt.prObj(qx)
    #
    print('\nzsys.xxx')
    print('    rdat0,',zsys.rdat0)
    print('    rdatCN,',zsys.rdatCN)
    print('    rdatCNX,',zsys.rdatCNX)
    print('    rdatMin0,',zsys.rdatMin0)
    print('    rdatTick,',zsys.rdatTick)
    #
    print('\ncode list:',qx.sybLst)
    #
    #zt.prx('btTimLst',qx.btTimLst)
    zt.prx('usrPools',qx.usrPools)      #用户股票池资产数据 字典格式
    print('\nusrMoney,usrTotal:',qx.usrMoney,qx.usrTotal)    
    #
    tq_prTrdlib(qx)
    #zt.prx('qx.trdLib',qx.trdLib.head())
    #zt.prx('qx.trdLib',qx.trdLib.tail())
    #


 
def tq_prWrk(qx):
    print('\n\t bt_main_1day,',qx.wrkSybCod,qx.wrkTimStr)
    #
    zt.prx('syb info',qx.wrkSybInfo)
    zt.prx('wrkSybDat.head',qx.wrkSybDat.head(10))
    zt.prx('wrkSybDat.tail',qx.wrkSybDat.tail(10))
    #
    zt.prx('btTimLst',qx.btTimLst)
    zt.prx('usrPools',qx.usrPools)      #用户股票池资产数据 字典格式
    print('\nusrMoney,usrTotal:',qx.usrMoney,qx.usrTotal)    
    #
    #zt.prx('qx.trdLib',qx.trdLib.head())
    #zt.prx('qx.trdLib',qx.trdLib.tail())
    
    
   

#-------tq.misc
def tq_kusdcny(kcny0=6.61):
    t0=arrow.now().shift(days=-10).format('YYYY-MM-DD HH:mm:ss')
    df = pdat.get_data_fred('DEXCHUS',t0)
    if len(df.index)>0:v=df['DEXCHUS'][-1]
    else:v=kcny0
    print('v',v)
    #
    return v

def tq_ntim4sgn(xsgn0):
    dnum,xsgn=0,xsgn0.lower()
    if xsgn=='1m':dnum=1440
    if xsgn=='5m':dnum=288
    if xsgn=='15m':dnum=96
    if xsgn=='30m':dnum=48
    if xsgn=='60m':dnum=24
    if xsgn=='1h':dnum=24
    #if xsgn=='2h':dnum=24
    if xsgn=='1d':dnum=1
    
    #
    return dnum

def tq_xtim2FRQ(xsgn0):
    '''
    常用的基础频率
    
    别名	偏移量	说明
    D/d	Day	每日历日
    B	BusinessDay	每工作日
    H/h	Hour	每小时
    T或min	Minute	每分
    S	Secend	每秒
    L或ms	Milli	每毫秒(每千分之一秒)
    U	Micro	每微秒(即百万分之一秒)
    M	MonthEnd	每月最后一个日历日
    BM	BusinessDayEnd	每月最后一个工作
    '''
    xsgn=xsgn0.upper()
    if xsgn=='1M':xsgn='1T'
    if xsgn=='5M':xsgn='5T'
    if xsgn=='15M':xsgn='15T'
    if xsgn=='30M':xsgn='30T'
    if xsgn=='60M':xsgn='60T'
    #
    return xsgn

   
    
def tq_timXGet(dfx,tim0,tim9):
    #
    timNum=len(dfx.index)
    if tim9=='':tim9=zdat.df_2ds(dfx,timNum).xtim 
    if tim0=='':tim0=zdat.df_2ds(dfx,1).xtim 
    #tim0,tim9=arrow.get(tim0),arrow.get(qx.btTim9str)
    #
    return tim0,tim9

def tick2x(df,ktim='1min'):
    '''
    ktim,是时间频率参数,请参看pandas的resample重新采样函数
        常见时间频率符号: 
            A, year 
            M, month 
            W, week 
            D, day 
            H, hour 
            T, minute 
            S,second
    '''
    #
    df['time']=pd.to_datetime(df['time']) 
    df=df.set_index('time')
    df=df.sort_index()
    #
    dfk=df['price'].resample(ktim).ohlc();dfk=dfk.dropna();
    vol2=df['volume'].resample(ktim).sum();vol2=vol2.dropna();
    df_vol2=pd.DataFrame(vol2,columns=['volume'])
    amt2=df['amount'].resample(ktim).sum();amt2=amt2.dropna();
    df_amt2=pd.DataFrame(amt2,columns=['amount'])
    #
    df2=dfk.merge(df_vol2,left_index=True,right_index=True)
    df9=df2.merge(df_amt2,left_index=True,right_index=True);
    #
    xtims=df9.index.format('%Y-%m-%d %H:%M:%S')
    del(xtims[0])
    df9['xtim']=xtims # df9.index.__str__();#  [str(df9.index)]
    #             
    return df9    

def xsyb2x(xsyb,kdiv='#'):
    x10=xsyb.split(kdiv)
    syb=x10[0]
    xsite,xsit9,syb9='','',syb
    #print(len(x10),x10)
    if len(x10)>1:
        xsite=x10[1]
        xsit9=xsite[0]+xsite[-1]
        syb9=syb+'_'+xsit9
    #
    return syb9,xsit9,syb,xsite
        
    
#-------tq.pools.xxxx
def tq_pools_init(qx):
    
    print('tq_pools init ...')
    qx.sybPools=zdat.pools_frd(qx.rdat,qx.sybLst,qx.priceSgn,qx.rdatTyp,qx.timFmtInv) #day:datType=''
    #
    syb=qx.sybLst[0]
    qx.wrkInx,qx.wrkInxDat=syb,qx.sybPools[syb]
    syb=qx.sybLst[1]
    qx.wrkSyb,qx.wrkSybDat=syb,qx.sybPools[syb]
    #
    qx.sybNum=len(qx.sybLst)

    #
    return qx
    
def tq_pools_wr(qx):
    fss=qx.rtmp+qx.wrkSybCod+'.csv'
    qx.wrkSybDat.to_csv(fss)
    
    
        
def tq_pools_chk(qx):
    print('\n@tq_pools_chk,xcode',qx.wrkSybCod)
    print(qx.wrkSybDat.tail())
    
def tq_pools_call(qx,vlst):
    #print('tq_pools call...')
    xfun,xtyp=vlst[0],vlst[1]
    #if xtyp==1:xlst,xpools=qx.inxLst,qx.inxPools
    #if xtyp==2:xlst,xpools=qx.sybLst,qx.sybPools
    xlst,xpools=qx.sybLst,qx.sybPools
    #
    for xcod in xlst:
        qx.wrkSybCod=xcod
        qx.wrkSybDat=xpools[xcod]
        #sta_dataPre(qx)
        xfun(qx)
        #
        xpools[xcod]=qx.wrkSybDat
        #
        #print('\ntq_pools_call,',xcod)
        #print(qx.sybPools[xcod].tail())
    #
    return qx
    



#---------------tq.trd.xxx

    

    
        
#---------------------------tq.syb.xxx
def tq_sybGetPrice(df,ksgn,xtim):
    '''
      获取当前价格
    
    Args:
        qx (zwQuantX): zwQuantX交易数据包
        ksgn (str): 价格模式代码
        '''
    #d10=dfw.sybLib[qx.sybCode]
    d01=df[xtim:xtim]
    #print(df.head());print('v',ksgn,xtim);print('d01',d01);
    #
    price=0;
    if len(d01)>0:
        d02=d01[ksgn]
        #print('d02',d02)
        price=d02.values[0];
        if pd.isnull(price):
            d02=d01['dprice']
            price=d02[0];
    #
    price=round(price,3)
    return price

#---------------------------syb

def syb2data_pre8FN(fss):
    if not os.path.exists(fss):
        return None
    #    
    df=pd.read_csv(fss,index_col=0)
    df['avg']=df[zsys.ohlcLst].mean(axis=1)
    #
    df['avg']=df[zsys.ohlcLst].mean(axis=1)
    df,avg_lst=zdat.df_xshift(df,ksgn='avg',num9=10)
    #print('avg_lst,',avg_lst)
    #
    mv_lst=[2,3,5,10,15,20,30,50,100,150,200]
    #ma_lst=[2,3,4,5,6,7,8,9,10,15,20,30,40,50,60,80,100,120,150,180,200,250,300]
    df=zta.mul_talib(zta.MA,df, ksgn='avg',vlst=mv_lst)
    ma_lst=zstr.sgn_4lst('ma',mv_lst)
    #
    df['xtim']=df.index
    df['xyear']=df['xtim'].apply(zstr.str_2xtim,ksgn='y')
    df['xmonth']=df['xtim'].apply(zstr.str_2xtim,ksgn='m')
    df['xday']=df['xtim'].apply(zstr.str_2xtim,ksgn='d')
    df['xweekday']=df['xtim'].apply(zstr.str_2xtim,ksgn='w')
    tim_lst=['xyear','xmonth','xday','xweekday']
    #
    df['price']=df['avg']
    df['price_next']=df[avg_lst].max(axis=1)
    #涨跌幅,zsys.k_price_change=1000
    df['price_change']=df['price_next']/df['price']*100
    #df['ktype']=df['price_change'].apply(zt.iff2type,d0=100)  
    #def dat2type(d,k9=2000,k0=0):
    #fd>120
    #
    df=df.dropna()
    #df['ktype']=round(df['price_change']).astype(int)
    #df['ktype']=df['kprice'].apply(zt.iff2type,d0=100)  
    #df['ktype']=df['price_change'].apply(zt.iff3type,v0=95,v9=105,v3=3,v2=2,v1=1)  
    #
    df=df.round(3)
    return df


    
def syb2data_pre8Flst(finx,rss):
    flst=pd.read_csv(finx,index_col=False,dtype='str',encoding='gbk')
    df9=pd.DataFrame()
    xc=0
    for xcod in flst['code']:
        #print(xcod)
        xc+=1
        fss=rss+xcod+'.csv';print(xc,'#',fss)
        df=syb2data_pre8FN(fss)
        df9=df9.append(df)
    #
    return df9

#---------------------------user.xxx
def tq_usrIDSet(qx):
    ''' 生成订单流水号编码ID
       #ID=prjName+'_'+trdCnt(000000)
    '''

    qx.trdCnt+=1;
    nss='{:05d}'.format(qx.trdCnt);
    qx.trdID=qx.prjNam+'_'+nss;
    #

    return qx.trdID   

  

    

    

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/913351
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 3小时前
下一篇 3小时前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注