【金融数据接口】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接口

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:收益率

传参细节说明

  1. Fields和Parameter也可以传入list,比如可以用[“CLOSE”,“HIGH”,“LOW”,“OPEN”]替代“CLOSE,HIGH,LOW,OPEN”;
  2. 获取多个证券数据时,Fields只能选择一个。
  3. 日期支持相对日期宏表达方式,日期宏具体使用方式参考'日期宏’部分内容
  4. options为可选参数,可选参数多个,在参数说明详细罗列。
  5. 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 展示数据时,如果取单个标的数据,以指标为维度进行数据展示, 如果取多个标的数据,只能取单个指标,以标的为维度进行数据展示

示例说明

# 任取一只国债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)

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

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

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()

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

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则正常

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

你可能感兴趣的:(finance,金融)