[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
再接着就是从上面的清单中,抓取这些标的的历史日K数据
请注意这个日K数据是设置某一个当前日期,然后倒推的。 设置天数为负数,比如-180天
  1. use utf8;
  2. use Encode;
  3. use Modern::Perl;
  4. use File::Slurp;
  5. use File::Path qw/make_path/;
  6. use Mojo::UserAgent;
  7. use Date::Format;  # time2str
  8. use Date::Parse;   # str2time
  9. use JSON qw/from_json to_json/;
  10. STDOUT->autoflush(1);
  11. my $wdir = "D:/Local/雪球数据/股票数据-日K-20230302-180DAY";
  12. make_path( gbk($wdir) ) unless -d gbk($wdir);
  13. # 提取某个日期之前的日K数据
  14. my %args = (
  15.         'symbol' => '',
  16.         'begin' => time() * 1000 + 3600*24,
  17.         'period' => 'day',
  18.         'type' => 'before',
  19.         'count' => '-185',  # 倒推天数
  20.         'indicator' => 'kline,pe,pb,ps,pcf,market_capital,agt,ggt,balance',
  21.     );
  22. my $ua = Mojo::UserAgent->new();
  23. $ua->cookie_jar->add(
  24.     Mojo::Cookie::Response->new(
  25.         name   => "xq_a_token",
  26.         value  => "这里改成自己的token",
  27.         domain => 'stock.xueqiu.com',
  28.         path   => '/',
  29.     )
  30. );
  31. my @list = read_file("StockList.txt"); # "ETF.txt"
  32. my $n = 0;
  33. for my $e ( @list )
  34. {
  35.     $n++;
  36.     $e =~ s/\r?\n//;
  37.     my ( $code, $name ) = split(/\s+/, uni($e) );
  38.     my $export = gbk("${wdir}/${code}.json");
  39.     # 忽略科创板和创业板
  40.     next if $code =~ /[A-Z]+(688|300)/;
  41.     if ( -f $export )
  42.     {
  43.         printf "[%d/%d] %s %s already exists\n", $n, scalar(@list), $code, gbk( $name );
  44.         next;
  45.     }
  46.    
  47.     printf "[%d/%d] %s %s\n", $n, scalar(@list), $code, gbk( $name );
  48.     $args{'symbol'} = $code;
  49.     my $res = $ua->get( "https://stock.xueqiu.com/v5/stock/chart/kline.json", form => \%args )->result;
  50.     my $data = $res->json;
  51.     if ( $data->{'error_code'} == 0 )
  52.     {
  53.         $data->{'data'}{'name'} = $name;
  54.         write_file( $export, utf8( to_json( $data) ) );
  55.     }
  56. }
  57. sub gbk { encode('gbk', $_[0]) }
  58. sub utf8 { encode('utf8', $_[0]) }
  59. sub u2gbk { encode('gbk', decode('utf8', $_[0])) }
  60. sub uni { decode('utf8', $_[0]) }
复制代码

TOP

紧接着是从众多 JSON中提取关键字和股票代号
好像从沪深改成 ETF,无所谓了,大概意思
  1. use utf8;
  2. use Encode;
  3. use Modern::Perl;
  4. use File::Slurp;
  5. use File::Path qw/make_path/;
  6. use Mojo::UserAgent;
  7. use JSON qw/from_json to_json/;
  8. STDOUT->autoflush(1);
  9. my $wdir = "D:/Local/雪球数据/ETF一览";
  10. my $count = 0;
  11. my $export = "ETF.txt";
  12. my $buff = "";
  13. for my $f ( glob gbk("$wdir/*.json") )
  14. {
  15.     my $json_str = uni(scalar( read_file( $f )));
  16.     my $data = from_json( $json_str );
  17.     for my $e ( @{$data->{data}{list}} )
  18.     {
  19.         next if $e->{name} =~ /^(ST|\*ST)/i;
  20.         $count ++;
  21.         printf "%s %s\n", $e->{symbol}, gbk($e->{name});
  22.    
  23.         $buff .= sprintf "%s %s\n", $e->{symbol}, $e->{name};
  24.     }
  25. }
  26. write_file( $export, utf8($buff) );
  27. printf "%d\n", $count;
  28. sub gbk { encode('gbk', $_[0]) }
  29. sub utf8 { encode('utf8', $_[0]) }
  30. sub u2gbk { encode('gbk', decode('utf8', $_[0])) }
  31. sub uni { decode('utf8', $_[0]) }
复制代码
部分结果如下:
SH513260 恒生科技ETFQD
SH513380 恒生科技ETF指数
SH517500 游戏沪港深ETF
SZ159605 中概互联ETF
SZ159742 恒生科技指数ETF
SZ159792 港股通互联网ETF
SZ159688 恒生互联网ETF
SH513770 港股互联网ETF
SH513890 恒生科技HKETF
SZ159607 中概互联网ETF
SH513180 恒生科技指数ETF
SH513130 恒生科技ETF
SH513580 恒生科技ETF基金
SH513010 恒生科技30ETF
SZ159750 香港科技50ETF
SH513330 恒生互联网ETF
SZ159869 游戏ETF

TOP

返回列表