rokiroki4 发表于 2012-7-14 13:18:24

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

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

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

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

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

不带参数时,从数据库读取需要采集以及处理的基金号码(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 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)
      {
            push @ids,$row;
      }
      else
      {
            push @crashids,$row;
      }
    }
}
foreachmy $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 FROMData 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";
}
foreachmy $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 FROMData 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...
原文地址 http://www.testwo.com/7225
页: [1]
查看完整版本: 上班抽空练手--基金净值工具1