整理一份五种开发语言的行情接口爬虫供大家参考

现在个人量化开发者还是挺多的,有用各种开发语言的,Python,Java,Go,C,C#,Js等等五花八门,也有很多的流行的开发框架,问了下ChatGPT,现在主流的开发框架基本都是Python开发,C++,Java等,当然还有其他的,只是ChatGPT他不懂…,

行情数据接口

不管你用什么框架,数据都是很麻烦的事情,特别专业的数据。为了帮助量化人解决第一个数据问题,特别是国内的行情数据问题,所以先整理一些行情接口供大家参考使用,当然了,你也可以用现成的量化数据框架,二手数据,券商直推数据等,这个怎么方便怎么来。

鉴于笔者能力有限,现在只支持 Python,Java,Flutter,Object-C,Js,C# ,这几个语言的开发者可以参考下。

代码都在Github托管开源,可以免费下载使用 https://github.com/dsxkline/dsx_base_algorithm

支持接口类型

目前仅支持以下数据接口:

  • 实时行情
  • 分时图
  • 五日数据
  • 历史日K线
  • 历史分钟K线

Python 版

核心代码片段

# 实时行情接口
param_timestamp = int(time.time())
quotes_api = 'https://web.sqt.gtimg.cn/q=sh600000?r=0.0'+str(param_timestamp)
# 接口返回数据对应键名
index_to_key = {
    1:'name',
    3:'code',
    4:'price',
    5:'last',
    6:'open',
    41:'high',
    42:'low',
    36:'vol',
    37:'amount',
    10:'buy_1_v',
    9:'buy_1',
    12:'buy_2_v',
    11:'buy_2',
    14:'buy_3_v',
    13:'buy_3',
    16:'buy_4_v',
    15:'buy_4',
    18:'buy_5_v',
    17:'buy_5',
    20:'sell_1_v',
    19:'sell_1',
    22:'sell_2_v',
    21:'sell_2',
    24:'sell_3_v',
    23:'sell_3',
    26:'sell_4_v',
    25:'sell_4',
    28:'sell_5_v',
    27:'sell_5',
    30:'lastdate',
    31:'lasttime' 
}
def get_quotes(symbol,proxies=None):
    url = quotes_api.replace('sh600000',symbol)
    try:
        result = http.get(url,None,formats='text',proxies=proxies)
        if result==None:
            logger.error('请求实时行情接口错误:'+url)
            return
        lists = result.split(';')
        codes = symbol.split(",")
        objs = []
        for i in range(0,len(lists)):
            item = lists[i]
            if len(item)<10 : continue
            code = codes[i]
            item = item.split('~')
            obj = {}
            for j in range(1,len(item)):
                v = item[j]
                v = v.replace('\n','')
                v = v.replace('"','')
                if j in index_to_key:
                    k = index_to_key[j]
                    if k in "open,high,low,last,price,vol,amount" : 
                        # 转成浮点数
                        v = fn.str_trans_float(v)
                    if 'buy_' in k or 'sell_' in k : 
                        # 转成浮点数
                        v = fn.str_trans_float(v)
                    obj[k] = v
            ld = obj['lastdate']
            lastdate = ld[:4]+"-"+ld[4:6]+"-"+ld[6:8]
            lasttime = ld[8:10]+":"+ld[10:12]+":"+ld[12:14]
            obj['lastdate'] = lastdate
            obj['lasttime'] = lasttime
            obj['code'] = code
            obj['_id'] = code
            objs.append(obj)
    return objs
    except Exception as ex:
        logger.error(ex)

Java 版

核心代码片段

/**
     * 请求第三方实时行情
     * @param {string} code 股票代码
     * @param {object} success
     * @param {object} fail
     * 0: 未知 1: 名字 2: 代码 3: 当前价格 4: 昨收 5: 今开 6: 成交量(手) 7: 外盘 8: 内盘 9: 买一 10: 买一量(手) 11-18: 买二 买五 19: 卖一 20: 卖一量 21-28: 卖二 卖五 29: 最近逐笔成交 30: 时间 31: 涨跌 32: 涨跌% 33: 最高 34: 最低 35: 价格/成交量(手)/成交额 36: 成交量(手) 37: 成交额(万) 38: 换手率 39: 市盈率 40: 41: 最高 42: 最低 43: 振幅 44: 流通市值 45: 总市值 46: 市净率 47: 涨停价 48: 跌停价
     */
    public static List<HqModel> getQuote(String code){
        String api = "https://qt.gtimg.cn/q="+code;
        String resultStart = "v_{code}=";
        String resultEnd = ";";
        String data = get(api);
        //console.log(response);
        List<HqModel> list = null;
        if(data!=null){
            list = new ArrayList<>();
            String[] dataList = data.split(resultEnd);
            String[] codes = code.split(",");
            for (int i = 0; i < dataList.length; i++) {
                String item = dataList[i];
                String rss = item.replace(resultStart.replace("{code}",code.toLowerCase()),"");
                String[] rs = rss.split("~");
                if(rs[1]!=""){
                    HqModel obj = new HqModel();
                    obj.name = rs[1];
                    obj.code = codes[i];
                    obj.price = rs[3];
                    obj.lastClose = rs[4];
                    obj.open = rs[5];
                    obj.high = rs[33];
                    obj.low = rs[34];
                    obj.vol = rs[6];
                    obj.volAmount = rs[37];
                    obj.date = rs[30].substring(0,8);
                    obj.time = rs[30].substring(8);
                    obj.change = rs[31];
                    obj.changeRatio = rs[32];

                    list.add(obj);
                    //console.log(obj);
                    i++;
                }
            }
        }
        return list;
    }

public static List<String> getTimeLine(String code) throws JSONException{
...
}
public static Map<String,Object> getFdayLine(String code) throws JSONException {
...
}
/**
     * 获取K线图历史数据
     * @param {string} code 股票代码
     * @param {string} cycle 周期 day,week,month
     * @param {string} startDate 开始日期 默认 空
     * @param {string} endDate 结束日期 默认空
     * @param {int} pageSize 每页大小 默认 320
     * @param {string} fqType 复权类型 前复权=qfq,后复权=hfq
     * @param {*} success
     * @param {*} fail
     */
public static List<String> getkLine(String code,String cycle,String startDate,String endDate,int pageSize,String fqType) throws JSONException {
...
}
public static List<String> getMinLine (String code,String cycle,int pageSize) throws JSONException {
...
}

Flutter 版

代码片段

  /// 请求第三方实时行情
  /// @param {string} code 股票代码
  /// @param {object} success
  /// @param {object} fail
  /// 0: 未知 1: 名字 2: 代码 3: 当前价格 4: 昨收 5: 今开 6: 成交量(手) 7: 外盘 8: 内盘 9: 买一 10: 买一量(手) 11-18: 买二 买五 19: 卖一 20: 卖一量 21-28: 卖二 卖五 29: 最近逐笔成交 30: 时间 31: 涨跌 32: 涨跌% 33: 最高 34: 最低 35: 价格/成交量(手)/成交额 36: 成交量(手) 37: 成交额(万) 38: 换手率 39: 市盈率 40: 41: 最高 42: 最低 43: 振幅 44: 流通市值 45: 总市值 46: 市净率 47: 涨停价 48: 跌停价
  static Future<void> getQuote(String code, Function success, Function fail) async {
    String api = "http://qt.gtimg.cn/q=" + code;
    HttpClientRequest request = await _http.getUrl(Uri.parse(api));
    HttpClientResponse res = await request.close();
    String response = await res.transform(gbk.decoder).join();
    if (response.isNotEmpty) {
      String data = response;
      List<HqModel> list = [];
      List<String> dataList = data.split(";");
      List<String> codes = code.split(",");
      int i = 0;
      for (var item in dataList) {
        String rss = item.replaceAll("v_{code}=".replaceAll("{code}", code.toLowerCase()), "");
        List<String> rs = rss.split("~");
        if (rs.length > 32) {
          HqModel obj = HqModel(
              name: rs[1],
              code: codes[i],
              price: rs[3],
              lastClose: rs[4], // 昨收
              open: rs[5],
              high: rs[33],
              low: rs[34],
              vol: rs[6],
              volAmount: rs[37] * 10000,
              date: rs[30].replaceAll("-", "").substring(0, 8),
              time: rs[30].replaceAll("-", "").substring(8),
              change: rs[31],
              changeRatio: rs[32]);
          list.add(obj);
          //console.log(obj);
          i++;
        }
      }
      if (success is Function) success(list);
    } else {
      if (fail is Function) fail(response);
    }
  }

.....

C# 版

代码片段

         /**
         * 请求第三方实时行情
         * @param {string} code 股票代码
         * @param {object} success
         * @param {object} fail
         * 0: 未知 1: 名字 2: 代码 3: 当前价格 4: 昨收 5: 今开 6: 成交量(手) 7: 外盘 8: 内盘 9: 买一 10: 买一量(手) 11-18: 买二 买五 19: 卖一 20: 卖一量 21-28: 卖二 卖五 29: 最近逐笔成交 30: 时间 31: 涨跌 32: 涨跌% 33: 最高 34: 最低 35: 价格/成交量(手)/成交额 36: 成交量(手) 37: 成交额(万) 38: 换手率 39: 市盈率 40: 41: 最高 42: 最低 43: 振幅 44: 流通市值 45: 总市值 46: 市净率 47: 涨停价 48: 跌停价
         */
        public static List<HqModel> getQuote(String code)
        {
            String api = "http://qt.gtimg.cn/q=" + code;
            String resultStart = "v_{code}=";
            String resultEnd = ";";
            String data = get(api);
            //console.log(response);
            List<HqModel> list = null;
            if (data != null)
            {
                list = new List<HqModel>();
                String[] dataList = data.Split(resultEnd.ToCharArray());
                String[] codes = code.Split(',');
                for (int i = 0; i < dataList.Length; i++)
                {
                    String item = dataList[i];
                    String rss = item.Replace(resultStart.Replace("{code}", code.ToLower()), "");
                    String[] rs = rss.Split('~');
                    if (rs[1] != "")
                    {
                        HqModel obj = new HqModel();
                        obj.name = rs[1];
                        obj.code = codes[i];
                        obj.price = rs[3];
                        obj.lastClose = rs[4];
                        obj.open = rs[5];
                        obj.high = rs[33];
                        obj.low = rs[34];
                        obj.vol = rs[6];
                        obj.volAmount = rs[37];
                        obj.date = rs[30].Substring(0, 8);
                        obj.time = rs[30].Substring(8);
                        obj.change = rs[31];
                        obj.changeRatio = rs[32];

                        list.Add(obj);
                        //console.log(obj);
                        i++;
                    }
                }
            }
            return list;
        }

Object-C(iOS) 版

代码片段

/**
 * 请求第三方实时行情
 * @param code 股票代码
 * @param success 成功
 * @param fail 失败
 * 0: 未知 1: 名字 2: 代码 3: 当前价格 4: 昨收 5: 今开 6: 成交量(手) 7: 外盘 8: 内盘 9: 买一 10: 买一量(手) 11-18: 买二 买五 19: 卖一 20: 卖一量 21-28: 卖二 卖五 29: 最近逐笔成交 30: 时间 31: 涨跌 32: 涨跌% 33: 最高 34: 最低 35: 价格/成交量(手)/成交额 36: 成交量(手) 37: 成交额(万) 38: 换手率 39: 市盈率 40: 41: 最高 42: 最低 43: 振幅 44: 流通市值 45: 总市值 46: 市净率 47: 涨停价 48: 跌停价
 */
+(void)getQuoteWithCode:(NSString*)code success:(void(^)(NSMutableArray *data))success fail:(void(^)(NSError * _Nullable error))fail{
    NSString *api = [NSString stringWithFormat:@"http://qt.gtimg.cn/q=%@",code];
    NSString *resultStart = @"v_{code}=";
    NSString *resultEnd = @";";
    [self get:api success:^(NSString *data) {
        if(data==nil) {
            success(nil);
            return;
        }
        NSMutableArray *list = [NSMutableArray new];
        NSArray *dataList = [data componentsSeparatedByString:resultEnd];
        NSArray *codes = [code componentsSeparatedByString:@","];
        for(int i=0;i<dataList.count;i++){
            NSString *item = dataList[i];
            item = [item stringByReplacingOccurrencesOfString:[resultStart stringByReplacingOccurrencesOfString:@"{code}" withString:code.lowercaseString] withString:@""];
            NSArray *rs = [item componentsSeparatedByString:@"~"];
            if(rs.count<32) continue;
            HqModel *model = [HqModel new];
            model.name = rs[1];
            model.code = codes[i];
            model.price = rs[3];
            model.lastClose = rs[4];
            model.open = rs[5];
            model.high = rs[33];
            model.low = rs[34];
            model.vol = rs[6];
            model.volAmount = rs[37];
            model.date = [rs[30] substringToIndex:8];
            model.time = [rs[30] substringFromIndex:8];
            model.change = rs[31];
            model.changeRatio = rs[32];
            [list addObject:model];
        }
        if (success) {
            success(list);
        }
            
    } fail:^(NSError * _Nullable error) {
        if (fail) {
            fail(error);
        }
    }];
    
}

Js版

代码片段

/**
 * 读取第三方行情
 * 感谢腾讯提供行情数据
 */
String.prototype.replaceAll = function(s1, s2) {
    return this.replace(new RegExp(s1, "gm"), s2);
}
var qqhq = {
};
qqhq.resultStart = "v_{code}=";
qqhq.resultEnd = ";";
/**
 * 请求第三方实时行情
 * @param {string} code 股票代码
 * @param {object} success 
 * @param {object} fail 
 * 0: 未知 1: 名字 2: 代码 3: 当前价格 4: 昨收 5: 今开 6: 成交量(手) 7: 外盘 8: 内盘 9: 买一 10: 买一量(手) 11-18: 买二 买五 19: 卖一 20: 卖一量 21-28: 卖二 卖五 29: 最近逐笔成交 30: 时间 31: 涨跌 32: 涨跌% 33: 最高 34: 最低 35: 价格/成交量(手)/成交额 36: 成交量(手) 37: 成交额(万) 38: 换手率 39: 市盈率 40: 41: 最高 42: 最低 43: 振幅 44: 流通市值 45: 总市值 46: 市净率 47: 涨停价 48: 跌停价
 */
qqhq.getQuote = function(code,success,fail){
    let api = "http://qt.gtimg.cn/q="+code;
    this.get(api,function(response){
        //console.log(response);
        if(response){
            let data = response;
            let list = [];
            let dataList = data.split(qqhq.resultEnd);
            let codes = code.split(",");
            let i = 0;
            dataList.forEach(item => {
                let rs = item.replace(qqhq.resultStart.replace("{code}",code.toLowerCase()),"");
                rs = rs.split("~");
                if(rs[1]){
                    let obj = {
                        name:rs[1],
                        code:codes[i],
                        price:rs[3],
                        lastClose:rs[4], // 昨收
                        open:rs[5],
                        high:rs[33],
                        low:rs[34],
                        vol:rs[6],
                        volAmount:rs[37]*10000,
                        date:rs[30].replaceAll("-","").substring(0,8),
                        time:rs[30].replaceAll("-","").substring(8),
                        change:rs[31],
                        changeRatio:rs[32]
                    }
                    list.push(obj);
                    //console.log(obj);
                    i++;
                }
            });
            success(list);
        }else{
            fail(response);
        }

    },function(error){
        fail(error);
    })
}

以上就是这几种开发语言的demo,可以下载运行测试,不要用于商业用途即可。

ChatGPT版

当然了,现在都不用自己写了,让ChatGPT帮你写一个也可以哦

如果您觉得有些许用途,请点赞收藏起来吧,欢迎交流学习哦!