收到知乎上一名知友友情赠送的Python代码,可以一键获取3000多支股票的全部财务数据。由于他抽取的是2016年的年报数据,考虑到2017年季报数据大部分都已公告,为了更好的进行数据对比分析,我研究了一下代码,决定写一个Ruby的。
本程序可以实现所有股票的资产负债表、利润表、现金流量表和主要指标表的下载,保存为程序容易识别的CSV格式。
程序完善之后我会对数据进行整理分析,相对于年报,季报核心项目发生重大变化的,都会悉数用程序跑出来。
本代码使用了网易财经的报表接口。数据为该公司上市以来所有季报、年报数据,按季度排列:
知友对年报数据进行了整理,可以方便的查询分析,本程序完善后,我也会做一个类似的A股全市场分析报表。
程序执行界面:
# -*- coding: UTF-8 -*-
require 'rubygems'
require 'hpricot'
require 'open-uri'
x = 0
#获取股票列表文件stocklist.txt的总行数
def wc(filename)
$nline = $nword = $nchar = 0 #$符号表示全局变量,普通变量不在def外起作用
File.open(filename) do |io|
io.each_line do |line|
words = line.split(/\s+/).reject{|w| w.empty? }
#本例中使用了split方法分割单词,当行首有空白字符时,split方法的执行结果中会产生空白字符串,因此我们
#会删除该空白字符串。
$nline += 1
$nword += words.length
$nchar += line.length
end
end
#puts "文件的行数为:#{$nline}\n文件的单词数为:#{$nword}\n文件的字符数为:#{$nchar}"
puts "股票池股票数:#{$nword}\n"
end
wc("d:/rb/stock/downreports/stocklist.txt")
#puts $nword
#循环开始
while x <= $nword - 1
#puts "轮询中:"
stock_lines = File.readlines("d:/rb/stock/downreports/stocklist.txt");
s_code = stock_lines[x]
scode = s_code.chomp # chomp用来删除文本里带过来的换行符
puts "====================="
puts "正在下载#{scode}的资产负债表"
#确定csv文件命名规则
file1_path = "d:\\stock\\zcfzb\\"
file1_name = scode + "zcfzb.csv"
file1_name_path = file1_path + file1_name
#将网易财经接口的数据保存为csv文件
File.open(file1_name_path, 'wb') {|f| f.write(open('http://quotes.money.163.com/service/zcfzb_' + "#{scode}"+'.html') {|f1| f1.read})}
#防止接口调用过频被踢,暂停3秒
sleep(3)
puts "资产负债表下载完毕"
puts "====================="
puts "正在下载#{scode}的利润表"
#确定csv文件命名规则
file2_path = "d:\\stock\\lrb\\"
file2_name = scode + "lrb.csv"
file2_name_path = file2_path + file2_name
#将网易财经接口的数据保存为csv文件
File.open(file2_name_path, 'wb') {|f| f.write(open('http://quotes.money.163.com/service/lrb_' + "#{scode}"+'.html') {|f1| f1.read})}
#防止接口调用过频被踢,暂停3秒
sleep(3)
puts "利润表下载完毕"
puts "====================="
puts "正在下载#{scode}的现金流量表"
#确定csv文件命名规则
file3_path = "d:\\stock\\xjllb\\"
file3_name = scode + "xjllb.csv"
file3_name_path = file3_path + file3_name
#将网易财经接口的数据保存为csv文件
File.open(file3_name_path, 'wb') {|f| f.write(open('http://quotes.money.163.com/service/xjllb_' + "#{scode}"+'.html') {|f1| f1.read})}
#防止接口调用过频被踢,暂停3秒
sleep(3)
puts "现金流量表下载完毕"
puts "====================="
puts "正在下载#{scode}的主要财务指标表"
#确定csv文件命名规则
file4_path = "d:\\stock\\zycwzb\\"
file4_name = scode + "zycwzb.csv"
file4_name_path = file4_path + file4_name
#将网易财经接口的数据保存为csv文件
File.open(file4_name_path, 'wb') {|f| f.write(open('http://quotes.money.163.com/service/zycwzb_' + "#{scode}"+'.html') {|f1| f1.read})}
#防止接口调用过频被踢,暂停3秒
sleep(3)
puts "主要财务指标表下载完毕"
x = x + 1
end
网友评论