现在个人量化开发者还是挺多的,有用各种开发语言的,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帮你写一个也可以哦
如果您觉得有些许用途,请点赞收藏起来吧,欢迎交流学习哦!