颜值即正义
这是一张顶流投行都在使用的美股看板。
如果发到朋友圈,是不是瞬间甩周围人十八条街。
它甚至还是可以交互的。
热图显示了相当多的信息:
- 公司分布在不同的行业
- 方框的大小代表每家公司的市值
- 每只股票的颜色代表前一天股价的变化
- 交互式并允许放大和缩小
python的库
我们将使用以下三个库:pandas、yfinance和plotly。
pip install pandas yfinance plotly
获取股票数据
在此示例中,我将与从 S&P 500 公司中随机选择的 100 家公司合作。
获取 S&P 500 公司名单
此维基百科页面包含标准普尔 500 强公司。该列表采用表格格式,因此我们可以使用pandas.read_html直接抓取该信息。
请注意,有两个表,我们只需要第一个表。
import pandas as pd
sp500 = pd.read_html(r'https://en.wikipedia.org/wiki/List_of_S%26P_500_companies')[0]['Symbol']
下载个股资料
我们将使用yfinance库下载股票信息。
我们对以下信息感兴趣:
- 股票行情(已从维基百科获得)
- 公司部门
- 公司市值
- 股价变动(较前一交易日)
我们将初始化一些列表来存储上述信息:
tickers = []
deltas = []
sectors =[]
market_caps = []
然后我们将循环遍历 sp500 列表(其中包含 100 家随机选择的公司)并下载相关信息。
for ticker in sp500:
try:
## create Ticker object
stock = yf.Ticker(ticker)
tickers.append(ticker)
## download info
info = stock.info
## download sector
sectors.append(info['sector'])
## download daily stock prices for 2 days
hist = stock.history('2d')
## calculate change in stock price (from a trading day ago)
deltas.append((hist['Close'][1]-hist['Close'][0])/hist['Close'][0])
## calculate market cap
market_caps.append(info['sharesOutstanding'] * info['previousClose'])
## add print statement to ensure code is running
print(f'downloaded {ticker}')
except Exception as e:
print(e)
请注意,yfinance库直接从雅虎财经网站抓取,速度可能相当慢。我们在代码中包含了一条print语句来显示消息,这样我们就可以看到代码正在运行而不是冻结。因此,这取决于您要下载多少家公司。要获取所有 S&P 500 公司,我建议您在后台运行代码,同时做其他事情。
如果您只想要 S&P 500 公司的子集,则 pandas.sample ()方法可以快速从 S&P 500 公司列表中选择一些随机样本。例如,sample(100) 将返回 100 个随机样本。
sp500 = sp500.sample(100)
使用 Python Plotly 绘制股票热图
现在我们已经掌握了所有信息,是时候在绘图之前进行一些数据处理了。
数据准备
首先,我们将所有数据放入 pandas 数据框中。
df = pd.DataFrame({'ticker':tickers,
'sector': sectors,
'delta': deltas,
'market_cap': market_caps,
})
然后,我们将根据股票价格的变化(即增量)将数据分为不同的组。这是为了给每个公司分配不同的颜色。
我选择了一些任意阈值:-100%、-2%、-1%、0%、1%、2% 和 100%。您可以选择任何适合您需求的乐队。
然后我们使用pd.cut方法对数据进行分箱。我们还根据 bin 分配颜色名称:
color_bin = [-1,-0.02,-0.01,0, 0.01, 0.02,1]
df['colors'] = pd.cut(df['delta'], bins=color_bin, labels=['red','indianred','lightpink','lightgreen','lime','green'])
df
生成的数据框如下所示:

使用plotly.express 绘图
plotly 库提供了两种不同的绘图类(和 API)。更简单的一种称为plotly.express,更高级的称为plotly.graph_objects。对于这个演示,我们将使用plotly.express。我们将在另一篇教程中讨论如何使用plotly.graph_objects,因为这需要更多的准备工作。
Plotly 有一个热图,但这不是我们要使用的!
相反,我们将使用树形图,这对于可视化分层数据(例如公司及其部门)很有帮助。
注意我们需要指定:
- 分层数据结构的路径参数。
- value参数决定每个框的大小。
- 颜色参数告诉函数在哪个数据帧列(即“颜色”列)中查找颜色信息。
- color_discrete_map参数是一个字典,它将每个颜色值(在“颜色”列中)映射到可以通过绘图呈现的颜色名称。
- 最后但并非最不重要的一点是,hover_data参数有助于格式化工具提示上的文本。即将小数转换为百分比。
import plotly.express as px
fig = px.treemap(df, path=[px.Constant("all"), 'sector','ticker'], values = 'market_cap', color='colors',
color_discrete_map ={'(?)':'#262931', 'red':'red', 'indianred':'indianred','lightpink':'lightpink', 'lightgreen':'lightgreen','lime':'lime','green':'green'},
hover_data = {'delta':':.2p'}
))
fig.show()
发表评论 取消回复