python+Windpy做金融数据分析

一、windpy+python初步想法

        Wind有python接口,可以导出相关的金融数据,特别适用于要导出大量数据,或者想看不同区间的数据的情况,特别是有定期更新数据的需求时,用python解决比excel更方便。

        所以研究了一下Windpy的应用,现在这样的应用教程还是比较少的,希望能从基础的数据导出出发,用python完成进一步的数据再处理、数据分析、数据可视化的完整的金融数据的分析。

        现在是第一篇,主要完成了分析一只或多只指数在分析区间内的涨跌幅走势(折现图)、各区间段内的涨跌幅、最大回撤、年化夏普比率对比表格

二、思路和代码展示

(一)导入相关的库

1.一开始的时候遇到了好多问题,比如显示中文乱码、字体、中文字体下坐标轴负数的负号显示问题等,下面的代码就一下子都解决了。

# 设置输出格式为utf8
# -*- coding: utf-8 -*-
import io
import sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding="utf8")
import time

# 调用wind接口
from WindPy import w

# 调用需要的各种库
import pandas as pd
import numpy as np
import datetime
from dateutil.parser import parse
from datetime import datetime
from datetime import timedelta
from dateutil.relativedelta import relativedelta
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
plt.rcParams['font.sans-serif'] = ['SimHei']  #设计字体为黑体
plt.rcParams['axes.unicode_minus'] = False  #解决中文字体下坐标轴负数的负号显示问题
plt.rcParams['figure.figsize'] = (9, 5) #统一图片大小

import seaborn as sns

pd.set_option('display.max_columns',None) 
w.start() 
w.isconnected()

(二)制作基础的数据表

        包括列名为指数简称、各行为日期区间内的涨跌幅

def get_ClosePrice_increase(
    IndexCode,              # 要分析的指数列表
    StartDate,              # 开始日期'20190301'
    EndDate,                # 截止日期'20191231'
    long_x = 10,            # 图片的尺寸设置,默认是10,可以改
    short_y = 6,            # 图片的尺寸设置,默认是6,可以改
    need_to_show=True
):
    error_code, IndexName = w.wss(IndexCode, "sec_name",usedf=True)
    IndexName_list = IndexName['SEC_NAME'].to_list() 
    True_StartDate =  (parse(StartDate) - relativedelta(days=1)).strftime('%Y%m%d')
    error_code, ClosePrice = w.wsd(IndexCode, "close", True_StartDate, EndDate, "",usedf=True)  #导出区间内收盘价
    col=IndexName_list
    ClosePrice.columns=col
    ClosePrice_increase = ((ClosePrice - ClosePrice.iloc[0,:]) / ClosePrice.iloc[0,:])*100  #区间涨跌幅计算
    ClosePrice_increase = ClosePrice_increase.iloc[1:,:]
    print(ClosePrice_increase)

运行结果如下:

                上证指数     沪深300
2019-03-01  1.803877  2.189585
2019-03-04  2.945361  3.399322
2019-03-05  3.852247  3.996405
2019-03-06  5.479355  4.870590
2019-03-07  5.626205  3.801181
...              ...       ...
2024-02-23  2.173689 -4.895355
2024-02-26  1.226415 -5.886890
2024-02-27  2.534106 -4.757844
2024-02-28  0.574596 -5.971338
2024-02-29  2.523583 -4.177493

[1214 rows x 2 columns]

(三)画指数收益率的对比图(只有一只的话就是指数的走势图)

    plt.rcParams['figure.figsize'] = (long_x, short_y)
    x = ClosePrice_increase.index
    for index,IndexName in enumerate(IndexName_list):
        y = ClosePrice_increase[IndexName_list[index]]
        plt.plot(x, y,label=IndexName_list[index], 
                 color=color_list[index], linestyle='-',  markersize=5)

    # 设置X,Y轴标签
    plt.ylabel('区间涨跌幅:%',fontsize = 14,loc="top")
    # 设置图例
    plt.legend(loc='upper right')
    # 设置图片标题并保存
    fig_name = '图 ' + IndexName_list[0] +'等指数涨跌幅对比_' + StartDate + '-' + EndDate +'.png'
    plt.savefig(fig_name, bbox_inches='tight')
    plt.legend(loc='upper right')
    # plt.show()

图片输出结果如下:

(四)做各个区间段的涨跌幅、最大回撤、年化夏普比等指标的对比表格

1.定义各个区间段

    # 区间段定义
    YearBeginning = EndDate[:4] + '0101'
    SixMonthBefore = (parse(EndDate) - relativedelta(months=6)+ relativedelta(days=1)).strftime('%Y%m%d')  #6个月前
    OneYearBefore = (parse(EndDate) - relativedelta(years=1)+ relativedelta(days=1)).strftime('%Y%m%d')  #1年前
    TwoYearBefore = (parse(EndDate) - relativedelta(years=2)+ relativedelta(days=1)).strftime('%Y%m%d')   #2年前
    ThreeYearBefore = (parse(EndDate) - relativedelta(years=3)+ relativedelta(days=1)).strftime('%Y%m%d')  #3年前
    FiveYearBefore = (parse(EndDate) - relativedelta(years=5)+ relativedelta(days=1)).strftime('%Y%m%d')  #5年前
    TenYearBefore = (parse(EndDate) - relativedelta(years=10)+ relativedelta(days=1)).strftime('%Y%m%d')  #10年前
    error_code, basedate = w.wss(IndexCode.split(',')[0], "basedate", usedf=True)  #基准指数基日以来的日期
    basedate = basedate.iloc[0,0].strftime('%Y%m%d')
    error_code, launchdate = w.wss(IndexCode.split(',')[0], "launchdate", usedf=True)  #基准指数发布以来的日期
    launchdate = launchdate.iloc[0,0].strftime('%Y%m%d')
    date_list = [YearBeginning, SixMonthBefore, OneYearBefore, TwoYearBefore, ThreeYearBefore, FiveYearBefore, TenYearBefore,basedate,launchdate]
    Time_list = ['今年以来','近6个月','近一年','近两年','近三年','近五年','近十年','基日以来','发布以来']

2.区间段的指标导出

windpy导出数据的突出特点就是导出数据的时候不同指标对应的代码差别较大,所以很难对不同性质的指标都用for循环一下子就写出来,需要根据不同指标的wind公式的特征针对性的改,但是整体的思路是一致的,就以用的最多的区间涨跌幅、最大回撤、年化夏普比率为例子做展示:

(1)区间涨跌幅和区间最大回撤数据对比
    Indicators_list = ['pct_chg_per','risk_maxdownside']
    Indicators_name = ['区间涨跌幅:%','区间最大回撤:%']
    for index,Indicators in enumerate(Indicators_list):
        index_data_all = pd.DataFrame()
        error_code, index_name = w.wss(IndexCode, "sec_name",usedf=True)
        index_data_all.index = IndexCode.split(',')
        index_data_all['指数简称'] = index_name['SEC_NAME']
        for index2,date in enumerate(date_list):
            Code = "startDate=" + date + ";endDate=" + EndDate 
            error_code, index_data =  w.wss(IndexCode,Indicators,Code,usedf=True)  #导出所需的相关指标  
            index_data.columns = [Time_list[index2]]
            index_data_all = pd.concat([index_data_all,index_data],axis=1)
            index_data_all = index_data_all.round(2)
        # 导出表格为csv
        csv_name = '指数' + Indicators_name[index][:-2] + '对比.csv'
        index_data_all.to_csv(csv_name,encoding='utf-8-sig')

注意!

        基日和发布日都是以指数列表的第一个指数为基准的,因为对比分析要保证区间段一致。

结果如下:

①指数区间涨跌幅对比

指数简称今年以来近6个月近一年近两年近三年近五年近十年基日以来发布以来
000001.SH上证指数1.35-3.85-8.06-12.91-14.082.5246.632915.172170.46
000300.SH沪深3002.48-7.23-13.6-23.26-34.12-4.1861.36167.09167.09

②指数区间最大回撤对比

指数简称今年以来近6个月近一年近两年近三年近五年近十年基日以来发布以来
000001.SH上证指数-8.93-14.95-20.41-22.55-27.27-27.27-52.3-78.27-78.27
000300.SH沪深300-6.1-17.39-23.6-31.17-41.68-45.25-46.7-72.3-72.3
(2)区间年化夏普比率数据对比
    Indicators_list = ['sharpe']
    Indicators_name = ['Sharpe(年化)']
    for index,Indicators in enumerate(Indicators_list):
        index_data_all = pd.DataFrame()
        error_code, index_name = w.wss(IndexCode, "sec_name",usedf=True)
        index_data_all.index = IndexCode.split(',')
        index_data_all['指数简称'] = index_name['SEC_NAME']
        for index2,date in enumerate(date_list):
            Code = "startDate=" + date + ";endDate=" + EndDate + ';period=2;returnType=1;yield=1'
            error_code, index_data =  w.wss(IndexCode,Indicators,Code,usedf=True)  #导出所需的相关指标  
            index_data.columns = [Time_list[index2]]
            index_data_all = pd.concat([index_data_all,index_data],axis=1)
            index_data_all = index_data_all.round(2)
        # 导出表格为csv
        csv_name = '指数' + Indicators_name[index] + '对比.csv'
        index_data_all.to_csv(csv_name,encoding='utf-8-sig')

结果如下:

①指数Sharpe(年化)对比

指数简称今年以来近6个月近一年近两年近三年近五年近十年基日以来发布以来
000001.SH上证指数0.35-0.53-0.75-0.5-0.41-0.010.230.40.39
000300.SH沪深3000.58-1.01-1.06-0.77-0.88-0.070.28

(五)函数调用

IndexCode = "000001.SH,000300.SH"  #把需要着重显示的放在第一个,就是红色
StartDate = '20190301'
EndDate = '20240229'
color_list = ['r','b'] #颜色列表元素数量应与IndexCode中的指数数量一致
get_ClosePrice_increase(IndexCode,StartDate,EndDate)

三、总结

        以上就是一个简单的windpy导出数据,用python做数据处理和可视化的应用实例,其实还可以进一步做优化,比如把数据对比也做一个可视化展示,做个对比柱状图之类的,需要的话可以画出来~

        之后还将持续优化、更新,还有其他的分析实例也将再发出来~

1 WINDPY接口说明 ................................................................................................. 1 1.1 WINDPY接口概述 ............................................................................................... 1 1.2 WINDPY接口安装 ............................................................................................... 2 1.2.1 WindPy对系统环境要求 ............................................................... 2 1.2.2 Python环境安装 .......................................................................... 2 1.2.3 正常WindPy接口安装 .................................................................. 3 1.2.4 特殊安装WindPy方式 .................................................................. 6 1.3 接口向导界面 ..................................................................................................... 6 1.4 WINDPY获取帮助途径 ....................................................................................... 7 1.4.1 本用户手册 .................................................................................... 7 1.4.2 量化交易群和R语言交流群 ........................................................... 7 1.5 WINDPY接口相关规范 ....................................................................................... 1 1.5.1 以下所有命令都有如下假设 ........................................................... 1 1.5.2 命令区分大小写,且“w.”不能省略 ............................................... 1 1.5.3 中文以及单字节码和双字节码的问题 ............................................. 1 1.5.4 品种、指标、参数等引号内的部分不区分大小写 ........................... 1 1.5.5 参数支持list输入 ...................................................................... 1 1.5.6 时间、日期支持Python语言的时间、日期格式 ........................... 2 1.5.7 参数中有缺省值的可以不用输入 .................................................... 2 1.5.8 可以带参数名输入 ......................................................................... 2 精于数据,一直进步 IV 1.5.9 Showblank参数 ........................................................................... 3 1.5.10 交易接口中Showfields参数................................................ 3 1.5.11 ErrorCode定义 .................................................................... 3 2 WIND PY插件命令说明 ....................................................................................... 1 2.1 FROM WINDPY IMPORT *:装载WINDPY包 ..................................................... 1 2.2 W.START:启动WINDPY ..................................................................................... 1 2.3 W.STOP:停止WINDPY ....................................................................................... 2 2.4 W.ISCONNECTED:判断是否已经登录 .............................................................. 2 2.5 W.CANCELREQUEST:取消订阅 .......................................................................... 2 2.6 W.WSD:获取历史序列数据 .............................................................................. 3 2.7 W.WSI:获取分钟数据 ...................................................................................... 3 2.8 W.WST:获取日内TICK级别数据 .................................................................... 4 2.9 W.WSS:获历史截面数据 .................................................................................. 5 2.10 W.WSQ:获取和订阅实时行情数据 ................................................................. 5 2.11 W.WSET:获取板块、指数等成分数据 ........................................................... 6 2.12 W.WEQS:获取条件选股结果 ............................................................................ 7 2.13 W.WPF:获取资产管理、组合管理数据 ......................................................... 7 2.14 交易相关函数 ..................................................................................................... 8 2.14.1 w.tlogon交易登录 ............................................................... 8 2.14.2 w.tlogout交易登出 ............................................................. 9 2.14.3 w.torder委托下单 ............................................................. 10 2.14.4 w.tcancel撤销委托 ........................................................... 11 精于数据,一直进步 V 2.14.5 w.tquery交易查询 ............................................................. 12 2.15 W.TDAYS, W.TDAYSOFFSET,W.TDAYSCOUNT:日期函数 ............................... 14 2.15.1 w.tdays:返回区间内的日期序列 ....................................... 14 2.15.2 w.tdaysoffset:返回某个偏移值对应的日期 ................... 14 2.15.3 w.tdayscount:返回某个区间内日期数量 ......................... 15 3 WINPY插件函数体说明........................................................................................ 1 3.1 日期序列(WSD)................................................................................................. 1 3.2 历史截面数据(WSS) ........................................................................................ 3 3.3 分钟序列(WSI)................................................................................................. 3 3.4 日内跳价(WST)................................................................................................. 4 3.5 实时数据(WSQ)................................................................................................. 5 3.6 数据集(WSET) ..............................................
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值