我的Python心路历程 第十期 (10.1 实践实例之股票数据分析)

背景

今日我的Python心路历程是 实践实例之股票数据分析)

方案

针对参考1中的代码进行实践,其中有几点体会和问题的处理。
首先,导入pandas库,详见参考2。

其次,准备数据,可以自己制作假数据,也可以从网上下载已有数据。
如下数据进行测试:
在这里插入图片描述

将datadir和fname适配为自己的,编译发现无法识别中文,故此将标题改为代码中的对应英文标题。
在这里插入图片描述

一步步开始调试代码,到第四步是出现编译异常,如下:
在这里插入图片描述

根据提示更改为如下代码:

# 最大年均复合增长率
print('4.2 最大年均复合增长率')
min_date = adj_price.idxmin()
max_date = adj_price.idxmax()
print(max_date.year)
print(min_date.year)

max_growth_per_year = total_max_growth ** (1.0 / (max_date.year - min_date.year))
print(max_growth_per_year)

编译时发现又一个问题,计算max_growth_per_year时的分母max_date.year - min_date.year为0,调整数据,将Adj Close列的数据从小到大序列化(更改为模拟数据,因为真实数据只有2019年的,故此导致max_date.year和min_date.year均为2019)。
在这里插入图片描述

最后,经过以上调整之后所有代码可以成功编译,运行也未出错,结果如下:
在这里插入图片描述

但是,out2的图表matplotlib.pyplot示意并没有出来,肿么办呢?

通过参考3的方法测试发现图像是可以显示出来的,测试代码如下:

import numpy as np
import matplotlib.pyplot as plt
 
 
def main():
    # 线的绘制
    x = np.linspace(-np.pi, np.pi, 256, endpoint=True)
    c, s = np.cos(x), np.sin(x)
    # 绘制
    plt.figure(1)
    # 自变量 因变量
    plt.plot(x, c)
    # 自变量 因变量
    plt.plot(x, s)
    plt.show()
    plt.savefig("one.png")
 
if __name__ == "__main__":
    main()

经过初步分析,发现是不是因为没有main函数导致的呢?不应该啊,添加main函数后依旧不现实图像,仔细研读以上测试成功的代码发现少了一句plt.show(),增加后果然应验,效果如下图所示:

在这里插入图片描述

对应代码为:

# coding=UTF-8

import os
import matplotlib.pyplot as plt

def main():
    x = [0, 10]
    y = [0, 1000]

    lines = plt.plot(x, y)
    # use keyword args
    plt.setp(lines, color='r', linewidth=2.0)

    **plt.show()**


if __name__ == "__main__":
    main()

果不其然,少了这句就是无法显示Pycharm Matplotlib 图像。

附采用历史数据产生效果如下所示:
在这里插入图片描述

附所有代码如下(更新后):

# coding=UTF-8

import pandas as pd
import numpy as np
import os
import matplotlib.pyplot as plt

# 股票数据分析,前提是对应的数据已经下载,如SZ#300790.csv


#获取绝对路径,300790-300999为当前文件夹
datadir = os.path.join(os.path.dirname(__file__), '300790-300999')
fname = '00001.csv'
data = pd.read_csv(os.path.join(datadir, fname), index_col='Date', parse_dates=True)

def gpbase0():
    # 分析波动幅度
    print('1.分析波动幅度')
    print(data)

    # 使用 resample 针对复权收盘价进行重采样
    print('2.使用 resample 针对复权收盘价进行重采样')
    adj_price = data['Adj Close']
    print(adj_price)

    resampled = adj_price.resample('m').ohlc()
    print(resampled)
    print((resampled.high - resampled.low) / resampled.low)


def growth3():
    ## 增长曲线
    print('3.增长曲线')
    adj_price = data['Adj Close']
    adj_price.plot(figsize=(8, 6))
    print(data.head())

def growth4():
    #获取列族'Adj Close'
    adj_price = data['Adj Close']

    ## 增长倍数
    print('4.增长倍数')
    ### 最高增长倍数
    print('4.1 最高增长倍数')
    total_max_growth = adj_price.max() / adj_price.min()
    print(total_max_growth)

    # 最大年均复合增长率
    print('4.2 最大年均复合增长率')
    min_date = adj_price.idxmin()
    max_date = adj_price.idxmax()
    print(max_date.year)
    print(min_date.year)

    max_growth_per_year = total_max_growth ** (1.0 / (max_date.year - min_date.year))
    print(max_growth_per_year)

def growth5():
    #获取列族'Adj Close'
    adj_price = data['Adj Close']

    ## 当前增长倍数及复合增长率
    print('5.当前增长倍数及复合增长率')
    ### 当前平均增长倍数
    print('5.1 当前平均增长倍数')
    total_growth = adj_price.iloc[0] / adj_price.iloc[-1]
    print(total_growth)

    ### 年复合增长倍数
    print('5.2 年复合增长倍数')
    old_date = adj_price.index[-1]
    now_date = adj_price.index[0]
    growth_per_year = total_growth ** (1.0 / (now_date.year - old_date.year))
    print(growth_per_year)

    ### 平均年化增长率
    print('5.3 平均年化增长率')
    price_in_years = adj_price.to_period(freq='A').groupby(level=0).first()
    print(price_in_years)
    #print(price_in_years.plot(figsize=(8,6)))

    diff = price_in_years.diff()
    rate_in_years =  diff / (price_in_years - diff)
    print(rate_in_years)
    print(rate_in_years.mean())

    rate_in_years.plot(kind='bar', figsize=(8,6))
    X = [0, len(rate_in_years)]
    Y = [0, 0]
    plt.plot(X, Y, color='red', linestyle='-')

    #不增加该代码的话,Pycharm Matplotlib 图像不显示
    plt.show()

def main():
    growth5()

if __name__ == "__main__":
    main()

参考:

1、python数据科学(十三):实例——股票数据分析
2、我的Python心路历程 第七期 (PyCharm配置第三方库)
3、Pycharm Matplotlib 图像不显示问题

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值