Python: код для генерации баров из тиков

Еще один простенький скрипт на python для генерации баров из тиков.

Какие примеры дает этот код:
1. Чтение/запись файлов
2. Работа с CSV
3. Парсинг даты/времени
4. Good Practice создания ООП кода

P.S. Код достаточно медленный из-за парсинга Даты-Времени в этом месте self.Time = strptime(time[0:16], timeformat);

# -*- coding: utf-8 -*-
"""
Created on Mon Sep 10 12:14:54 2012

@author: ubertrader
"""
import csv
from time import strftime, strptime


ticker = 'RIU12'
sourcefile = 'Q:\GlobalDatabase\Common\RawData\FTP.RTS.RU\TICKS\FUT\{0}_0.csv'.format(ticker);
outfile = 'U:\Work\{0}_1min.csv'.format(ticker)
timeformat='%Y-%m-%d %H:%M' #Сознательно исключаем секунды и миллисекунды

class Bar(object):
    def __init__(self,timeformat, time, price, volume):
        self.Timeformat = timeformat;
        #time[0:16] - убираем секунды и миллисекунды
        self.Time = strptime(time[0:16], timeformat);        
        self.O = price
        self.H = price
        self.L = price
        self.C = price
        self.V = volume
    def Flush(self, time, price, volume):
        self.Time = strptime( time[0:16], self.Timeformat);
        self.O = price
        self.H = price
        self.L = price
        self.C = price
        self.V = volume    
    
    def Merge(self, price, volume):        
        self.V = self.V + volume
        self.H = max(self.H, price)
        self.L = min(self.L, price)
        self.C = price
    
    def IsNew(self, time):
        newtime = strptime(time[0:16], self.Timeformat)
        return self.Time != newtime
        
    def ToCSV(self):
        return '{0},{1},{2},{3},{4},{5}\r\n'.format(strftime(timeformat, self.Time), self.O, self.H, self.L, self.C, self.V);
        
b = None

with open(sourcefile, 'rb') as f: #Читаем файл с тиками
    with open(outfile, 'wb') as fo: #Открываем файл результата
        #Специальный класс работы с CSV
        reader = csv.reader(f, delimiter=',', quoting=csv.QUOTE_NONE)
        for row in reader:
            #CSV Format
            #Date/Time, price, volume, tickid, contract
            #2007-06-25 13:21:59.117,11075,1,14308517,18U07
            price = float(row[1])
            volume = int(row[2])
            tickid = float(row[3])        
            time_ = str(row[0])
                   
            if(b == None):    
                b = Bar(timeformat, time_, price, volume)
                continue
            else:
                if(b.IsNew(time_)):
                    #У нас новый бар / записываем в файл
                    fo.write(b.ToCSV())
                    #Сбрасываем параметры бара
                    b.Flush(time_, price, volume)
                else:
                    #Тик принадлежит этому бару
                    b.Merge(price, volume)                
                    
            
        fo.write(b.ToCSV())

Leave a comment