上班抽空练手--基金净值工具1

2012-07-14  顾清 

测试开发需要测试人员掌握不止一种高级语言、脚本语言,以便根据需要选择最佳的实现方式。

语言脚本不经常用就会慢慢遗忘,上班抽空自己写写小工具练手,防止生疏了。

最近用perl写了个基金净值小工具。

USAGE:./xxx  (-c)  (000021 XXXXXX XXXXXX  XXXXXX)

不带参数时,从数据库读取需要采集以及处理的基金号码(type1为普通基金,2为货币基金)

带参数,且不含-c时,将参数中的基金号码当做普通基金处理

带参数,且包含-c时,将参数中的基金号码当做货币基金处理

数据采集代码如下

#!/usr/bin/perl
use strict;
use warnings;
use Encode;  
use LWP::UserAgent;  
use DBI;
my @ids;
my @crashids;

###connect database
my $dbh = DBI -> connect('dbi:mysql:pltest:localhost','xxxxx','xxxxxx');
if (!defined $dbh)
{
    die "Can't connect database:$dbh->errstr\n";
}

##deal with argvs
if (@ARGV > 0)
{
    if ($ARGV[0] eq "-c")
    {
        shift @ARGV;
        @crashids = @ARGV;
    }
    else
    {
        @ids = @ARGV;
    }
}
else
{

##get all numbers from database
    my $statement = "SELECT Number,Type From Number";
    my $sth = $dbh -> prepare($statement) or die "Can’t prepare $statement: $dbh->errstr\n";
    $sth -> execute or die "can’t execute the query: $sth->errstr";
    while (my @row = $sth -> fetchrow_array)
    {
        if ($row[1] == 1)
        {
            push @ids,$row[0];
        }
        else
        {
            push @crashids,$row[0];
        }
    }
}
foreach  my $id(@ids)
{
##set source page
    my $url = 'http://finance.sina.com.cn/fund/quotes/of'.$id.'/bc.shtml';
    my $ua = LWP::UserAgent->new();
    print "$id :\n";
    $ua -> timeout(10);

##set proxy
    $ua -> proxy('http', 'http://xxxxxxxxx:1080/');
    my $r = $ua->get($url);

##encode source code,get useful data
    if  ($r -> is_success)
    {
     my $re = encode("utf8",$r -> decoded_content);
     my $start = '<div id="relative_stocks_list"';
     my $end = '</div>';
        my $pr = "";
     if ($re =~ /($start.*?$end)/s)
        {
           $pr = $1;
      }
        my %value;
        my @dates;
        $start = '<td>';
        $end = '</span>';
        while ($pr =~ /$start(\d{2}).*?:.*?(\d\.\d*)$end/gs)
        {

##set date
            my ($sec, $min, $hour, $day, $mon, $year, $wday, $yday, $isdst) = localtime();
            if ($1 <= $day)
            {           
                $mon = $mon+1;
            }
            if ($mon < 10)
            {
                $mon = "0".$mon;
            }
            $year = $year+1900;
            my $date = "$year-$mon-$1";
            push @dates,$date;
            $value{$date} = $2;
        }
##write to database
        for (@dates)
        {
            my $sql = "DELETE FROM  Data where Date ='".$_."' and Number = '".$id."'";
            $dbh -> do($sql);
            $sql = 'INSERT INTO Data(Date,Number,Value) VALUES ("'.$_.'","'.$id.'","'.$value{$_}.'")';
            $dbh -> do($sql);
            print "$_ : $value{$_}\n";
        }
    }
    print "-----------------------------\n";
}
foreach  my $id(@crashids)
{
##set source page
    my $url = 'http://finance.sina.com.cn/fund/quotes/of'.$id.'/bc.shtml';
    my $ua = LWP::UserAgent->new();
    print "$id :\n";
    $ua -> timeout(10);
    $ua -> proxy('http', 'http://xxxxxx:1080/');
    my $r = $ua->get($url);
    if  ($r -> is_success)
    {
     my $re = encode("utf8",$r -> decoded_content);
     my $start = '<div class="marketImg" id="moneyTypeTbl"';
     my $end = '</div>';
        my $pr = "";
     if ($re =~ /$start.*?$end.*?$end(.*?$end)/s)
        {
           $pr = $1;
      }
        $start = '<tr><td>';
        $end = '<tr>';
        if ($pr =~/($start\d{4}.*$end)/s)
        {
            $pr = $1;
        }
        my %value;
        my @dates;
        $start = '<tr>';
        $end = '</tr>';
        while ($pr =~ /$start.*?(\d{4}.\d{2}.\d{2}).*?(\d\.\d*).*?(\d{1,2}\.\d*).*?$end/gs)
        {       
            push @dates,$1;
            $value{$1} = "$2:$3";
        }
##write to database
        for (@dates)
        {
            my $sql = "DELETE FROM  Data where Date ='".$_."' and Number = '".$id."'";
            $dbh -> do($sql);
            my ($val,$year) = split ":",$value{$_};
            $sql = 'INSERT INTO Data(Date,Number,Value,Year) VALUES ("'.$_.'","'.$id.'","'.$val.'","'.$year.'")';
            $dbh -> do($sql);
            print "$_ : $value{$_}\n";
        }
    print "-----------------------------\n";
    }
}

$dbh->disconnect;
exit;

 

分别采集所选基金的最近几天的净值,对于货币基金额外采集7日年化收益。打印出来同时存入数据库。

接下来所要做的就是分析数据,做出数据报表,画出净值日线图,与基准成本净值进行对比分析,同时根据自定义算法,进行成本核算,趋势分析。

to be continued...

279°/2790 人阅读/0 条评论 发表评论

登录 后发表评论