全文转自:http://www.lfyzjck.com/2010-11-25/389.html
最近要做的一个网站需要在首页显示世界各大股票交易场所的综合指数,于是搜集了点这方面的资料,今天把研究的结果放出来。
提供财经方面讯息,做的比较好的应该是Google财经和Yahoo财经了,综合考虑还是Yahoo的接口比较好用
API使用方法比较简单,举个例子:
http://finance.yahoo.com/d/quotes.csv?s=^XAU&f=snd1l1c6
返回数据:
”^XAU”,”PHLX Gold/Silver “,”11/24/2010″,213.51,”+1.01″
很典型的CSV数据,比较好处理。“s”指的是股票的代码(Symbol),“f”是要获取的数据选项,上面例子返回的数据分别是“代码”,“股票 名称”,“最后更新时间”,“指数”,“变动”。完整的参数列表参见下面表格(对财经方面知道不多,所以不翻译了,以免误导别人):
a | Ask | a2 | Average Daily Volume | a5 | Ask Size |
b | Bid | b2 | Ask (Real-time) | b3 | Bid (Real-time) |
b4 | Book Value | b6 | Bid Size | c | Change & Percent Change |
c1 | Change | c3 | Commission | c6 | Change (Real-time) |
c8 | After Hours Change (Real-time) | d | Dividend/Share | d1 | Last Trade Date |
d2 | Trade Date | e | Earnings/Share | e1 | Error Indication (returned for symbol changed / invalid) |
e7 | EPS Estimate Current Year | e8 | EPS Estimate Next Year | e9 | EPS Estimate Next Quarter |
f6 | Float Shares | g | Day’s Low | h | Day’s High |
j | 52-week Low | k | 52-week High | g1 | Holdings Gain Percent |
g3 | Annualized Gain | g4 | Holdings Gain | g5 | Holdings Gain Percent (Real-time) |
g6 | Holdings Gain (Real-time) | i | More Info | i5 | Order Book (Real-time) |
j1 | Market Capitalization | j3 | Market Cap (Real-time) | j4 | EBITDA |
j5 | Change From 52-week Low | j6 | Percent Change From 52-week Low | k1 | Last Trade (Real-time) With Time |
k2 | Change Percent (Real-time) | k3 | Last Trade Size | k4 | Change From 52-week High |
k5 | Percebt Change From 52-week High | l | Last Trade (With Time) | l1 | Last Trade (Price Only) |
l2 | High Limit | l3 | Low Limit | m | Day’s Range |
m2 | Day’s Range (Real-time) | m3 | 50-day Moving Average | m4 | 200-day Moving Average |
m5 | Change From 200-day Moving Average | m6 | Percent Change From 200-day Moving Average | m7 | Change From 50-day Moving Average |
m8 | Percent Change From 50-day Moving Average | n | Name 股票名称 | n4 | Notes |
o | Open | p | Previous Close | p1 | Price Paid |
p2 | Change in Percent | p5 | Price/Sales | p6 | Price/Book |
q | Ex-Dividend Date | r | P/E Ratio | r1 | Dividend Pay Date |
r2 | P/E Ratio (Real-time) | r5 | PEG Ratio | r6 | Price/EPS Estimate Current Year |
r7 | Price/EPS Estimate Next Year | s | Symbol 股票代码 | s1 | Shares Owned |
s7 | Short Ratio | t1 | Last Trade Time | t6 | Trade Links |
t7 | Ticker Trend | t8 | 1 yr Target Price | v | Volume |
v1 | Holdings Value | v7 | Holdings Value (Real-time) | w | 52-week Range |
w1 | Day’s Value Change | w4 | Day’s Value Change (Real-time) | x | Stock Exchange |
y | Dividend Yield |
上面接口虽然好用,不过根据项目需求,在进行了进一步封装,自己写了个Widget类,方便在模板里调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
class FinanceWidget { public $stocks = array(); public $htmlOptions = array(); public $data = array(); public function __construct($data = array(),$htmlOptions = array()){ $this->stocks = $data; $this->htmlOptions = $htmlOptions; } /** * 渲染ul标签的开始部分 * @param array $htmlOptions */ private function _renderHead($htmlOptions){ $options = ''; foreach($htmlOptions as $option => $value){ $options .= "$option=\"$value\" "; } echo "<ul $options>\n"; } /** * 渲染主体部分 */ private function _renderBody($data){ foreach($data as $row){ echo '<li><span>'.$row[3].'</span><span>'.$row[1].'</span><span>'.$row[2].'</span></li>'."\n"; } } /** * 渲染ul的结束标签 */ private function _renderFoot(){ echo "</ul>\n"; } /** * 返回请求的API */ private function getAPI(){ $IDs = join(',',$this->stocks); return "http://finance.yahoo.com/d/quotes.csv?s=$IDs&f=nl1p2"; } /** * 执行渲染 */ public function run(){ $this->getStocks(); $this->_renderHead($this->htmlOptions); $this->_renderBody($this->data); $this->_renderFoot(); } /** * 获取股票数据 */ public function getStocks(){ $row = 0; $stocks_name = array_keys($this->stocks); if (($handle = fopen($this->getAPI(), 'r')) !== FALSE) { while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { array_push($data,$stocks_name[$row]); array_push($this->data,$data); $row++; } fclose($handle); } } } |
调用的时候只需要定义你需要展示的股票,传给FinanceWidget类:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$stock = array( '上证指数'=>'000001.ss', '深圳成指'=>'399001.sz', '香港恒生'=>'0011.hk', '日经指数'=>'^N225', '英国FTSE'=>'^FTSE', '法国CAC'=>'^FCHI', '德国DAX'=>'^GDAXI', '纳斯达克'=>'^IXIC', '道琼指数'=>'INDU', ); $widget = new FinanceWidget($metals); $widget->run(); |
输出结果如下:
- XAU指数213.51+0.48%
- HUI指数548.979+0.01%
- JSE黄金2701.89+0.11%
- GOX指数246.62+0.31%
- TSX指数411.840.00%
当然这个类支持指定ul的html选项,作为第二个参数传递给Widget类即可,这里不多介绍,大家根据自己需要扩展即可
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述