zwQuant学习笔记 (1)

前面都没问题,从k102m1.py这个一月数据一开始不是很懂。搞明白以后记录一下。顺便转化成外汇。

首先,zw是脱机数据。这点适合做分析。

一开始我没搞明白路径从那里取得的。最后发现是zwSys中获得。如果需要自定义目录,也可以自己修改。

其次,对这个基本流程也不是很懂。搞明白以后,知道原理是遍历每个月的头一天和最后一天,然后,开盘价和收盘价相减。如果是增加,则有个字段教Add就加1,如果降低,就Dec降低。我之前一直没明白Dec代表什么。一直以为是12月,所以钻死胡同了。

然后,就没有什么问题了。改写一下。适合外汇交易。

import sys
import pandas as pd
import numpy as np


import zwSys as zw  #::zwQT
import zwTools as zwt

#尝试写一个外汇版本。

def zw_anz_m1sub(xcod,rss,monStr):#kstr表示月份
    fss=rss+xcod+".csv";print(fss) #文件名
    nSum,nAdd,nDec=0,0,0 #输入的月份数,其中上升的月份,其中下跌的月份
    kmon=int(monStr); #当前月     print('@m1sub',kstr,fss)
    try:
        df = pd.read_csv(fss,index_col=0,parse_dates=[0],encoding='utf-8')  #读取文件,csv使用gbk编码
        df =df.rename(columns={'Close':'close'});df =df.sort_index(); #重命名close列;按指数(年月日)重排序
        #
        _tim0=df.index[0];_ynum0=_tim0.year; #解释时间模式,yy/mm/dd,这里提取了第一年
        _tim9=df.index[-1];_ynum9=_tim9.year+1; #最后一年+1
        #print('@t',_tim0,_tim9)
        for ynum in range(_ynum0,_ynum9): #遍历所有年份
            ystr=str(ynum);last_day=zwt.lastDay(ynum,kmon);#年份,每月的最后一天的日期
            dayStr='%02d'%last_day
            monStr1=''.join([ystr,'-',monStr,'-1'])       #当前月的第一天
            monStr9=''.join([ystr,'-',monStr,'-',dayStr]) #当前月的最后一天
            df2=df[(df.index>=monStr1)&(df.index<=monStr9)]; #选取年-月-01到年-月-月底之间
            #print('@y',ystr1,ystr9,ystr,len(df2))
            if (len(df2)>0): #若存在交易日(处理月份用)
                _kmon5='%02d' %df2.index[0].month; #选取交易日期中的月份,并转为string
                if (_kmon5==monStr):  #若上述月份为函数输入的变量
                    xd1a=df2.ix[0];xd1z=df2.ix[-1];nSum+=1; #交易月份+1
                    vd1a=xd1a['close'];vd1z=xd1z['close']; #选取收盘价位
                    if (vd1z>vd1a):nAdd+=1 #比较收盘价位,判定升跌
                    else:nDec+=1;
                   
    except IOError: 
        pass;    #skip,error
        
    print('nSum,nAdd,nDec,',nSum,nAdd,nDec); 
    return nSum,nAdd,nDec    #返回值为交易月份数量,上升,下跌



##未修改
def zw_stk_anz_m01(qx,finx0,rss,ksgn): #对每个股票运算一次上一个函数
    fss = qx.rdatInx+finx0+".csv";   #stk_code.csv,inxYahoo.csv
    print('f',fss)
    dinx = pd.read_csv(fss,encoding='utf-8')  #读取csv文件
    print(dinx.head())
    print('f2',fss)
    mx1={};mx1['finx']=finx0;mx1['ksgn']=ksgn;
    mx1['nSum']=0;mx1['nAdd']=0;mx1['nDec']=0;#字典,赋值
    #nSum=0;nAdd=0;nDec=0;
    xn9=len(dinx['code']);mx1['nstk']=xn9; #所读取的csv的行数(code列的长度)
    #遍历csv中的code名,i 是计数器变量
    for i,xcod in enumerate(dinx['code']):
        if (not isinstance(xcod,str)):xcod="%06d" %xcod;
   
        dSum,dAdd,dDec=zw_anz_m1sub(xcod,rss,ksgn); 
        
        mx1['nSum']=mx1['nSum']+dSum;        
        mx1['nAdd']=mx1['nAdd']+dAdd;
        mx1['nDec']=mx1['nDec']+dDec;
        print(i,'/',xn9,xcod,mx1);
    #
    print('xn9',xn9)    ;#    print(len(mx1['nAdd']))    
    mx1['kAdd']=np.round(mx1['nAdd']*100/ mx1['nSum']); #指数上升频率(估计概率)
    mx1['kDec']=np.round(mx1['nDec']*100/ mx1['nSum']); #指数下降频率(估计概率)
    
    
    return mx1
##未修改









def zw_stk_anz_mx(qx,finx0,rss):
    c10=["finx","ksgn","nstk",'nSum','nAdd','nDec','kAdd','kDec']; #csv的第一列
    df=pd.DataFrame(columns=c10); #定义dataframe
    ftg="tmp\\mx_"+finx0+".csv";print(ftg)  #打印csv文件名
    
    for i in range(12):
        ksgn="%02d" %(i+1);
        #ksgn=str(i+1);#if i<9:ksgn='0'+ksgn; #1到12月
        
        #print(ksgn)    
        mx1=zw_stk_anz_m01(qx,finx0,rss,ksgn); #利用上一个函数生成一个dataframe,
        
        ds1=pd.Series(mx1,index=c10); #生成一个pandas中的series
        ds2=ds1.T; #.T=转置(矩阵转置)
        df=df.append(ds2,ignore_index=True);#在df中加上ds2
        df.to_csv(ftg,index=False,encoding='utf8'); #保存为csv,utf8编码
##未修改



def zw_stk_anz_mx_all(qx,xlst):    #遍历指定list中的股票
    for fx in xlst:
        if (fx.find('inxFX')>=0):
            rss=qx.rdat+'\\fx\\day\\'

            
        finx0=fx; #生成文件名
        print(rss)
        print(finx0)
        zw_stk_anz_mx(qx,finx0,rss);

#        zw_stk_anz_mx(qx,finx0,rss); #用上一个函数生成csv文件
    


#============main 读取基本信息。在zwSys.py文件中。
qx=zw.zwDatX(zw._rdat0);

fxlst=['inxFX']
zw_stk_anz_mx_all(qx,fxlst)

 

 

你可能感兴趣的:(zwQuant)