Python在经济方面的妙用!

点击上方关注,All in AI中国

在本系列的第1部分(https://towardsdatascience.com/python-for-finance-stock-portfolio-analyses-6da4c3e61054)中,我讨论了如何使用pandas来显著地增加Python在财务分析方面的能力。在第1部分中,我们回顾了如何利用pandas和Yahoo Finance API来自动跟踪和评量(多种)股票组合表现的基准。在那篇文章的末尾,你生成了一个丰富的数据集,可以计算出在相同的持有期内,投资组合头寸相对于同等大小的标准普尔500指数头寸的相对百分比和美元价值回报。如果你投资标准普尔500 指数基金的话,你还可以确定每个头寸对你的整体投资回报有多大的贡献。最后,你使用Ploely进行可视化,这使你更容易理解哪些头寸驱动了最大的价值,它们的YTD(YTD:一定时期的资产负债表应反映年初至今的经营情况)相对于标准普尔500指数而言是什么样子的,如果有任何头寸下跌,你可能会考虑抛售,也就是遇到了"尾盘止损"。

Python在经济方面的妙用!

我参与了在Jupyter笔记本上构建的部分初始过程,我学到了很多东西。我也发现写一个在Jupyter笔记本的"心路历程"很有帮助。这既解释了代码,也将我的想法与可视化联系了起来。这样一来,我所做的将比原来花费的时间更短,其目的也将更加直接。我一直在寻找/创建一个更加有用的笔记本来跟踪我的股票投资组合,我打算学习合并一个Python构建分析仪表盘/web应用程序的框架。对我来说,这样做最重要的一个目的是能够选择特定的位置和所需的时间框架,并评估每个位置的相对性能。在未来,我很可能会将这个评估案例扩展到我并不拥有但考虑收购的位置。在今年剩下的时间里,我希望通过学习Flask并使用Heroku部署应用程序,并尽可能地开发某种类型的数据管道来自动提取和加载最终web应用程序的新数据,进一步加深对构建web应用程序的理解。虽然我在这个过程中还处于探索阶段,但在这篇文章中,我将讨论上次讨论过的笔记本的扩展,最初使用的是Dash by Plotly,在这里简称为Dash。

Dash by Plotly

如果你已经阅读或参考了第1部分,你将会看到,一旦创建了主要dataframe,你会使用Ploly生成可视化,用于评估相对于标准普尔500指数的投资组合绩效。Plotly是一个非常丰富的库,相对于其他Python可视化库(如Seaborn和Matplotlib),我更喜欢用它来创建可视化。在此基础上,最终目标是为我的投资组合分析提供一个交互式仪表盘/ web应用程序。我一直在为这个问题寻找最优解,同时我已经开始探索如何使用Dash。明确地将Dash(https://plot.ly/products/dash/)定义为用于构建web应用程序的Python框架,因为这样做是不需要JavaScript的。正如我链接到的登陆页面所显示的,它构建在Plotly.js、Reaction和Flask之上。

到目前为止,我认为这样做的好处是,一旦你熟悉并适应了Plotly,你对Dash的使用就会如鱼得水。相较于简单地将你的可视化放在Jupyter笔记本中进行分析,我认为创建一个独立的、交互式的web应用程序是有价值的。Dash提供了更多的交互性,以及展现了使用"下拉、滑块和图形等现代UI元素"操作数据的能力。这些功能非常有利于我对股票投资组合的分析,比如说进行"如果怎样,会发生什么"的推断,以及交互研究潜在机会,并迅速了解关键的驱动因素和场景。考虑到所有这些,Dash的学习曲线,至少对我来说,并不是微不足道的。

Jose Portilla的"交互式Python仪表盘和Plotly and Dash"

为了缩短我阅读和广泛查找Dash文件所需的时间,我参加了Jose Portilla(https://medium.com/@josemarcialportilla)教授在Udemy是讲述的Plotly and Dash课程(https://www.udemy.com/interactive-python-dashboards-with-plotly-and-dash/)。该课程的详细页面可以在这里找到。我已经学习教授的一些课程,现在正在学习他的Flask课程。我认为他是一位非常出色和有帮助的讲师——尽管他通常不把丰富的编程经验作为课程的先决条件,但在这门Dash课程中,他确实建议至少要对Python有一定的了解。特别强烈建议对Plotly用于可视化的语法有一个扎实的理解,包括使用pandas。需要强调的是,即便上完这门课之后,你对如何使用Dash来构建的理解依旧很浅。但是,这门课程非常有帮助,因为Jose在他的例子中使用了datareader,也使用了财务数据,包括动态提取股票价格图表。

移植来自Jupyter笔记本的数据,以便在Dash中与其进行交互

开始

与第1部分类似,我在GitHub上创建了另一个repo(https://github.com/kdboller/pythonsp500-plotly-dash),其中包含创建最终仪表盘所需的所有文件和代码。

下面是对所包含内容的总结,以及如何开始:

1.Investment Portfolio Python Notebook_Dash_blog_example.ipynb ,这与第1部分中的Jupyter笔记本非常相似;新增的部分包括最后两个部分:"股票回报比较"部分(我在使用Dash之前构建了这个部分作为概念验证)和"数据输出"部分(我创建分析生成的数据的csv文件);它们作为仪表盘中使用的数据源。

2.Sample stocks acquisition dates_costs.xlsx,你可以使用它修改你的组合评估。

3.requirements.txt,这应该包含你需要的所有库。我建议在Anaconda中创建一个虚拟环境,后面将进一步讨论。

4.Mock_Portfolio_Dash.py ,这是仪表盘的代码,我们将在下面介绍。

根据repo的自述文件(https://github.com/kdboller/pythonsp500-plotly-dash/blob/master/README.md),我建议使用Anaconda创建一个虚拟环境。

我推荐使用Python 3.6或更高版本,这样你就可以使用提供的csv文件在本地运行Dash仪表盘了(https://medium.freecodecamp.org/why-you-need-python-environments-and-how-to-manage-them-with-conda-85f155f4353c)。这里有一个关于如何在Anaconda中建立虚拟环境的非常详尽的解释。

最后,如第1部分中所提到的,一旦你的环境设置好了,除了需求文件中的库之外,如果你希望在笔记本中运行Yahoo Finance datareader的部分片段,你还需要在虚拟环境中安装fix-yahoo-finance。

和Dash一起工作

如果你已经使用Python 3.6创建了一个虚拟环境,并且已经安装了必要的库,那么你应该能够使用代码运行Python文件。

对于那些不太熟悉的人:一旦进入虚拟环境,你将需要将目录CD更改为保存repo文件的位置。举一个简单的例子,如果你打开Anaconda提示符,并且你在文档文件夹中,并且文件保存在你的桌面上,你可以执行以下操作。

Python在经济方面的妙用!

Python在经济方面的妙用!

如果你想要对Jupyter笔记本进行完整的解释并生成投资组合数据集,请参阅第1部分。在Jupyter笔记本的末尾,你将在"数据输出"一节中看到下面的代码。这些小的添加将把CSV文件发送到你的本地目录。第一个是完整的投资组合数据集,你可以从中生成所有的可视化,第二个数据集提供了在第一个新股票图表的下拉选择中使用的代码列表。

Python在经济方面的妙用!

我将重点介绍Mock Portfolio Python文件的一些关键方面,并分享如何在本地运行仪表盘。

作为参考,当我们分解.py文件时,下面是运行这个仪表盘时应该看到的前三个图表的屏幕抓取。

Python在经济方面的妙用!

在.py文件的开头,导入requments.txt文件中包含的库,然后编写

Python在经济方面的妙用!

为了实例化Dash应用程序,然后创建两个dataframe对象、tickers和data。tickers将用于图表中的一个下拉列表中的股票代码,(data)Dataaframe将是用于所有可视化评估的最终数据集。

你将整个仪表盘封装在一个Div中,然后开始在这个Div中添加图表组件。py文件中的第35-72行生成"相对回报比较"图表,包括股票符号下拉、开始/结束日期范围、提交按钮和图表的输出。为了简洁起见,我将在.py文件的这一部分中分解这三个部分中的第一个部分。

Python在经济方面的妙用!

Python在经济方面的妙用!

如前所述,使用Dash意味着不需要向应用程序添加JavaScript。在上面的代码块中,我们用H1标记标记输出,创建另一个Div,然后使用dash_core_components库中的下拉列表。将id设置为"my_ticker_symbol",我们将简要地回顾一下它的作用,从tickers dataframe中设置"SPY"的默认值,然后将multi-select设置为True。这里要联系到学习曲线,至少对我来说是这样,这就是Jose Portilla的课程通过提供概括总结具体例子来缩短你的学习周期的地方。Jose实际上在他的课程中使用了一个类似于股票列表下拉列表和日期范围选择器的例子。

在下面的第75-93行中,你将看到仪表盘上的左下角图表的代码。此图表与第1部分中的Jupyter笔记本提供的相同,但我发现dash与Jupyter笔记本相比,仪表盘布局中的所有这些输出都是更好的方便用户体验。

Python在经济方面的妙用!

Python在经济方面的妙用!

Python在经济方面的妙用!

对于喜欢使用Plotly的人来说,在创建绘制Plotly图形所需的数据和布局对象以及语法方面应该很熟悉。上面所包含的语法与笔记本中用于图表的语法不同,因为我更喜欢创建跟踪,基于这些跟踪生成数据对象,并使用dict语法在布局对象中。在学习Jose的课程时,我发现在dash中,出现括号,大括号时,它有时会变得"笨拙",因此我将重点放在了适应这种结构上。

Python在经济方面的妙用!

Python在经济方面的妙用!

Python在经济方面的妙用!

第229-252行(上面提供)驱动第一个"相对回报比较"图表的交互性。下面是这段代码的简要概述:

为了创建交互式图表,Dash使用了回调修饰符:我们的应用程序接口的"输入"和"输出"是通过app.callback decorator。(https://dash.plot.ly/getting-started-part-2)

在应用程序回调中,我们输出前面用id'my_gram'指定的dcc.gram。

你使用Submit按钮作为输入,我们有三个默认状态,"my_ticker_symbol",dcc.Dropdown中声明了默认的"SPY"值。以及默认的开始日期1/1/2018和结束日期,即今天。

回调下面是回调装饰器包装的函数。正如Dash文件中所描述的,当输入属性发生变化时,装饰器包装的函数将自动调用。Dash为函数提供输入属性的新值作为输入参数,Dash用函数返回的内容更新输出组件的属性。

在for循环中,y值除以任意一天的收盘价,df['Close'],按所提供的日期范围生成的系列中的第一个收盘价(df['Close'].iloc[0]).

我这样做是为了查看两个或更多股票的相对表现。指数为0,这是日期范围的开始。鉴于股票价格的巨大差异,这使得比较1800美元以上的股票交易(例如AMZN)与低于100美元的另一种交易(如WMT)的相对表现更为容易。

有时会有一种误解,即如果一只股票的交易价格较低,那么它就是"便宜"的;如果它的交易价格低于AMZN,那么它就是"昂贵"的。鉴于这种误解,公司有时会拆分他们的股票,以便让小投资者更能负担得起股价,尽管公司的市值保持不变。

不管怎样,这张图表的好处是,它允许你使用动态日期快速地发现相对于标准普尔500指数,那些股票表现不佳。这提供了有关整体投资组合的有用信息,以及考虑何时剥离表现不佳的持股依据。

Python在经济方面的妙用!

结论和未来的考虑

这结束了我对Dash股票投资组合分析的初步回顾。和以前一样,你有一个可扩展的Jupyter笔记本和组合数据集,你现在可以将其作为CSV文件读取并在交互式仪表盘中查看。正如前面在第一部分中讨论的那样,这一办法仍然有一些需要改进的领域,包括需要将股利作为股东总回报的一部分,以及需要能够同时评估活跃的和全部(包括已被剥离的)头寸。

我发现这种方法最重要的好处比如额外的交互性,亦或者我更喜欢所有图表的仪表盘布局,而不是Jupyter笔记本中单独的单元格。在未来,我计划纳入更多的互动性,包括更多的"如果怎样,会怎样"的分析,以评估个人股票对整体表现的贡献。

我目前正在考虑的使用数据管道交付端到端web应用程序的其他选项包括:

使用谷歌BigQuery的模式分析:模式的好处包括它已经支持丰富的可视化(不需要编码),包括内置在Python笔记本中。然而,我不相信在模式中有一种方法可以从一个金融API中提取数据,包括YahooFinance和IEX。这些API源的数据可以读入私有数据库,例如,使用谷歌BigQuery,你可以连接到该模式。然而,就目前而言,这似乎是一个限制,因为我相信更多的未来图表和用例将需要从API中提取数据(而不是存储在数据库中)。

带有Postgres和Pipeline(管道)的Heroku:作为Jose课程的一部分,他向你展示了如何将Dashapp部署到Heroku。到目前为止,我相信利用Heroku是一种潜在的长期解决方案。这是我选择Jose的FlaskCourse的另一个原因;我从未构建过Web应用程序,他展示了如何使用SQLAlchemy作为Flask应用程序的数据库。进一步加深了我对在Heroku上部署带有数据库的应用程序的理解,我的重点将是确定在交互式Web应用程序中分析金融API数据的最佳方法,我可以在指定的时间表上使用新的数据刷新该应用程序。

Python在经济方面的妙用!

相关推荐