我的量化交易系统是如何搭建的(streamlit基础教学)
之前的文章一个交易系统应该长什么样中我分享过我是如何搭建自己的量化半自动交易系统的,除了无法自动下单交易,其他功能都已经实现,很多小伙伴一直都在问我他自己要如何实现这样的交易系统,我的答案是先学习Python和Streamlit。今天就来分享一下Streamlit的基础教学。
Streamlit使创建界面、显示文本、可视化数据、渲染小部件以及从初始到部署管理web应用程序变得非常简单,其方便且高度直观的应用程序编程接口在附录中展示。通过本章所涵盖的技术,您将学习如何创建输入表单、实现条件流、管理错误、改变数据框架和呈现基本图表。在完成Streamlit基础知识之后,开发人员应该能够生产、管理和控制各种琐碎的web应用程序,并在本地部署它们。这些应用程序包括但不限于数据浏览器、机器学习、多媒体和其他通用应用程序。一旦开发人员掌握了Streamlit的基础知识,他们就可以开始开发更高级、更重要的应用程序,这些应用程序将在后续章节中介绍。
2.1创建基础应用
使用Streamlit强大的API,我们可以呈现各种应用程序。从最简单的微服务用例到分布式系统的复杂应用程序,Streamlit使我们能够适应用户的各种需求。然而,首先,我们将在本节中仔细研究更简单的应用程序类型,然后在后续小节中继续讨论更复杂的应用程序类型。
2.1.1生成用户输入表单
在Streamlit中创建表单非常简单,只需将几个文本、数字和其他输入小部件捆绑在一个页面上,再加上一个按钮来触发一个动作,比如在数据库中记录条目或将其保存到会话状态。这种方法的警告是,每当用户与任何小部件交互时,Streamlit将自动从头到尾重新运行整个脚本。虽然这种方法为开发人员的程序提供了逻辑和无缝的流程,但有时将输入小部件捆绑在一起并让Streamlit仅在用户提示时重新运行脚本可能会很有用。这可以使用st.form命令来完成。
import streamlit as stwith st.form(feedback_form): st.header(Feedback form) # Creating columns to organize the form col1, col2 = st.columns(2) with col1: name = st.text_input(Please enter your name) rating = st.slider(Please rate this app,0,10,5) with col2: dob = st.date_input(Please enter your date of birth) recommend = st.radio(Would you recommend this app to others?,(Yes,No)) submit_button = st.form_submit_button(Submit)if submit_button: st.write(**Name:**, name, **Date of birth:**, dob, **Rating:**, rating,**Would recommend?:**, recommend)Streamlit表单可以在with语句中调用,并使用st.form命令。在清单2-1中,我们最初使用st. columns命令创建列,将表单中的小部件组织成宽度相等的两列。在第一列中,我们分别使用st.text_input和rating命令放置一个文本输入和滑块小部件,在第二列中,我们使用st.date_input和st.radio命令放置一个日期输入和单选按钮小部件。随后,在同一个with语句中,我们使用st.form_submit_button命令添加了一个表单提交按钮。当单击此按钮时,它将一次性提交所有小部件的条目,而不管表单中包含了多少项。需要注意的是,st.form_submit_button与st.button不同,如果没有表单提交按钮,Streamlit将抛出一个错误。如图下图所示,所有的小部件将通过st.form命令捆绑在一个表单中。一旦点击表单提交按钮,所有的条目将被一次集中处理,并处理输出。
2.1.2引入条件流
可能有必要在Streamlit应用程序中引入条件流,其中某些操作将依赖于先前的操作或小部件的状态。这对于提示用户正确填写表单和/或正确使用应用程序特别有用。如果不实现条件流,如果用户不正确地使用应用程序,则应用程序很容易抛出错误。
清单2-2
import streamlit as stdef display_name(name): st.info(f**Name:** {name})name=st.text_input(Please enter your name)if not name: st.error(No name was entered)if name: display_name(name)在清单2-2中,为了确保用户已经在name字段中输入了一个文字,我们使用if语句来检查该字段是否为空。如果它为空,将提示用户一条错误消息(图2-3),如果它不为空,将调用一个函数来显示该条目。
清单2-3
import streamlit as stdef display_name(name): st.info(f**Name:** {name})name = st.text_input(Please enter your name)if not name: st.error(No name entered) st.stop()display_name(name)在清单2-3中,我们同样使用if语句检查name字段是否为空。这里唯一的区别是,如果name字段为空,我们使用st.stop命令来停止脚本的执行。如果它不为空,我们将继续执行脚本的其余部分,显示输入的名称。这种方法的好处是,它消除了对额外if语句的需要,并简化了你的脚本;另外,就效用而言,两个例子是相同的。
条件流编程既可以应用于普通应用程序,也可以应用于非普通应用程序。实际上,如果需要,这种技术可以通过嵌套的if语句、while循环和其他方法来扩展和实现。
2.1.3错误管理和调试
如果你在开发模式下运行Streamlit,并配置了showErrorDetails = True,那么Streamlit将在web页面上本机显示运行时异常,类似于任何其他IDE在控制台上显示此类消息的方式。这远非理想,因为用户将无法理解它,并会感到困惑。更重要的是,如果异常管理不当,可能会在代码的后续部分触发一连串致命错误,从而对其他系统产生级联效应。此外,Streamlit将显示导致用户异常的错误代码片段,这可能侵犯了知识产权,如果您的源代码受到此类限制。
清单2-4
import streamlit as stcol1, col2 = st.columns(2)with col1: number_1 = st.number_input(Please enter the first number,value=0,step=1)with col2: number_2 = st.number_input(Please enter the second number,value=0,step=1)st.info(f**{number_1}/{number_2}=** {number_1/number_2})运行清单2-4,我们可以创建一个简单的应用程序,其中一个数除以另一个数。如果用户除0以外的任何数字,应用程序将正常工作,并显示类似于下图的输出。然而,如果用户决定除以零,逻辑上Python将抛出一个零除错误,由Streamlit显示,如图下图所示。
您确实可以限制st.number_input小部件的输入值范围,但是让我们暂时假设您不能这样做。那么补救办法是在代码中使用try和except块,如清单2-5所示,有可能遇到不可预见的问题。在本例中,我们尝试使用try语句运行脚本中麻烦的部分。如果它因为ZeroDivisionError而失败,我们将使用except ZeroDivisionError语句来处理它,该语句将向用户显示一个经过策划的错误消息,如图所示。如果它因为任何其他原因而失败,我们可以使用一个通用的except语句来传递这部分代码,而不执行任何操作。
清单2-5
import streamlit as stcol1, col2 = st.columns(2)with col1: number_1 = st.number_input(Please enter the first number,value=0,step=1)with col2: number_2 = st.number_input(Please enter the second number,value=0,step=1)try: st.info(f**{number_1}/{number_2}=** {number_1/number_2})except ZeroDivisionError: st.error(Cannot divide by zero)本次分享就到这里,更多精彩内容尽在知识星球,欢迎你的加入。
发表回复