新浪财经个股信息API - heavyii/china-stock-crawler GitHub Wiki

新浪财经个股信息API

链接形式

http://hq.sinajs.cn/list=参数

其中,参数为若干个股票标志,用,分隔。(若干个还不确定最大支持多少,但经测试500个是可以的)

有两种形式的股票标志

  • 普通标志,为常见的sh/sz加上股票代码的形式,可取得该股票当前行情信息,例如:sh601998
  • 在普通标志后增加_i,可取得该股票近期信息的标志,例如:sh601998_i

链接举例

http://hq.sinajs.cn/list=sh601998,sh600004_i,sz300059

返回数据

依照提供的股票标志逐行显示数据。

普通标志的返回数据

例如链接:

http://hq.sinajs.cn/list=sh601998

返回值:

var hq_str_sh601998="中信银行,5.540,5.600,5.580,5.620,5.500,5.580,5.590,49628052,276209657.000,78300,5.580,87400,5.570,272854,5.560,225400,5.550,180900,5.540,220025,5.590,451400,5.600,405881,5.610,450800,5.620,221400,5.630,2016-02-26,15:00:00,00";

"中为对应数据,各字段意义如下(此处从0开始计数):

0:股票名称
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:状态

其中,状态值对应的意义为:

00: 正常
01: 临时停牌1H
02: 停牌
03: 停牌
04: 临时停牌
05: 停1/2
07: 暂停
-1: 无记录
-2: 未上市
-3: 退市

注:参考自新浪的js代码。

加_i标志的返回数据

例如链接:

http://hq.sinajs.cn/list=sh601998_i

返回值:

var hq_str_sh601998_i="A,zxyh,0.8700,0.8833,0.7000,6.2900,2515.7172,4893479.6573,3190516.4057,3190516.4057,0,CNY,406.9200,413.3800,5.8000,1,11.9175,1074.5300,329.2600";

"中为对应数据,各字段意义(此处从0开始计数):

0: 股票类型(A:A股, B:B股, I:指数)
1: 拼音简写
2: 前一年每股收益和
3: 最近四个季度每股收益和
4: ?
5: 最近报告的每股净资产/元
6: 过去5个交易日平均每分钟成交量
7: 总股本/万股
8: 流通股本/万股
9: 流通A股股本/万股
10: 流通B股股本/万股
11: ?
12: 最近年度净利润/亿元
13: 最近四个季度净利润/亿元
14: ?
15: ?
16: ?
17: 主营业务收入/亿元 营收
18: 净利润/亿元

websocket接口

    const WebSocketClient = require('websocket').client;
    // 订阅新浪股票行情
    async function stockMarket() {

        async function getStockList() {
            let labels = await agent.knex('op_stock').select('label').limit(10);
            let labelArray = labels.map(v => {
                return v.label
            });
            let labellist = labelArray.join(',').toLowerCase();
            return labellist;
        }
        async function sendStockMarket(data) {
            const key = 'stock:market';
            let rst = await agent.redis.hset(key, data);
            console.log('redis ret', rst, data);
        }

        const stocklist = await getStockList();

        // 'wss://teatapi.visioners.cn/wskt?list=sh000001,sz399001,sz399006'
        const wssurl = 'wss://teatapi.visioners.cn/wskt?list=' + stocklist;
        var client = new WebSocketClient();
        client.on('connectFailed', function (error) {
            console.log('Connect Error: ' + error.toString());
        });

        client.on('connect', function (connection) {
            console.log('WebSocket Client Connected');
            connection.on('error', function (error) {
                console.log("Connection Error: " + error.toString());
            });
            connection.on('close', function () {
                console.log('echo-protocol Connection Closed');
                connetToSina();
            });
            connection.on('message', async function (message) {
                if (message.type === 'utf8') {
                    let data = message.utf8Data
                    data = data.split('\n');
                    let array = [];
                    data.forEach(v => {
                        let [label, code] = v.split('=')
                        array.push(label);
                        array.push(code);
                    })
                    await sendStockMarket(array);
                }
            });

            function sendHeart() {
                if (connection.connected) {
                    connection.sendUTF('');
                    setTimeout(sendHeart, 1000);
                }
            }
            sendHeart();
        });

        function connetToSina() {
            // 
            client.connect(wssurl);
            console.log('############################ start websocket', wssurl);
        }
        connetToSina();
    }