【金融数据接口】wind数据python使用教程

【金融数据接口】wind数据python使用教程

目录

(1)接口手册

(2)包安装与接口调用

(3)常用接口

A.获取k线数据(wsd)

参数说明

集成在options中的参数

传参细节说明

返回说明

示例说明

B.获取实时行情数据(wsq)

C.获证券代码(wset)

代码获取方法

获取期货品种代码

获取股票、债券和期权代码

(4)判断wind是否在运行以及获取数据是否正常

(1)接口手册

wind客户端接口手册获取

旧版:登录wind → 量化 → API接口 → Python → 接口手册

新版:登录wind → 发现 → Client API → Python → 接口手册

代码生成器:登录wind → 发现 → 代码生成器

C接口文档:3. 获取日时间序列函数w.wsd · Wind C#接口 · 看云

(2)包安装与接口启动

1.安装

安装python

打开wind,点击"我的/插件修复"选项,出现下方的界面,点击"修复Python接口",会弹出接口的相关说明

2.调用

首先,用户必须加载WindPy,然后执行w.start()启动API接口

python

复制代码

from WindPy import w

#w.start() # 默认命令超时时间为120秒

w.start(waitTime = 60)

# 如需设置超时时间可以加入waitTime参数,例如waitTime=60,即设置命令超时时间为60秒

result = w.isconnected() # 判断WindPy是否已经登录成功

print(result) # True

w.stop()

# 当需要停止WindPy时,可以使用该命令

# w.start不重复启动,若需要改变参数,如超时时间,用户可以使用w.stop命令先停止后再启动。

# 退出时,会自动执行w.stop(),一般用户并不需要执行w.stop

# 需要注意的是,程序退出时会自动执行w.stop(),因此一般用户并不需要执行w.stop()

(3)常用接口

A.获取k线数据(wsd)

w.wsd(codes, fields, beginTime, endTime, options)

支持股票、债券、基金、期货、指数等多种证券的基本资料、股东信息、市场行情、证券分析、预测评级、财务数据等各种数据。wsd可以支持取 多品种单指标 或者 单品种多指标 的时间序列数据。

参数说明

|-----------|--------------|----|---------|------------------------------------------------------------------------------------------------------|

| 参数 | 类型 | 可选 | 默认值 | 说明 |

| codes | str或list | 否 | 无 | 证券代码,支持获取单品种或多品种,如"600030.SH"或"600010.SH","000001.SZ" |

| fields | str或list | 否 | 无 | 指标列表,支持获取单指标或多指标,,如"CLOSE,HIGH,LOW,OPEN" |

| beginTime | str或datetime | 是 | endTime | 起始日期,为空默认为截止日期,如: "2016-01-01"、"20160101"、"2016/01/01"、"-5D"(当前日期前推5个交易日)、datetime/date类型 |

| endTime | str或datetime | 是 | 系统当前日期 | 如: "2016-01-05"、"20160105"、"2016/01/05"、"-2D"(当前日期前推2个交易日) 、datetime/date类型 |

| options | str | 是 | "" | options以字符串的形式集成多个参数,具体见代码生成器。如无相关参数设置,可以不给option赋值或者使用options="" 以分号分割,比如"returnType=1;PriceAdj=CP" |

集成在 options中的参数

|-----------------|-----|----|------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|

| 参数 | 类型 | 可选 | 默认值 | 说明 |

| Days | str | 是 | 'Trading' | 日期选项,参数值含义如下: Weekdays: 工作日, Alldays: 日历日, Trading: 交易日 |

| Fill | str | 是 | 'Blank' | 空值填充方式。参数值含义如下: Previous:沿用前值, Blank:返回空值 如需选择自设数值填充,在options添加"ShowBlank=X", 其中X为自设数。 |

| Order | str | 是 | 'A' | 日期排序,"A":升序,"D":降序 |

| Period | str | 是 | 'D' | 取值周期。参数值含义如下: D:天, W:周, M:月, Q:季度, S:半年, Y:年 |

| TradingCalendar | str | 是 | 'SSE' | 交易日对应的交易所。参数值含义如下: SSE :上海证券交易所, SZSE:深圳证券交易所, CFFE:中金所, TWSE:台湾证券交易所, DCE:大商所, NYSE:纽约证券交易所, CZCE:郑商所, COMEX:纽约金属交易所, SHFE:上期所, NYBOT:纽约期货交易所, HKEX:香港交易所, CME:芝加哥商业交易所, Nasdaq:纳斯达克证券交易所, NYMEX:纽约商品交易所, CBOT:芝加哥商品交易所, LME:伦敦金属交易所, IPE:伦敦国际石油交易所 |

| Currency | str | 是 | 'Original' | 输入币种。参数值含义如下: Original:"原始货币", HKD:"港币", USD:"美元", CNY:"人民币" |

| PriceAdj | str | 是 | 不复权 | 股票和基金(复权方式)。参数值含义如下: F:前复权, B:后复权, T:定点复权;债券(价格类型) CP:净价, DP:全价, MP:市价, YTM:收益率 |

传参细节说明

Fields和Parameter也可以传入list,比如可以用"CLOSE","HIGH","LOW","OPEN"替代"CLOSE,HIGH,LOW,OPEN";

获取多个证券数据时,Fields只能选择一个。

日期支持相对日期宏表达方式,日期宏具体使用方式参考'日期宏'部分内容

options为可选参数,可选参数多个,在参数说明详细罗列。

wsd函数支持输出DataFrame数据格式,需要函数添加参数usedf=True,可以使用usedfdt=True来填充DataFrame输出NaT的日期。

fields常见指标

open:开盘价

high:当日最高价

low:当日最低价

close:当日收盘价

pre_close:昨日收盘价

volume:当日成交量

amt:即amount,成交金额

dealnum:下单量

chg:涨跌额

pct_chg:涨跌幅

vwap:成交量加权平均价

trade_status:交易状态

turn:换手率

free_turn:自由股换手率

rel_ipo_chg:相较于首次公开发行时的涨跌额

rel_ipo_pct_chg:相较于首次公开发行时的涨跌幅度

pe_ttm:Price earnings ratio,市盈率。TTM:Trailing Twelve Months,即消除季节等时序因素的影响

pe_lyr:LYR:Last Year Ratio。即以当前总市值,除以去年一年的总净润,表示静态市盈率

pb_lf:Price-to-Book Ratio,市净率。表示每股股价除以每股净资产;LF:Last File,表示每股净资产应该使用最新公告中的数据

ps_lyr:Price-to-Sales Ratio,市销率。

ev:Enterprise Value,即总市值

pcf_ocf_ttm:Price Cash Flow Ratio 市现率; Operating Cash Flow,经营现金流

trade_status:交易状态

返回说明

如果不指定usedf=True,该函数将返回一个WindData对象,包含以下成员:

|-----------|--------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------|

| 返回码 | 解释 | 说明 |

| ErrorCode | 错误ID | 返回代码运行错误码,.ErrorCode =0表示代码运行正常。 若为其他则需查找错误原因. |

| Data | 数据列表 | 返回函数获取的数据 比如读取000592.SZ的close指标从'2017-05-08'到'2017-05-18'区间的数据 返回值为.Data=\[5.12,5.16,5.02,4.9,4.91,5.13,5.35,5.42,5.32,5.3,5.12,5.17,4.98,4.94,4.93,5.1,5.4,5.4] |

| Codes | 证券代码列表 | 返回获取数据的证券代码列表.Codes=000592.SZ |

| Field | 指标列表 | 返回获取数据的指标列表.Fields=CLOSE |

| Times | 时间列表 | 返回获取数据的日期序列.Times=20170508,20170509,20170510,20170511,20170512,20170515,20170516, 20170517,20170518 |

注:以DataFrame 展示数据时,如果取单个标的数据,以指标为维度进行数据展示, 如果取多个标的数据,只能取单个指标,以标的为维度进行数据展示

示例说明

python

复制代码

# 任取一只国债010107.SH六月份以来的净值历史行情数据

column_names = "sec_name,ytm_b,volume,duration,convexity,open,high,low,close,vwap"

history_data = w.wsd("010107.SH",

column_names,

"2018-06-01", "2018-06-11",

"returnType=1;PriceAdj=CP",

usedf=True)

# returnType表示到期收益率计算方法,PriceAdj表示债券价格类型'

history_data[1].head()

B.获取实时行情数据(wsq)

用这个接口获取实时数据的下载量是有限制的,超过一定量就要额外收费

python

复制代码

from WindPy import w

w.start()

data = w.wsq("000920.SZ, 002573.SZ",

"rt_last, rt_open, rt_low, rt_last_vol, rt_high, rt_pre_close",

func="DemoWSQCallback")

'''

rt_last: 最新实时价格

rt_open: 今日开盘价

rt_low: 开盘到当前时间之间的最低价

rt_last_vol: 开盘到当前时间之间的成交量

rt_high: 开盘到当前时间之间的最高价

rt_pre_close: 前一日收盘价

'''

print(data)

'''

.ErrorCode=0

.Codes=[000920.SZ,002573.SZ]

.Fields=[RT_LAST,RT_OPEN,RT_LOW,RT_LAST_VOL,RT_HIGH,RT_PRE_CLOSE]

.Times=[20221107 14:01:42]

.Data=[

[10.15,6.390000000000001],

[10.15,5.92],

[10.15,5.86],

[1200.0,200.0],

[10.15,6.390000000000001],

[9.23,5.8100000000000005]

]

'''

print(data.Data)

C.获取证券代码(wset)

代码获取方法

wind客户端首页→代码生成器→数据集WSET→板块与指数→板块成分

→ 在坐标(sectorID,编辑)处进行板块选择期货 → 选某个交易所 → 选择全部品种

获取期货品种代码

download_future_codeList.py

python

复制代码

from WindPy import w

w.start()

import datetime as dt

def main():

today = dt.datetime.now().strftime(("%Y-%m-%d"))

# print(type(today), today)

# 如果当天非交易日,则不下载数据

pass

savepath = "./Instruments.csv"

writefile = open(savepath, "w")

# (1)下载中金所期货合约代码

result = w.wset("sectorconstituent", f"date={today};sectorid=a599010101000000")

# print(result)

data = result.Data

# print(data)

# print(data[1])

for item in data[1]:

code = item.split(".")[0]

writefile.write(code + ",CFFEX\n")

# (2)下载上期所

result = w.wset("sectorconstituent", f"date={today};sectorid=a599010201000000")

data = result.Data

# print(data)

# print(data[1])

for item in data[1]:

code = item.split(".")[0].lower()

writefile.write(code + ",SHFE\n")

# (3)下载上海能源中心

result = w.wset("sectorconstituent", f"date={today};sectorid=1000041395000000")

data = result.Data

# print(data)

for item in data[1]:

code = item.split(".")[0].lower()

writefile.write(code + ",INE\n")

# (4)下载大商所

result = w.wset("sectorconstituent", f"date={today};sectorid=a599010301000000")

data = result.Data

for item in data[1]:

code = item.split(".")[0].lower()

writefile.write(code + ",DCE\n")

# (5)下载郑商所

result = w.wset("sectorconstituent", f"date={today};sectorid=a599010401000000")

data = result.Data

# print(data)

for item in data[1]:

code = item.split(".")[0]

writefile.write(code + ",CZCE\n")

# (6)下载广州所

result = w.wset("sectorconstituent", f"date={today};sectorid=1000046789000000")

data = result.Data

# print(data)

for item in data[1]:

code = item.split(".")[0].lower()

writefile.write(code + ",GFE\n")

writefile.close()

if __name__ == "__main__":

main()

获取股票、债券和期权代码

python

复制代码

import datetime as dt

from WindPy import w

w.start()

def is_connect_wind():

# 检测wind是否在运行

# 返回True或者False

return w.isconnected()

def save_data(data_list, save_path):

"""

data_list: 数据,元素为"601669.SSE"这样

save_path: 保存路径

"""

if len(data_list) > 0:

writefile = open(save_path, "w")

for code in data_list:

writefile.write(code + "\n")

writefile.close()

def get_stock_code_wind():

"""

获取wind股票代码

"""

# 当日日期

today = dt.datetime.now().strftime("%Y-%m-%d")

# 调用wind接口获取全部A股代码

result = w.wset("sectorconstituent", f"date={today};sectorid=a001010100000000")

stock_code_list = []

# 判断代码运行是否正常

if result.ErrorCode == 0:

# print(result)

data = result.Data

# print(data)

# print(data[1])

# 判断数据是否为空

if len(data) > 0:

for item in data[1]:

# print(item)

if item.find("SZ") != -1 or item.find("SH") != -1:

stock_code_list.append(item)

else:

# print("len(result.Data) == 0")

return []

else:

# print("result.ErrorCode != 0, exist error")

return []

# 若未成功获取数据,则返回空列表

if len(stock_code_list) > 0:

return stock_code_list

else:

return []

def get_index_code_wind():

"""

获取wind指数代码

"""

# 当日日期

today = dt.datetime.now().strftime("%Y-%m-%d")

# 调用wind接口获取全部指数代码

index_code_list = []

# a.调用wind接口获取上证系列指数代码

result = w.wset("sectorconstituent", f"date={today};sectorid=1000002442000000")

# 判断代码运行是否正常

if result.ErrorCode == 0:

# print(result)

data = result.Data

# print(data)

# print(data[1])

# [3]判断数据是否为空

if len(data) > 0:

for item in data[1]:

# print(item)

if item.find("SZ") != -1 and len(item) == 9:

index_code_list.append(item)

elif item.find("SH") != -1 and len(item) == 9:

index_code_list.append(item)

else:

# print("len(result.Data) == 0")

return []

else:

# print("result.ErrorCode != 0, exist error")

return []

# b.调用wind接口获取中证系列指数代码

result = w.wset("sectorconstituent", f"date={today};sectorid=a399010104000000")

# 判断代码运行是否正常

if result.ErrorCode == 0:

# print(result)

data = result.Data

# print(data)

# print(data[1])

# 判断数据是否为空

if len(data) > 0:

for item in data[1]:

# print(item)

if item.find("SZ") != -1 and len(item) == 9:

index_code_list.append(item)

elif item.find("SH") != -1 and len(item) == 9:

index_code_list.append(item)

else:

# print("len(result.Data) == 0")

return []

else:

# print("result.ErrorCode != 0, exist error")

return []

# c.调用wind接口获取深证系列指数代码

result = w.wset("sectorconstituent", f"date={today};sectorid=1000003626000000")

# [2]判断代码运行是否正常

if result.ErrorCode == 0:

# print(result)

data = result.Data

# print(data)

# print(data[1])

# [3]判断数据是否为空

if len(data) > 0:

for item in data[1]:

# print(item)

if item.find("SZ") != -1and len(item) == 9:

index_code_list.append(item)

elif item.find("SH") != -1 and len(item) == 9:

index_code_list.append(item)

else:

# print("len(result.Data) == 0")

return []

else:

# print("result.ErrorCode != 0, exist error")

return []

# 若未成功获取数据,则返回空列表

if len(index_code_list) > 0:

return index_code_list

else:

return []

def get_bond_code_wind():

"""

获取wind债券代码,含可转债

"""

# 当日日期

today = dt.datetime.now().strftime("%Y-%m-%d")

# 调用wind接口获取全部债券代码

bond_code_list = []

# a.调用wind接口获取上交所债券代码

result = w.wset("sectorconstituent", f"date={today};sectorid=a101010200000000")

# 判断代码运行是否正常

if result.ErrorCode == 0:

# print(result)

data = result.Data

# print(data)

# print(data[1])

# [3]判断数据是否为空

if len(data) > 0:

for item in data[1]:

# print(item)

if item.find("SZ") != -1 and len(item) == 9:

bond_code_list.append(item)

elif item.find("SH") != -1 and len(item) == 9:

bond_code_list.append(item)

else:

# print("len(result.Data) == 0")

return []

else:

# print("result.ErrorCode != 0, exist error")

return []

# b.调用wind接口获取深交所债券代码

result = w.wset("sectorconstituent", f"date={today};sectorid=a101010300000000")

# 判断代码运行是否正常

if result.ErrorCode == 0:

# print(result)

data = result.Data

# print(data)

# print(data[1])

# 判断数据是否为空

if len(data) > 0:

for item in data[1]:

# print(item)

if item.find("SZ") != -1 and len(item) == 9:

bond_code_list.append(item)

elif item.find("SH") != -1 and len(item) == 9:

bond_code_list.append(item)

else:

# print("len(result.Data) == 0")

return []

else:

# print("result.ErrorCode != 0, exist error")

return []

# 若未成功获取数据,则返回空列表

if len(bond_code_list) > 0:

return bond_code_list

else:

return []

def get_convert_bond_code_wind():

"""

获取wind可转债代码

"""

# 当日日期

today = dt.datetime.now().strftime("%Y-%m-%d")

# 调用wind接口获取全部可转债券代码

convert_bond_code_list = []

# a.调用wind接口获取上交所可转债券代码

result = w.wset("sectorconstituent", f"date={today};sectorid=a101010206000000")

# 判断代码运行是否正常

if result.ErrorCode == 0:

# print(result)

data = result.Data

# print(data)

# print(data[1])

# [3]判断数据是否为空

if len(data) > 0:

for item in data[1]:

# print(item)

if item.find("SZ") != -1 and len(item) == 9:

convert_bond_code_list.append(item)

elif item.find("SH") != -1 and len(item) == 9:

convert_bond_code_list.append(item)

else:

# print("len(result.Data) == 0")

return []

else:

# print("result.ErrorCode != 0, exist error")

return []

# b.调用wind接口获取深交所可转债券代码

result = w.wset("sectorconstituent", f"date={today};sectorid=a101010306000000")

# 判断代码运行是否正常

if result.ErrorCode == 0:

# print(result)

data = result.Data

# print(data)

# print(data[1])

# 判断数据是否为空

if len(data) > 0:

for item in data[1]:

# print(item)

if item.find("SZ") != -1 and len(item) == 9:

convert_bond_code_list.append(item)

elif item.find("SH") != -1 and len(item) == 9:

convert_bond_code_list.append(item)

else:

# print("len(result.Data) == 0")

return []

else:

# print("result.ErrorCode != 0, exist error")

return []

# 若未成功获取数据,则返回空列表

if len(convert_bond_code_list) > 0:

return convert_bond_code_list

else:

return []

def get_stock_option_code_wind():

"""

获取wind股票期权代码

"""

# 当日日期

today = dt.datetime.now().strftime("%Y-%m-%d")

# 调用wind接口获取全部期权代码

stock_option_code_list = []

# a.调用wind接口获取上交所期权代码

result = w.wset("sectorconstituent", f"date={today};sectorid=1000018859000000")

# 判断代码运行是否正常

if result.ErrorCode == 0:

# print(result)

data = result.Data

# print(data)

# print(data[1])

# [3]判断数据是否为空

if len(data) > 0:

# print(data)

for item in data[1]:

# print(item)

if item.find("SZ") != -1:

stock_option_code_list.append(item)

elif item.find("SH") != -1:

stock_option_code_list.append(item)

else:

# print("len(result.Data) == 0")

return []

else:

# print("result.ErrorCode != 0, exist error")

return []

# b.调用wind接口获取深交所期权代码

result = w.wset("sectorconstituent", f"date={today};sectorid=1000034419000000")

# 判断代码运行是否正常

if result.ErrorCode == 0:

# print(result)

data = result.Data

# print(data)

# print(data[1])

# 判断数据是否为空

if len(data) > 0:

# print(data)

for item in data[1]:

# print(item)

if item.find("SZ") != -1:

stock_option_code_list.append(item)

elif item.find("SH") != -1:

stock_option_code_list.append(item)

else:

# print("len(result.Data) == 0")

return []

else:

# print("result.ErrorCode != 0, exist error")

return []

# 若未成功获取数据,则返回空列表

if len(stock_option_code_list) > 0:

return stock_option_code_list

else:

return []

def get_future_option_code_wind():

"""

获取wind期货期权代码

"""

# 当日日期

today = dt.datetime.now().strftime("%Y-%m-%d")

# 调用wind接口获取全部期权代码

future_option_code_list = []

exchange_list = [

["1000034440000000", "中金所"],

["1000021571000000", "上期所"],

["1000041406000000", "上期能源"],

["1000033252000000", "大商所"],

["1000016058000000", "郑商所"],

["1000046211000000", "广期所"]

]

# 调用wind接口获取期权代码

for i in range(len(exchange_list)):

sectorid = exchange_list[i][0]

exchange = exchange_list[i][1]

result = w.wset("sectorconstituent", f"date={today};sectorid={sectorid}")

# 判断代码运行是否正常

if result.ErrorCode == 0:

# print(result)

data = result.Data

# print(data)

# print(data[1])

# [3]判断数据是否为空

if len(data) > 0:

# print(data)

for item in data[1]:

# print(item)

temp_list = item.split(".")

suffix = "."

if exchange == "中金所":

suffix += "CFE"

elif exchange == "上期所":

suffix += "SFE"

elif exchange == "上期能源":

suffix += "INE"

elif exchange == "大商所":

suffix += "DCE"

elif exchange == "郑商所":

suffix += "ZCE"

elif exchange == "广期所":

suffix += "GFE"

code = temp_list[0] + suffix

future_option_code_list.append(code)

else:

# print("len(result.Data) == 0")

return []

else:

# print("result.ErrorCode != 0, exist error")

return []

# 若未成功获取数据,则返回空列表

if len(future_option_code_list) > 0:

return future_option_code_list

else:

return []

(4)判断wind是否在运行以及获取数据是否正常

是否连接成功:w.isconnected(),值为True则正常

获取数据是否正常:result.ErrorCode,值为0则正常

python

复制代码

from WindPy import w

import datetime as dt

import shutil

import os

w.start()

def download_future_code_wind(save_path):

# 当日日期

today = dt.datetime.now().strftime(("%Y-%m-%d"))

# print(type(today), today)

# 如果当天非交易日,则不下载数据

pass

# 备份之前生成的文件

if os.path.exists(save_path):

temp_list = save_path.split(".")

bakeup_path = temp_list[0] + "_bakeup." + temp_list[1]

shutil.copyfile(save_path, bakeup_path)

is_get_wind_data = True # 是否成功获取到wind数据

while True:

writefile = open(save_path, "w")

# 下载中金所期货合约代码

result = w.wset("sectorconstituent",

f"date={today};sectorid=a599010101000000")

# 2.判断代码运行是否正常

if result.ErrorCode == 0:

# print(result)

data = result.Data

# print(data)

# print(data[1])

# 3.判断数据是否为空

if len(data) > 0:

for item in data[1]:

code = item.split(".")[0]

writefile.write(code + ",CFFEX\n")

else:

is_get_wind_data = False

break

else:

is_get_wind_data = False

break

writefile.close()

break

# 若未成功获取数据,则用备份的那个文件替换保存文件

if not is_get_wind_data:

print("无法获取到wind数据")

if os.path.exists(save_path):

os.remove(save_path)

temp_list = save_path.split(".")

bakeup_path = temp_list[0] + "_bakeup." + temp_list[1]

if os.path.exists(bakeup_path):

shutil.copyfile(bakeup_path, save_path)

if __name__ == "__main__":

# 要检测wind是否正在运行,还要检测以及能否获取到数据

# 1.检测wind是否在运行

is_connect_wind = w.isconnected()

print(f"is_connect_wind={is_connect_wind}")

if is_connect_wind:

print("use wind to get future codeList")

savepath = "./Instruments.csv"

download_future_code_wind(savepath)

end

相关文章

王者荣耀里面荆轲怎么用 365bet盘口

王者荣耀里面荆轲怎么用

📅 08-04 👁️ 1115
售价22.59元万起,宝马全新一代水鸟上市! 365bet亚洲官方网站

售价22.59元万起,宝马全新一代水鸟上市!

📅 01-23 👁️ 9017
文本自动换行与断字 - CSS 365bet亚洲官方网站

文本自动换行与断字 - CSS

📅 02-14 👁️ 1429