案例:金融数据分析----code详解版
1.引言
金融案例分析是金融领域研究的重要组成部分,可以帮助人们深入理解金融市场中的运作和交易流程,分析金融风险和机会,制定投资和风险管理策略等。本篇文章将以Python为工具,介绍一种基于Python的金融案例分析方法,以帮助读者更好地理解金融领域知识。
1.1案例分析目标
本篇文章的案例分析目标是,以股票市场为例,介绍如何利用Python进行金融数据分析。具体包括:
- 1.利用Python获取股票数据;
- 2.对股票数据进行数据清洗和处理;
- 3.利用Python进行股票数据可视化;
- 4.利用Python进行股票市场分析和预测。
1.2涉及知识点
本篇文章的案例分析将涉及以下知识点:
- 1.Python基础语法;
- 2.数据清洗和处理;
- 3.数据可视化;
- 4.机器学习基础。
1.3案例分析流程
本篇文章的案例分析流程包括以下步骤:
- 1.加载包:代码的第一部分是加载数据分析过程中所需要的包,具体加载方法可参见2.4.4包的导入
- 2.数据获取:利用Python获取股票数据,并对数据进行存取,数据的存取见3.python数据的存取;
- 3.数据清洗和处理:对股票数据进行数据清洗和处理,包括缺失值处理、异常值处理、数据标准化等,常用的操作命令见5.dataframe数据清洗;
- 3.数据可视化:利用Python进行股票数据可视化,相关知识点见8.dataframe数据可视化;
- 4.建立模型:利用Python建立股票市场分析和预测模型;
- 5.模型评估和优化:对模型进行评估和优化;
- 6.结论和展望:对案例分析结果进行结论和展望。
下面将分别介绍每个步骤的具体实现。
2.数据获取
涉及知识点:
- 第三方包的安装2.4.3包的安装
- 包或模块的加载2.4.4包的导入
- 查看变量类型1.1查看变量类型:type(变量名)
- 查看dataframe数据3.1查看前/后n行
- 保存dataframe数据3.1.4 保存Dataframe
2.1安装tushare库
首先需要安装tushare库。可以在命令行中运行以下命令来安装:
pip install tushare
2.2获取Token
使用tushare需要申请Token,申请方法如下:
访问tushare官网,注册账号并登录
在个人中心页面获取token
2.3导入tushare库并设置Token
导入tushare库并设置Token,代码如下:
import tushare as ts
ts.set_token('你的Token')
2.4获取数据
以获取中国平安(601318.SH)2015年至今的股票数据为例,代码如下:
import tushare as ts #加载包
import pandas as pd
import numpy as np
from pylab import mpl
import matplotlib.pyplot as plt
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False
ts.set_token('填入你自己的Token!!!!!')# 设置Token
pro = ts.pro_api()# 初始化pro接口
df = pro.daily(ts_code='601318.SH', start_date='20150101')# 获取中国平安(601318.SH)2015年至今的股票数据
print(df.head())# 打印前5行数据
以上代码实现的功能是从tushare获取中国平安(601318.SH)2015年至今的股票数据,并打印前5行数据。
2.6保存数据
df.to_csv('./data/sh601318.csv', index=False)
- 需要注意的是,tushare的数据接口有一定的限制,包括每天请求次数和请求数据量等。如果需要更多数据,可以考虑购买tushare的付费服务。
3.数据预处理
涉及知识点:
在获取了股票数据后,我们需要对数据进行清洗和处理,以保证后续分析的准确性。具体实现代码如下:
3.1读取已有数据
import pandas as pd
# 读取CSV文件
df = pd.read_csv('./data/sh601318.csv')
# 查看数据基本信息
print(df.info())
3.2清理数据
#删除不需要的列
df.drop(['ts_code'], axis=1, inplace=True) # 删除code列
#重命名dataframe数据列名
df.rename(columns={
'trade_date':'Date', 'open':'Open', 'close':'Close', 'high':'High', 'low':'Low', 'volume':'Volume'}, inplace=True) # 重命名列
#将dataframe时间列由int转换为datetime格式
df['Date'] = pd.to_datetime(df['Date'], format='%Y%m%d') # 将Date列转换为datetime格式
#设置索引列
df.set_index('Date', inplace=True) # 将Date列设为行索引
#按指定列的升序/降序排列
df.sort_index(inplace=True) # 按日期排序
#保存已处理完毕的数据
df.to_csv('./data/sh601318_processed.csv')
# 从某dataframe中提取一个只包含某些列的子数据框
df_601318 = df[['Close']]
df_601318.head()
如果是下次重新分析,可考虑通过读取已处理好的数据开始后续分析:
import pandas as pd
df = pd.read_csv('./data/sh601318_processed.csv')
df_601318 = df[['Close']]
# 将Date列转换为datetime格式
df_601318.index = pd.to_datetime(df_601318.index, format='%Y-%m-%d')
print(df_601318.head())
4.数据可视化
涉及知识点:
- 3.2选择DataFrame中的某列/某行:
- dataframe数据可视化8.2使用matplotlib库
- 绘图时中文字符及其它设定 2.plt.rcParams属性总结 2.font.family 9.axes.unicode_minus
数据可视化是金融分析的重要手段,可以帮助我们更好地理解数据特征和趋势。在Python中,dataframe数据的可视化可参见(dataframe数据可视化)。具体实现代码如下:
import matplotlib.pyplot as plt
# 绘制中国平安收盘价折线图
plt.figure(figsize=(15, 6))
plt.plot(df_601318['Close'])
plt.title('ZGPA Closing Prices')
plt.xlabel('Date')
plt.ylabel('Price')
plt.show()
上述绘图中的图标题,以及横纵坐标或图例的标签均是英文,若将其直接改成中文则无法显示,需要设置绘制时的字符,具体实现如下:
# 如前面已加载过相同的包,此处可省略下面包的加载代码
import matplotlib.pyplot as plt
#中文字符设定 plt.rcParams属性总结
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
# 绘制中国平安收盘价折线图
plt.figure(figsize=(15, 6))
plt.plot(df_601318['Close'])
plt.title('中国平安收盘价格')
plt.xlabel('日期')
plt.ylabel('收盘价')
plt.show()
5.基本走势分析
涉及知识点:
- 描述性统计分析6.2统计运算
- 移动平均\标准差计算7.6移动窗口函数
- dataframe数据可视化8.2使用matplotlib库
- 绘图时中文字符及其它设定 2.plt.rcParams属性总结 2.font.family 9.axes.unicode_minus
5.1描述性统计分析
进行金融案例分析时,描述性统计分析是非常重要的,它可以帮助我们更好地理解数据的基本特征和趋势。在Python中,我们可以使用pandas库来进行描述性统计分析。具体实现代码如下:
# 描述性统计分析
print(df_601318.describe())
5.2历史走势分析
- 计算每日收益率
# 计算每日收益率
df_601318['daily_return'] = df_601318['Close'].pct_change()
df.pct_change()
是一个Pandas DataFrame方法,用于计算每个元素与前一个元素之间的百分比变化。用股票收盘价计算得到的便是某股票的每日收益率,其数学表达式为:
( d f − d f . s h i f t ( 1 ) ) / d f . s h i f t ( 1 ) (df - df.shift(1)) / df.shift(1) (df−df.shift(1))/df.shift(1)
其中, d f . s h i f t ( 1 ) df.shift(1) df.shift(1)表示将DataFrame向下移动1行,以便计算当前元素与前一个元素之间的变化。然后,用当前DataFrame减去向下移动后的DataFrame,再除以向下移动后DataFrame,即可得到每个元素与前一个元素之间的百分比变化。
- 计算移动平均收盘价
# 计算移动平均线
df_601318['ma5'] = df_601318['Close'].rolling(5).mean()#周平均收盘价
df_601318['ma10'] = df_601318['Close'].rolling(10).mean()#半月平均收盘价
df_601318['ma20'] = df_601318['Close'].rolling(20).mean()#月平均收盘价
- 计算月平均收益率的布林带
# 计算月平均收益率的布林带-95%的置信区间
df_601318['std20'] = df_601318['Close'].rolling(20).std()
df_601318['upper_band20'] = df_601318['ma20'] + 2 * df_601318['std20']
df_601318['lower_band20'] = df_601318['ma20'] - 2 * df_601318['std20']
- 可视化操作
#中文字符设定
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.rcParams 的属性是全局生效的,因此一般建议在程序开头设置一次即可
。
# 绘制收益率曲线
df_601318['daily_return'].plot(figsize=(10,6))
plt.title('中国平安日度收益率')
plt.xlabel('日期')
plt.ylabel('收益率')
plt.show()
# 绘制收益率的直方图
df_601318['daily_return'].hist(bins=50, figsize=(10,6))
plt.title('Distribution of Daily Return of ZGPA')
plt.xlabel('Return')
plt.ylabel('Frequency')
plt.show()
# 绘制移动平均线和布林带
plt.figure(figsize=(10,6))
plt.plot(df_601318['Close'])
plt.plot(df_601318['ma5'])
plt.plot(df_601318['ma10'])
plt.plot(df_601318['ma20'])
plt.plot(df_601318['upper_band20'])
plt.plot(df_601318['lower_band20'])
plt.title('Moving Averages and Bollinger Bands of ZGPA')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend(['Close', 'MA5', 'MA10', 'MA20', 'Upper Band20', 'Lower Band20'])
plt.show()
6.周期效应分析
涉及知识点:
- 提取datetime索引的周期信息 7.11提取年、月、日等信息 1.
- 分组并求均值6.4聚合运算 (1)groupby运算
- 均值T检验3.2 独立样本 t 检验
基于上述数据,我们可以进行周期效应分析。在Python中,我们可以使用pandas库和statsmodels库来进行周期效应分析。具体实现代码如下:
6.1周度效应
6.1.1整体周效应分析
- Step1:整体周效应计算
# 将数据添加周标记
df_601318['Weekday']=df_601318.index.weekday
#全部数据按周几分组并计算周一至周五的平均收盘价
weekday_mean=df_601318.groupby('Weekday')['Close'].mean()
#周一至周五的均值与整体均值的比值
weekday_mean_ratio = weekday_mean / weekday_mean.mean()
#大于1表示高于均值,小于1低于均值
print(weekday_mean_ratio)
- Step2:整体周效应可视化
#绘制折线图
plt.figure(figsize=(10, 6))
plt.plot(weekday_mean_ratio.values)
plt.axhline(1.0, color='gray', linewidth=1)
plt.xticks(range(5), ['星期一', '星期二', '星期三', '星期四', '星期五'])
plt.title('中国平安周效应分析')
plt.xlabel('星期')
plt.ylabel('平均收盘价比值')
plt.show()
- Step3:整体周效应均值检验
from scipy.stats import ttest_ind
# 计算整体周效应的t检验 周一与周五有无显著差异
weekday_0 = df_601318[df_601318['Weekday'] == 0]['Close']
weekday_4 = df_601318[df_601318['Weekday'] == 4]['Close']
t, p = ttest_ind(weekday_0, weekday_4, equal_var=False)
print('t-test between Monday and Friday: t = {:.4f}, p = {:.4f}'.format(t, p))
6.1.2年度周效应分析
- Step1:年度周效应计算
# 将数据添加年度标记
df_601318['Year'] = df_601318.index.year
#计算每年周一至周五各自的平均收盘价
year_weekly_df