大数跨境

全民量化时代,随笔学习1

全民量化时代,随笔学习1 通信干货
2026-10-31
4
导读:读入一张股价数据表,把第一列日期变成计算机认识的"时间索引",然后把每只股票的走势画出来
读入一张股价数据表,把第一列日期变成计算机认识的"时间索引",然后把每只股票的走势画出来。我用的数据长这样:第一列是日期,从 2026 年 9 月 1 日到 10 月 28 日共 36 个交易日,后面 10 列是 10 只 A 股的收盘价——华天科技、峨眉山A、美能能源、国科军工、大洋电机、华尔泰、山煤国际、中谷物流、中国石油、湖南天雁。


数据有了,接下来就是课程开头那段固定代码。以前我都是直接抄,这次决定逐行搞懂。

pythonimport warningswarnings.filterwarnings("ignore")import numpy as npimport pandas as pdimport matplotlib.pyplot as pltplt.style.use('seaborn')%matplotlib inline

翻译成大白话:前两行是让 Python"别唠叨",运行警告不弹出来,对结果没有任何影响;`import numpy as np` 是搬来一台计算器,专门做数字运算;`import pandas as pd` 是搬来一位 Excel 高手,专门处理表格;`import matplotlib.pyplot as plt` 是搬来一支画笔,负责画图;`plt.style.use('seaborn')` 只是给图选个好看的皮肤;最后的 `%matplotlib inline` 是让图直接贴在代码下方显示。所谓"导入安装包",其实就是开工前把工具箱搬上桌,并没有那么神秘。

不过,真正让我学到东西的,是照抄过程中踩的四个坑。费曼学习法有个说法:讲不清楚、做不顺利的地方,就是你知识的漏洞。我把它们全记下来了。

第一个坑是 `plt.style.use('seaborn')` 直接报错。查了一下,新版 matplotlib 把这个样式名改了,要写成 `'seaborn-v0_8'`;如果还报错,干脆删掉这行,不影响分析。第二个坑是 `%matplotlib inline` 在 PyCharm 里报 SyntaxError——这一行根本不是 Python 语言,而是 Jupyter 专属的魔法命令,换到 PyCharm 必须删掉。第三个坑更隐蔽:图弹不出来、数据也不显示。原来 Jupyter 很"贴心",写个变量名就显示表格,写完 plot 就出图;而 PyCharm 里一切都要明说,看数据要写 `print(data.head())`,画图结尾必须加 `plt.show()`。第四个坑是 FileNotFoundError,找不到表格文件。代码里只写文件名时,Python 只会在脚本所在的文件夹里找,所以最简单的办法就是把 Excel 和 .py 文件放进同一个文件夹;不确定脚本在哪,就加一行 `import os; print(os.getcwd())` 让它自己告诉你。

踩完这四个坑,就有了下面这份最终版代码,PyCharm 里复制即可运行:

pythonimport warningswarnings.filterwarnings("ignore")import numpy as npimport pandas as pdimport matplotlib.pyplot as pltplt.style.use('seaborn-v0_8')plt.rcParams['font.sans-serif'] = ['SimHei']   # Windows 中文显示plt.rcParams['axes.unicode_minus'] = False# 1:读取数据,以时间为索引data = pd.read_excel('A股收盘价_20260901-20261028.xlsx', index_col='日期')

# 2:将时间转换成标准格式
data.index = pd.to_datetime(data.index)

# 查看数据
print(data.head())print(data.info())

# 3:绘制各指标走势
data.plot(figsize=(12, 6))plt.title('A股收盘价走势(2026-09-01 至 2026-10-28)')plt.ylabel('收盘价(元)')plt.show()

# 每只股票单独一个小图
data.plot(subplots=True, layout=(5, 2), figsize=(14, 16), legend=False)plt.suptitle('各股票收盘价走势')plt.tight_layout()plt.show()

代码跑通只是开始,先读图,再谈分析。第一张合并图一出来,立刻暴露了一个典型问题:


国科军工股价在 40 到 52 元,其余 9 只大多在 6 到 16 元。画在同一个坐标系里,低价股全被压成了"地板上的直线",什么波动都看不出来。这正是数据可视化里的常见陷阱:量纲差异太大的东西,不要硬画在一起。解决办法也简单,让每只股票单独占一个小图。


截至目前,工作台就长下图这样


如果想要表格信息在工作台输出,只需要一行,加上print前缀,保留两位小数,就能统计出多少数据,平均股价,最大最小值等重要数据

print(data.describe().round(2))


如果只想要最小值和最大值,可以采用aggregate,具体写法如下:

print(data.aggregate([min, max]))


接下来要分享的是显示每一天收盘价的差值,其中head()表示只显示前5行

print(data.diff().head())


当然,运用mean去求出平均差价也是可以的,加个后缀就行

print(data.diff().mean())


当然,实战中我们更多聊的是个股收益率,也就是当日收盘价-昨日收盘价,再除以昨日收盘价,python中也有现成的函数,pct_change,同样只看前5行的,这里留个3位小数,具体代码如下:

print(data.pct_change().head().round(3))


可以看到第一个圈住的是-0.028,实际运算就是(16.05-16.52)/16.52



接下来把10只个股涨幅一平均,再画张图,以柱状图的形式输出,代码如下:

(data.pct_change().mean() * 100).plot(kind='bar', figsize=(10, 6))plt.ylabel('日均收益率(%)')plt.show()




如果觉得自己画的颜色太单调,可以加点参数,在第二行中用条件去区分red和green两种情况,变更后如下:

mean_ret = data.pct_change().mean() * 100colors = ['red' if v > 0 else 'green' for v in mean_ret]mean_ret.plot(kind='bar', figsize=(10, 6), color=colors)plt.ylabel('日均收益率(%)')plt.show()



接下来的一段代码是统计1元起始资金到如今的含金量,apply(np.exp)负责对解压还原。

rets = np.log(data / data.shift(1))rets.cumsum().apply(np.exp).plot(figsize=(10, 6))plt.ylabel('净值(元)')plt.title('1元钱持有到现在的净值')plt.show()

从这图中可以看到最后是天洋电机更值钱!


刚才更新了我的原始表格,这次从2024年开始统计


需要这个原始表格赞赏任意金额,一起探讨,我们下期继续分享!

【声明】内容源于网络
0
0
通信干货
1234
内容 3434
粉丝 0
通信干货 1234
总阅读118.3k
粉丝0
内容3.4k