使用streamlit实现pdf预览 (用streamlist搭建网站)

在应用程序中输入股票代码并让它完成工作,还可以在线部署网络应用程序

在之前的文章中,我详细解释了如何轻松获取股票数据,对其进行分析并使用PyPortfolioOpt 库优化投资组合以获得最大夏普比率。今天,我们将扩展那篇文章并将所有内容放在一个网络应用程序中。我鼓励您阅读这篇文章,以了解有关一切工作原理的更多详细信息。

streamlit股票数据,使用stream流创建线程是不是很好

照片由Chris Liverani在Unsplash上拍摄

在本文中,我们将使用 Streamlit从用户输入的股票代码构建一个投资组合优化仪表板 Web 应用程序。它还将在仪表板上显示其性能。然后,如果您愿意,我们将介绍如何将其部署到云中。最终产品部署在此处,部分屏幕截图如下所示。

streamlit股票数据,使用stream流创建线程是不是很好

股票优化器仪表板 Web 应用程序的部分屏幕截图。图片由作者提供。

所有必需的代码都在这个GitHub 存储库中。在里面,您会找到一个 Jupyter Notebook(可选),其中详细介绍了我在上一篇文章中解释的投资组合优化步骤和股票分析。如果你愿意,可以随意玩弄它。Streamlit Web 应用程序的完整代码位于 “portfolio_optimization_streamlit” 文件夹中。让我们潜入水中!

1. 进口

首先,您需要创建一个 app.py 文件并添加导入。在此之前,请为 PyPortfolioOpt 库进行 pip 安装:pip install PyPortfolioOpt

这些库用于处理股票数据或在 Web 应用程序上显示数据。例如,该pandas_datareader库允许我们提取股票价格数据。该PyPortfolioOpt库(作为pypfopt导入)使我们能够轻松优化股票投资组合并执行数据可视化。Plotly允许我们创建交互式图表以放入我们的应用程序。

接下来,我们在下面添加 2 个函数:

  • 第一个函数允许我们获取股票价格的 DataFrame 并绘制它们的累积回报
  • 与其他随机生成的投资组合相比,第二个功能允许我们沿有效边界可视化投资组合的风险和回报。此代码取自 PyPortfolioOpt文档。随意浏览我的 GitHub 存储库中的 Jupyter Notebook 或上一篇文章以查看他们的输出。

2. 用户输入

代码的下一部分设置用户输入字段。我们让用户输入要包含在投资组合中的股票代码列表,以及分析投资组合的开始和结束日期

streamlit股票数据,使用stream流创建线程是不是很好

投资组合优化器应用程序的屏幕截图。图片由作者提供。

开始日期和结束日期的输入字段分为 2 列,默认开始日期为 2013/01/01(随意更改),默认结束日期为当前日期。这些分别存储在变量start_date中end_date。我们还要求用户输入一串用逗号分隔的股票代码,然后将其存储tickers_string并拆分为tickers列表。

3.错误处理

代码的下一部分是try, except处理错误的循环。如果用户输入了错误的股票代码,或者输入的符号格式错误(没有用逗号等分隔),try循环内的代码将不会运行。我们想要的最后一件事是在页面上显示一大块 python 错误输出。

相反,我们会显示一个漂亮的小提示,让用户以正确的格式输入正确的股票代码。这是在except下面的循环中完成的,如果在循环的任何部分遇到错误,该try循环就会运行。

4. 获取股票价格并生成图

应用程序的主要功能在try循环内。首先,我们获取股票价格并生成信息图来显示个股的表现。

  • 代码的第 2 行使用该pandas_datareader库方便地从网络上获取相关股票价格
  • 第 4 行负责绘制每只股票的价格与时间的关系
  • 第 6 行绘制了每只股票的累积收益,这样可以更公平地比较股票随时间的变化。
  • 然后第 8 行和第 9 行计算并绘制所有股票之间的相关矩阵。

请注意,我们实际上并没有像在 Jupyter Notebook 中那样显示绘图。我们将绘图存储在变量中,这些变量稍后将传递给相关的 Streamlit 函数,以便在 Web 应用程序上显示。

5.优化投资组合

这就是PyPortfolioOpt 库的魔力所在。下一段代码允许我们优化投资组合,获得每个成分股的权重,并在图表上可视化其风险和回报。如果您遇到以下任何想要详细探索的术语,请随时参考我之前的文章。否则,只要知道优化的投资组合是最大化预期回报风险比的投资组合就足够了。

  • 代码的第 2 行计算每只股票的平均年回报率,而第 3 行计算股票的协方差矩阵。不要太担心数学问题,这两个变量只是稍后需要作为投资组合优化器函数的输入。
  • 第 6 行使用我们之前从文档中获得的函数,与其他随机生成的投资组合相比,沿着有效前沿曲线绘制和可视化我们的投资组合的风险和回报。
  • 第 7 行和第 8 行将上面的图保存为png图像,以便 Web 应用程序稍后显示。
  • 第 11 行和第 12 行显示了使用api找到优化的投资组合是多么容易。PyPortfolioOpt只需创建一个EfficientFrontier对象并应用该max_sharpe方法即可找到具有最佳风险回报率的投资组合。我们还传入了无风险利率,它对应于我们在没有任何风险的情况下可以获得的回报率。我们通常使用美国国债收益率,目前约为 2%。请查看PyPortfolioOpt 文档中的其他优化方法。
  • 第 13 到 16 行允许我们提取单个股票的权重并将它们存储在 DataFrame 中,以及投资组合绩效的度量,例如平均年回报率波动率夏普比率

6. 生成优化的投资组合

现在我们有了投资组合权重,我们将每个权重与其对应的股票价格相乘,并将优化的投资组合作为附加列存储在我们之前创建的股票价格数据框中。这为我们提供了投资组合在该时间段内的历史表现。这是在下面代码的第 2 到 4 行中完成的。

如果我们一开始投资 100 美元,第 7 行绘制了优化投资组合随时间的回报表现。

7. 在 Streamlit 上显示所有内容

在这里,我们将所有图表和信息显示到 Web 应用程序中。下面的代码几乎是不言自明的。然而,我们正相反,因为用户可能希望先查看最终结果(即优化的投资组合回报和权重),然后再深入了解其他细节(股票之间的相关性,以及每只股票的表现)。

测试 Streamlit 应用程序

仅使用app.py文件,您可以通过在终端(在您的相关文件夹中)运行此命令,在浏览器上本地启动 Streamlit 应用程序。

流式运行 app.py

如果一切正常,您将看到以下输出。您现在可以在浏览器中输入本地 URL 来玩您的应用程序!

streamlit股票数据,使用stream流创建线程是不是很好

您还可以公开部署此应用程序供任何人使用。

将您的应用程序部署到 Herokuapp Cloud

我们将在终端中使用一些命令将您的应用程序部署到 Herokuapp 云。在此之前,您需要将 3 个文件添加到与app.py文件相同的文件夹中。它们也在GitHub 存储库中。

创建一个“setup.sh”文件

这是一个shell文件,您需要在文件中添加以下shell命令。它基本上告诉 Herokuapp 在运行应用程序时要配置和设置什么。

mkdir -p ~/.streamlit/ 
echo "\ 
[server]\n\ 
headless = true\n\ 
port = $PORT\n\ 
enableCORS = false\n\ 
\n\ 
" > ~/.streamlit/config.toml

创建一个“requirements.txt”文件

该文件告诉 Herokuapp 在运行我们的应用程序之前要安装哪些库。这些是我们之前使用的库导入,当然也需要 streamlit!

streamlit 
pandas 
pandas-datareader 
PyPortfolioOpt 
plotly 
matplotlib 
seaborn 
gunicorn

创建一个“Procfile”文件

此文件没有文件扩展名。此文件指定 Heroku 在部署应用程序时运行的命令。我们指定这是一个以 shell 文件为配置的 web 应用,并调用 Streamlit 运行 app.py。

web: sh setup.sh && streamlit run app.py

接下来,您需要执行以下操作。

  1. 从此链接安装 git
  2. 在此处创建一个Herokuapp 帐户
  3. 从此链接安装Heroku 命令行界面 (CLI)

现在,输入以下命令来初始化您的 git 存储库并进行第一次提交。

混帐初始化
混帐添加。
git commit -m “第一次提交”

接下来,运行以下命令登录您的 Heroku 帐户(您的浏览器将打开供您执行登录),然后使用您想要的任何名称创建您的 Heroku 应用程序。请注意,您的网络应用程序的 url 将是name_of_your_app.herokuapp.com。然后您将存储库推送到 Heroku。

heroku login 
heroku create name_of_your_app(改变这个)
 git push heroku master

等待几分钟让 Heroku 启动并安装所有内容,完成后,您应该能够获得一个看起来像我的 Web 应用程序。恭喜!

如果您喜欢这篇文章,请随时查看我的其他文章并随时关注我。:)