目录
(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