颜值即正义

这是一张顶流投行都在使用的美股看板。

如果发到朋友圈,是不是瞬间甩周围人十八条街。

 

它甚至还是可以交互的。

使用 Python 创建股票市场热图

热图显示了相当多的信息:

  • 公司分布在不同的行业
  • 方框的大小代表每家公司的市值
  • 每只股票的颜色代表前一天股价的变化
  • 交互式并允许放大和缩小

python的库

我们将使用以下三个库:pandasyfinanceplotly

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

生成的数据框如下所示:

使用 Python 抓取 S&P 500 公司信息
使用 Python 抓取 S&P 500 公司信息

使用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()

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部