内容首发

乐学偶得(http://lexueoude.com)

用代码理解分析解决金融问题

0.想法:本地架设服务汇总

不少小伙伴非常感兴趣,这次我们继续以我们之前推送的知识点与相关技术为基础,架设一个本地服务。

只要利用这个原理,甚至可以展示足够多的自定义数据,构建免费的类似Power BI的“总裁仪表盘”,将所有数据汇总实时监控,运筹帷幄~

Let's Rock!

1.技术选取

本地架设服务的方式非常多,我们这里跟大家介绍一个非常漂亮的库:plotly的dash,这个库文档非常详细,大家如果有兴趣可以专门钻研深挖,有很多可玩的地方:https://dash.plotly.com/installation

比如可以与Flask网站App开发结合起来:

做NLP自然语言分析与处理的App与可视化展示:

做机器学习的可视化调参与展示:

做在线图像识别服务的App:

做金融、财务等时间序列数据分析的展示:

做音波分析的,语言识别服务:

不错,咱们就选这个!

2.项目设计

我们先从一个最简单的小项目开始,App非常简单——建立一个非常基本的仪表盘,我们输入一个公司的股票 ,App会自动获取这个股票的关键金融与财务数据(比如收入与净利润),然后本地以条形图的方式显示公司收入和净利润。

3.兵分两路之一:1.实现前端展示

我们首先来搞定前端的页面展示,我们可以充分利用Dash中的各种功能:

import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output

这个库的逻辑非常简单,就是一个是Input,一个是Output,

Input是用户在前端输入的内容,我们把这些数据传到Python后端的函数处理。

Output是返回的以HTML形式展示的前端输出。

4.兵分两路之一:2.构建App

接下来我们就可以构建App了:

import requests
import plotly.graph_objects as go

导入必要库,并创建HTML前端展示的“模板”

app.layout = html.Div([
html.H1('Financial Dashboard'),
html.Div([
dcc.Input(id='company_selection',value='AAPL'),
html.H3(id='text'),
dcc.Graph(id ='revenue'),
dcc.Graph(id ='netincome'),
],style= {'padding':10})
])

5.兵分两路之二:实现后端功能

接下来我们就开始实现获取数据,数据处理与传给前端的功能方面。

注意到我们在下面代码中使用了app.callback()装饰器,以将输入和输出链接到我们的Dash布局组件。

我们先绘制一段时间内的公司收入:

@app.callback(Output('revenue','figure'),
[Input('company_selection','value')])
def retrieve_revenue(company):
demo = 'your api key'
stock = company
print(stock)
IS = requests.get(f'https://financialmodelingprep.com/api/v3/financials/income-statement/{company}?apikey={demo}')
IS = IS.json()
IS = IS['financials']
Revenues = []
Dates = []
count = 0
for item in IS:
Revenues.append(float(IS[count]['Revenue']))
Dates.append(IS[count]['date'])
count += 1
print(Revenues)
datapoints = {'data': [go.Bar(x=Dates, y=Revenues)],'layout': dict(xaxis={'title':'Date'},
yaxis={'title':'Revenue'},
)}
return datapoints

以上代码稍作修改,我们就可以获得净利润(或者你感兴趣的任意公司财务数据)

@app.callback(Output('netincome','figure'),
[Input('company_selection','value')])
def retrieve_revenue(company):
demo = 'your api key'
stock = company
IS = requests.get(f'https://financialmodelingprep.com/api/v3/financials/income-statement/{company}?apikey={demo}')
IS = IS.json()
IS = IS['financials']
Revenues = []
Dates = []
count = 0
for item in IS:
Revenues.append(float(IS[count]['Net Income']))
Dates.append(IS[count]['date'])
count += 1
datapoints = {'data': [go.Bar(x=Dates, y=Revenues,marker_color='lightsalmon',name='Net Income')],
'layout': dict(xaxis={'title':'Date'},
yaxis={'title':'Net Income'},
)}
return datapoints

6.两军汇总,前后端连接

我们接下来只需要将前后的Input与Output连接在一起就可以了

@app.callback(
Output(component_id='text', component_property='children'),
[Input(component_id='company_selection', component_property='value')]
)
def update_output_div(input_value):
return 'Displaying Data for "{}"'.format(input_value)

7.启动!大功告成!

我们只需要加一个小尾巴,这个程序就可以作为本地服务跑起来咯~

if __name__ == '__main__':
app.run_server(debug=True)

打开浏览器,访问~

输入任意上市公司代号,就可以在本地将感兴趣的数据可视化展示咯~