Advertisement

(转)python+Windpy做金融数据分析

阅读量:

作者:瓜瓜南南

一、windpy+python初步想法

Wind具备Python接口功能,并能提取相关金融数据;该Python接口功能特别适合用于提取大量数据或需查看不同时间段的数据情况;尤其是当存在定期更新数据需求时,在这种情况下使用Python解决方案会比Excel更加便捷

经过一番研究后发现 Windpy 应用的相关信息较少。本人希望能够从基础数据导出的角度出发,在此基础上利用 Python 完成对金融数据的进一步处理与分析,并最终完成其可视化展示。

本研究是开篇之作,在完成单一或多支指数在分析区间内涨跌幅轨迹(折现图)的同时,并对各时间段的涨跌幅变化情况进行了详细记录,并列出了最大回撤与年化夏普比率对比表

二、思路和代码展示

(一)导入相关的库

最初阶段遇到了一系列的问题:字符编码导致的文字显示异常、字体设置不当导致的显示不规范以及坐标轴为负值时的数值符号渲染失真等问题。通过以下代码实现了一系列的有效解决方案

复制代码
 # 设置输出格式为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()
    
    
    
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-16/1nemyiGDPcSjLoHAZK8MRtskvJQf.png)

# 设置输出格式为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['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

Closing Price Increase = ((Current Closing Price - Initial Closing Price) / Initial Closing Price) * 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'

six_months_ago = (parse(EndDate) - relativedelta(months=6) + relativedelta(days=1)).strftime('%Y%m%d') # 六个月前

ComputedDate = (parse the End Date - one year + a day).strftime('%Y%m%d') # one year ago

TwoYrAgo = (parse(endDate) - relativedelta(years=2, days=-1)).strftime('%Y%m%d') #时间戳

ThreeYearsAgo = (get_parsed_end_date() subtracting three years plus one day).strftime('%Y%m%d') # Three Years Ago

five_years_ago = (parse_date(endDate) - datetime.timedelta(days=5) + datetime.timedelta(days=1)).strftime('%Y%m%d') # five years ago

ten_years_before = (parse(end_date) - relativedelta(years=10) + relativedelta(days=1)).strftime('%Y%m%d') # Ten years ago

error code, base date = w.wss([{index_code}], "base date", used= 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 = [年初, 六年前, 一年前, 两年前, 三年前, 五年前, 十年以前,basedate, 发布日期]

Time_list = ['自今年以来','过去六个月','最近一年','过去两年','过去三年','过去五年','过去十年' , '自基日以来' , '从发布以来']

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 作为用于获取相关指标的结果

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.08 2.52 46.63 2915.17 2170.46
000300.SH 沪深300 2.48 -7.23 -13.6 -23.26 -34.12 -4.18 61.36 167.09 167.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.01 0.23 0.4 0.39
000300.SH 沪深300 0.58 -1.01 -1.06 -0.77 -0.88 -0.07 0.28

(五)函数调用

复制代码

IndexCode = "000001.SH,000300.SH" #把需要着重显示的放在第一个,就是红色

StartDate = '20190301'

EndDate = '20240229'

color_list = ['r','b'] #颜色列表元素数量应与IndexCode中的指数数量一致

get_ClosePrice_increase(IndexCode,StartDate,EndDate)

三、总结

这可能是一个简单的windpy导出数据示例。通过Python进行数据分析与可视化处理的应用实例也是一个常见案例。实际上还可以进一步优化和完善这一流程。例如将数据对比分析纳入可视化展示,并制作一个对比柱状图等可视化形式以供参考。如果需要更详细的分析则可以考虑扩展这一部分的内容

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

全部评论 (0)

还没有任何评论哟~