PerlGtk.pl

  
Menu główne
use PerlMongers::Warszawa;
use PerlMongers::Krakow;
NG_gRadio
Perl na Giełdzie - część 1
  przez wrares (200 odsłon)
Wiadomo od dawna że ekosystem Perla jest doskonałym narzędziem programistycznym. Dziś rozpoczynamy cykl poświęcony obróbce danych giełdowych, pozwalający na ich prezentacją oraz analizę. Na początku zdefiniujemy potrzeby, które są niezbędne aby wykonać to zadanie
Cytat:

1) Stały i nieograniczony dostęp do internetu

2) Zainstalowany ekosystem Perla, z koniecznymi modułami

3) System Win32 (w jego środowisku było pisane oprogramowanie) lub Linux, Mac

4) Chęci i pozytywne nastawienie do zmierzenia się z tym tematem



Kiedy już wiemy co Nam będzie potrzebne, musimy postarać się o źródło Naszych informacji. Dzięki uprzejmości Bossa.pl, jesteśmy w stanie pobierać informacje o spółkach notowanych na giełdzie. Dane archiwalne pobraliśmy z tej strony.... W kręgu Naszych Zainteresowań były dwa pliki z danymi archiwalnymi 2007.zip oraz 2008.zip.
Aby zautomatyzować pobieranie danych archiwalnych, postanowiliśmy wykorzystać w tym celu kilka modułów z zasobów CPAN
Cytat:

1) bundle-lwp - daje Nam do ręki kilka rozwiązań, z których chętnie skorzystamy

2) Cwd - ścieżki dostępu

3) Archive-Extract - plik trzeba rozpakować i dokonać ekstrakcji


Moduły instalujemy z zasobów CPAN jeśli brak ich w systemie. Program dzielimy na części logiczne (procedury) aby łatwiej było go zrozumieć.

Cytat:

1) Tworzenie katalogów, a jeśli istnieją stare to ich usunięcie. Usunięcie poprzedniego pliku, który był zaciągany z portalu

2) Tworzenie nowych katalogów oraz podkatalogów

3) Zaciąganie informacji z portalu bossa.pl

4) Rozpakowywanie informacji

5) Ekstrakcja danych, wybór 4 spółek, wyciąganie danych oraz scalanie

6) Tworzenie plików wynikowych


Na początku tradycyjnie
#!/usr/bin/perl

################################
# Program pisany dla Portalu   #
# http://perlgtk.pl            #
# Programował wrares           #
# 03/02/2010                   #
################################



use strict;
use warnings;
use Cwd;
use Archive::Extract;

&katalog;
&usun_plik;
¬owania;
&rozpakuj_2007;
&rozpakuj_2008;
&czytaj_2007;
&czytaj_2008;
&scalanie;



Importujemy moduły oraz procedury niezbędne do dalszego działania programu. Jak widać wywołujemy kilka procedur.

sub katalog {
    
unless (mkdir qw(c:\\gielda)) {

    warn "Katalog giełda istnieje...\n";

} else {

    warn "Założyłem ponownie katalog giełda...\n";
}


unless (mkdir qw(c:\\gielda\\2007)) {

    warn "Katalog 2007 istnieje...\n";

} else {

    warn "Założyłem ponownie katalog 2007...\n";
}


unless (mkdir qw(c:\\gielda\\2008)) {

    warn "Katalog 2008 istnieje...\n";

} else {

    warn "Założyłem ponownie katalog 2008...\n";
}




for my $miesiac(1..12) {

unless (mkdir qq(c:\\gielda\\2007\\$miesiac)) {

    warn "Katalog 2007 miesiąc $miesiac istnieje...\n";

} else {

    warn "Założyłem ponownie katalog 2007 miesiąc $miesiac...\n";
    
    $miesiac++;
}

} #zamkniecie for


for my $miesiac(1..12) {

unless (mkdir qq(c:\\gielda\\2008\\$miesiac)) {

    warn "Katalog 2008 miesiąc $miesiac istnieje...\n";

} else {

    warn "Założyłem ponownie katalog 2008 miesiąc $miesiac...\n";
    
    $miesiac++;
}

}# zamkniecie for
   
    
} # koniec procedury katalog



Ten kawałek kodu jest znacznie ciekawszy. Został stworzony dla platformy Win32 (dyski, ścieżki itp.), ale może być użyty także w innym systemie. Kod sprawdza czy założone są katalogi, jeśli nie zakłada je, dane które importujemy są podzielone na miesiące, więc koniecznie dla lepszej przejrzystości założyliśmy dla każdego miesiąca w każdym roku osobny katalog. Główny katalog na dysku C to C:\gielda

sub usun_plik {

eval {
  
my @tablica = qw(c:\\gielda\\2007\\2007.zip c:\\gielda\\2008\\2008.zip);

if (-e ($tablica[0] || $tablica[1])) {

unlink @tablica;

print {*STDERR} "Kasowanie starych plików zakończone...\n";

    }

};
    
} # koniec procedury usun_plik



Jeśli stare pliki są w systemie należy je usunąć. Nigdy nie wiadomo czy nie wprowadzono poprawek.

sub notowania {
    
eval {
    
        system "lwp-download  http://bossa.pl/pub/metastock/cgl/sesjacgl/2007.zip c:\\gielda\\2007";

        };
    
 if ($@) {
        
    print {*STDERR} 'Nie pobrałem...\n';
    
}



eval {
    
        system "lwp-download  http://bossa.pl/pub/metastock/cgl/sesjacgl/2008.zip c:\\gielda\\2008";

        };
    
 if ($@) {
        
    print {*STDERR} 'Nie pobrałem...\n';
    
}

    
    
} # koniec procedury notowania




No wreszcie pobieramy nasze archiwalne notowania. Jest taki fajny program lwp-download, który ułatwia Nam w prosty sposób pobieranie informacji z internetu. Pobieramy pliki archiwalne z lat 2007 i 2008 roku.

sub rozpakuj_2007 {
    
    my $zrodlo = Archive::Extract->new(archive => qw(c:\\gielda\\2007\\2007.zip));
        
    my $cel = $zrodlo->extract(to => qw (c:\\gielda\\2007)) or die $zrodlo->error;
    
    my $plik = $zrodlo->files;

    foreach my $pozycja(sort @{$plik}) {
             
       WYBOR: {
        
            for my $miesiac(10..12) {
             
                                 
            if ($pozycja eq qq($miesiac-2007.zip))  {  my $z = Archive::Extract->new(archive => qq(c:\\gielda\\2007\\$miesiac-2007.zip));
                                      $z->extract(to => qq(c:\\gielda\\2007\\$miesiac))or die $zrodlo->error;
                                      last WYBOR;
                    } 
                       
            } #koniec for
        }    
            
        WYBOR: {
                    
            for my $miesiac(1..9) {
             
            my $miesiac_n = "0$miesiac";
                                            
            if ($pozycja eq qq($miesiac_n-2007.zip))  {  my $z = Archive::Extract->new(archive => qq(c:\\gielda\\2007\\$miesiac_n-2007.zip));
                                      $z->extract(to => qq(c:\\gielda\\2007\\$miesiac))or die $zrodlo->error;
                                      last WYBOR;
                    } 
                       
            } #koniec for
            
        }
           
    } #koniec foreach 
    
   foreach my $pozycja(sort @{$plik}) { 

    my @kasowane_pliki = (qq(c:\\gielda\\2007\\$pozycja),"\n");
      
    unlink(@kasowane_pliki);
    
    unlink(qw(c:\\gielda\\2007\\2007.zip));
        
   } #koniec foreach  

} #koniec procedury



sub rozpakuj_2008 {
    
    my $zrodlo = Archive::Extract->new(archive => qw(c:\\gielda\\2008\\2008.zip));
        
    my $cel = $zrodlo->extract(to => qw (c:\\gielda\\2008)) or die $zrodlo->error;
    
    my $plik = $zrodlo->files;

    foreach my $pozycja(sort @{$plik}) {
             
       WYBOR: {
        
            for my $miesiac(10..12) {
             
                                 
            if ($pozycja eq qq($miesiac-2008.zip))  {  my $z = Archive::Extract->new(archive => qq(c:\\gielda\\2008\\$miesiac-2008.zip));
                                      $z->extract(to => qq(c:\\gielda\\2008\\$miesiac))or die $zrodlo->error;
                                      last WYBOR;
                    } 
                       
            } #koniec for
        }    
            
        WYBOR: {
                    
            for my $miesiac(1..9) {
             
            my $miesiac_n = "0$miesiac";
                                            
            if ($pozycja eq qq($miesiac_n-2008.zip))  {  my $z = Archive::Extract->new(archive => qq(c:\\gielda\\2008\\$miesiac_n-2008.zip));
                                      $z->extract(to => qq(c:\\gielda\\2008\\$miesiac))or die $zrodlo->error;
                                      last WYBOR;
                    } 
                       
            } #koniec for
            
        }
           
    } #koniec foreach 
    
   foreach my $pozycja(sort @{$plik}) { 

    my @kasowane_pliki = (qq(c:\\gielda\\2008\\$pozycja),"\n");
      
    unlink(@kasowane_pliki);
    
    unlink(qw(c:\\gielda\\2008\\2008.zip));
        
   } #koniec foreach  

} #koniec procedury



Pliki trzeba rozpakować, skasować to co niepotrzebne, przygotować do dalszej obróbki.

sub czytaj_2007 {

my (@pliki,@katalogi, @zawartosc) = ();

my ($plik) = ();

my ($rok, $miesiac, $dzien, $ndata) = ();

my ($nazwa, $data, $otwarcie, $najwyzszy, $najnizszy, $zamkniecie, $ilosc) = ();

my (@spolki) = ();

open(DATA, ">", "C:\\gielda\\2007\\2007.txt");

for my $miesiac(1..12) {

    @katalogi = glob qq(C:\\gielda\\2007\\$miesiac\\*.prn);
        
    push @pliki,@katalogi;

}

foreach $plik(@pliki) {

    open(ZRODLO, "<", qq($plik));
    
    @zawartosc = <ZRODLO>;
        
    foreach my $miesiac(@zawartosc) {
        
        ($nazwa, $data, $otwarcie, $najwyzszy, $najnizszy, $zamkniecie, $ilosc) = split(/,/,$miesiac);
    
       
       $rok     = substr($data,0,4);
       $miesiac = substr($data,4,2);
       $dzien   = substr($data,6,2);

       $ndata   = "$rok"."-"."$miesiac"."-"."$dzien";
        
       $ilosc = sprintf("%.2f", $ilosc);
       
            if (($nazwa eq "01NFI") or
                ($nazwa eq "TETA" ) or
                ($nazwa eq "TECHMEX" ) or
                ($nazwa eq "IMPEL" ) 
                ) {    
    
                print DATA  "$nazwa, $ndata, $otwarcie, $najwyzszy, $najnizszy, $zamkniecie, $ilosc,", "\n";
                                

            } # koniec if    
        
    } #koniec foreach dla miesiaca
       
    
} #koniec foreach dla pliku

close (ZRODLO);
close (DATA);
     
}

sub czytaj_2008 {

my (@pliki,@katalogi, @zawartosc) = ();

my ($plik) = ();

my ($nazwa, $data, $otwarcie, $najwyzszy, $najnizszy, $zamkniecie, $ilosc) = ();

my ($rok, $miesiac, $dzien, $ndata) = ();

my (@spolki) = ();

open(DATA, ">", "C:\\gielda\\2008\\2008.txt");

for my $miesiac(1..12) {

    @katalogi = glob qq(C:\\gielda\\2008\\$miesiac\\*.prn);
        
    push @pliki,@katalogi;

}

foreach $plik(@pliki) {

    open(ZRODLO, "<", qq($plik));
    
    @zawartosc = <ZRODLO>;
        
    foreach my $miesiac(@zawartosc) {
        
      ($nazwa, $data, $otwarcie, $najwyzszy, $najnizszy, $zamkniecie, $ilosc) = split(/,/,$miesiac);

       $rok     = substr($data,0,4);
       $miesiac = substr($data,4,2);
       $dzien   = substr($data,6,2);

       $ndata = "$rok"."-"."$miesiac"."-"."$dzien";      
      
       $ilosc = sprintf("%.2f", $ilosc); 
        
            if (($nazwa eq "01NFI") or
                ($nazwa eq "TETA" ) or
                ($nazwa eq "TECHMEX" ) or
                ($nazwa eq "IMPEL" ) 
                ) {    
    
                print DATA "$nazwa, $ndata, $otwarcie, $najwyzszy, $najnizszy, $zamkniecie, $ilosc,", "\n";

            } # koniec if    
        
    } #koniec foreach dla miesiaca
       
    
} #koniec foreach dla pliku

close (ZRODLO);
close (DATA);
     
}



Wybraliśmy cztery spółki, takie przypadkowe, wyciągamy z nich informacje

Cytat:

a) Nazwa spółki

b) Data notowania

c) Kurs Otwarcia

d) Kurs Najwyższy

e) Kurs Najniższy

f) Kurs Zamknięcia

g) Ilość walorów w dniu



Zapisujemy te informacje w plikach tekstowych za lata 2007 i 2008

sub scalanie {
    
    open(DATA, ">","C:\\gielda\\calosc.txt");
    open(2007, "<","C:\\gielda\\2007\\2007.txt");
    open(2008, "<","C:\\gielda\\2008\\2008.txt");
    
    my (@calosc,@r2007, @r2008) = ();
    my ($pozycja) = ();
    
    
    @r2007 = <2007>;
    @r2008 = <2008>;
        
    push @calosc,@r2007;
    push @calosc,@r2008;
    
    foreach $pozycja(@calosc) {
        
        print DATA $pozycja;
        
    }
    
       
    close (DATA);
    close (2007);
    close (2008);
        
}



I przyszedł czas na scalenie informacji wybranych z naszych zbiorów.
Efektem Naszych przemyśleń jest program, który dowolną ilość razy pozwala na pobieranie archiwalnych danych giełdowych. Dostajemy informacje do dalszej analizy i przetwarzania informacji giełdowych, które sami możemy dowolnie wykorzystywać. Poniżej podajmy adres z którego można ściągnąć plik wraz z całym katalogiem giełda. Adres do pobrania jest tutaj...
Powrót
Szukaj w PerlGtk.pl
The Perl Job site
Szukaj kodu :