Python+Flask實現股價查詢系統。Python繪製股票k線走勢

Demonslzh發表於2020-12-15

一、實現效果圖

開啟預設顯示半年線,可以通過視覺化型別選擇視覺化k線圖、高低點等。

在這裡插入圖片描述

二、實現思路

此web應用程式主要使用了以下Python第三方庫:
Plotly – 資料視覺化庫(Plotly資料視覺化方法)
Pandas – 資料處理及分析庫
Tushare – 財經資料介面庫
Flask – Web應用框架

1、獲取資料

整個的思路比較簡單,股票資料的獲取主要通過 ***Tushare***獲取。
如下是獲取000001.SZ整年的資料的方法。

import tushare as ts
ts.set_token('b94ecd1e37a3628890e89b90e0259b6db72b0ae0b17dadd2c28c5c4c')
pro = ts.pro_api()
df = pro.daily(ts_code='000001.sz', start_date='20200101', end_date='202001230')
df.head()

在這裡插入圖片描述
這裡有一個小問題。資料中沒有股票程式碼對應的公司名稱。所以在此之前需要呼叫ts中的其他方法獲取股票程式碼對應的相關資訊。我將名稱與公司資訊獲取之後儲存在了本地,方便後續使用。呼叫方法和返回資料如下。
在這裡插入圖片描述

2、視覺化資料

這裡視覺化主要用的是plotly,通過plotly繪製的圖形有著更好的互動效果。可以通過ploytly的時間序列選擇器滑鼠拖動選擇想要檢視的具體內容。將每種不同的圖形封裝成繪圖類的對應方法即可。

from datetime import datetime
import tushare as ts
import pandas as pd
import plotly as py 
import plotly.graph_objs as go
pyplt = py.offline.plot
#讀取股票程式碼與名稱字典
ts.set_token('b94ecd1e37a3628890e89b90e0259b6db72b0ae0b17dadd2c28c5c4c')
pro = ts.pro_api()
df=pd.read_csv("stock_code.csv")
# df = pro.daily(ts_code='000001.sz', start_date='20190701', end_date='20190930')#直接儲存

class Chart_Plot:
    def __init__(self,start_date,end_date,stock1="000001",stock2="000002"):
        #處理引數格式,符合tushare呼叫規範
        self.start_date=start_date.replace("-","")
        self.end_date=end_date.replace("-","")
        #獲取指定股票程式碼的名稱
        temp=df.loc[df.ts_code.str.contains(stock1)]
        self.stock1_code=temp["ts_code"].values[0]
        self.stock1=pro.daily(ts_code=self.stock1_code, start_date=start_date, end_date=end_date)
        self.name1=temp['name'].values[0]
        #獲取要對比的股票程式碼的名稱
        temp = df.loc[df.ts_code.str.contains(stock2)]
        self.stock2_code = temp["ts_code"].values[0]
        self.stock2=pro.daily(ts_code=self.stock2_code, start_date=start_date, end_date=end_date)
        self.name2=temp['name'].values[0]

    def candle_stick(self,period="day"):#日K線圖
        #預設獲取日k,如果period不為日k,則獲取對應值
        if period=="周k":
            self.stock1=pro.weekly(ts_code=self.stock1_code,start_date=self.start_date,end_date=self.end_date)
        elif period=="月k":
            self.stock1 = pro.monthly(ts_code=self.stock1_code, start_date=self.start_date, end_date=self.end_date)

        strdate =self.stock1['trade_date'].tolist()
        #日期字串轉時間序列
        date=[]
        for i in strdate:
            X = datetime.strptime(i, '%Y%m%d')           
            date.append(X)         
        candle_trace = go.Candlestick(x = date,
                                      open = self.stock1.open,
                                      high = self.stock1.high,
                                      low = self.stock1.low,
                                      close = self.stock1.close,
                                      increasing=dict(line=dict(color= '#ff0000')),
                                      decreasing=dict(line=dict(color= '#00ff00')),
                                      name = self.stock1['ts_code'].values[0])
        candle_data = [candle_trace]
        candle_layout = {'title': self.stock1['ts_code'][0],'yaxis': {'title': '價格'}}
        candle_fig = dict(data=candle_data, layout=candle_layout)
        div = pyplt(candle_fig, output_type='div', include_plotlyjs=False, auto_open=False, show_link=False)
        return div
    
    
    def twoline_graph(self): #半年線圖
        #self.stock1['close']取出來的值都是帶有索引值的兩列的矩陣,具體看excl表格
        #tolist函式則將他們變為列表,除去索引值

        close = self.stock1['close'].tolist()
        strdate = self.stock1['trade_date'].tolist()
        date=[]
        for i in strdate:
            X = datetime.strptime(i, '%Y%m%d')           
            date.append(X)         

        # 畫圖語句:go.Scatter
        trace = [go.Scatter(
                            x=date,
                            y=close
                            )]
        #print (trace)  
        #[Scatter({'x': [2019-09-30 00:00:00, 2019-09-27 00:00:00.....
                
        layout = dict(
              title=self.stock1['ts_code'].values[0]+":"+self.name1,
              xaxis=dict(title='日期'),
              yaxis=dict(title='價格')
              )
        #print (layout)
        #{'title': 'ETF50', 'xaxis': {'title': '日期'}, 'yaxis': {'title': '價格'}}
        fig = dict(data=trace, layout=layout)  
        #print (fig)
        div = pyplt(fig, output_type='div', include_plotlyjs=False, auto_open=False, show_link=False)
        #print (div)
        return div

    def high_low(self):
        high = self.stock1['high'].tolist()
        low = self.stock1['low'].tolist()
        strdate = self.stock1['trade_date'].tolist()
        date = []
        for i in strdate:
            X = datetime.strptime(i, '%Y%m%d')
            date.append(X)

            # 畫圖語句:go.Scatter
        trace = [go.Scatter(
            x=date,
            y=high
        ),
            go.Scatter(
                x=date,
                y=low
            )
        ]
        # print (trace)
        # [Scatter({'x': [2019-09-30 00:00:00, 2019-09-27 00:00:00.....

        layout = dict(
            title=self.stock1['ts_code'].values[0]+":"+self.name1,
            xaxis=dict(title='日期'),
            yaxis=dict(title='價格')
        )
        # print (layout)
        # {'title': 'ETF50', 'xaxis': {'title': '日期'}, 'yaxis': {'title': '價格'}}
        fig = dict(data=trace, layout=layout)
        # print (fig)
        div = pyplt(fig, output_type='div', include_plotlyjs=False, auto_open=False, show_link=False)
        return div
    

在呼叫此方法後將返回結果傳遞給前端的圖形展示區域即可。

三、原始碼獲取

關注以下公眾號回覆"0050"即可get√
在這裡插入圖片描述

在這裡插入圖片描述

相關文章