Membuat Dashboard Interaktif untuk Analisis Trading Harian

By | September 6, 2022
934 Views

Membuat Dashboard Interaktif –  Aplikasi yang melibatkan interaksi dengan penggunanya lumayan membutuhkan component yang sangat banyak terutama component/library grafis, belum lagi memikirkan event/callbacknya. Untungnya kita akan terbantu dengan library siap pakai seperti RShiny di R/RStudio. Lha bagaimana dengan Python? tenang saja membuat dashboard interaktif berbasis web sangat mudah bila kita menggunakan duet antara Dash dan Plotly.

Dashboard Interaktif

Bila kalian cermati, beberapa postingan disini banyak menggunakan grafik canggih2 dan ribet dalam membahas saham serta interaktif bisa digeser, zoom, dan bahkan save kedalam beberapa format gambar. Sebenarnya itu untuk mempermudah analisis trading saham yang lebih mudah dibaca menggunakan grafik daripada hanya deretan angka-angka saja.

Seperti gambar berikut dengan beberapa overlapping garis dan spot/titik adalah contoh sebuah keputusan buy dan sell yang dibuat otomatis oleh algoritma yang saya buat untuk menguji beberapa keputusan buy dan sell dengan melibatkan indikator tertentu sehingga dapat dibuat robot trading.

Membuat Dashboard Interaktif

Membuat Dashboard Interaktif membutuhkan library utama yaitu dash, oleh sebab itu kalian bisa melakukan install pip install dash

atau bisa berkunjung di https://dash.plotly.com. Sebagai bahan dataset, seperti biasa kita menggunakan data transaksi harian yang bisa diambil disini https://softscients.com/2022/08/27/merge-file-csv-di-pandas/

Dashboard interaktif yang kita buat cukup sederhana dulu yaitu menampilkan data close dan volume untuk 1 emiten. Seperti biasa kita loading library yang diperlukan, oiya saya simpan kode dibawah ini dengan nama run.py agar mudah diingat saja

import dash
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd
import os
import glob

dilanjutkan merge file CSV

joined_files = os.path.join("//dataset", "*.csv")
joined_list = glob.glob(joined_files)
data = pd.concat(map(pd.read_csv, joined_list), ignore_index=True)

pilih emiten yang kita akan gunakan serta urutkan berdasarkan Date nya

emiten = "'BBRI'"
data = data.query("StockCode=="+emiten)
data['Date'] = pd.to_datetime(data['Date'], format='%Y-%m-%d')
data.sort_values(by='Date',ascending=True,inplace =  True)

Lanjut membuat layout Dash nya

app = dash.Dash(__name__)
app.layout = html.Div(
    children=[
        html.H1(children="Emiten : "+emiten,),
        html.P(
            children="Harga Saham Harian",
        ),
        dcc.Graph(
            figure={
                "data": [
                    {
                        "x": data["Date"],
                        "y": data["Close"],
                        "type": "lines",
                    },
                ],
                "layout": {"title": "Close"},
            },
        ),
        dcc.Graph(
            figure={
                "data": [
                    {
                        "x": data["Date"],
                        "y": data["Volume"],
                        "type": "lines",
                    },
                ],
                "layout": {"title": "Volume"},
            },
        ),
    ]
)

Langkah terakhir membuat kode untuk memanggil sebagai aplikasi

if __name__ == "__main__":
    app.run_server(debug=False)

Langkah selanjutnya adalah memanggil script tersebut via terminal

python run.py

nanti kita buka saja browser dengan alamat http://127.0.0.1:8050

See also  Melihat Pergerakan Kepemilikan Efek-Saham

 

Menu Drop Down

Tentu data diatas mempunyai banyak emiten sehingga tidak praktis kalau setiap memilih emiten, harus ketik ulang lagi kode nya kemudian melakukan refresh F5 di browser, oleh sebab itu, kita akan ubah dengan menambahkan menu dropdown dan callback. Kita perbaiki kode nya seperti berikut (saya simpan dengan nama run2.py)

import dash
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd
import os
import glob

from dash import Dash, html, dcc, Input, Output
import plotly.express as px
import numpy as np


joined_files = os.path.join("//Volumes//GoogleDrive//My Drive/Portofolio Saham 2022//Cara Narik Data Saham Harian di website IDX//dataset", "*.csv")
joined_list = glob.glob(joined_files)
data = pd.concat(map(pd.read_csv, joined_list), ignore_index=True)

data['Date'] = pd.to_datetime(data['Date'], format='%Y-%m-%d')
data.sort_values(by='Date',ascending=True,inplace =  True)

emitens = np.sort(data['StockCode'].unique())

emiten = dcc.Dropdown(options=emitens,
                            value=emitens[0])

selanjutnya

app = dash.Dash(__name__)
app.layout = html.Div(children=[
    html.H1(children='Harga Saham Harian'),
    emiten,
    dcc.Graph(id='close-graph')
])

jangan lupa buat callback dan update graphnya

@app.callback(
    Output(component_id='close-graph', component_property='figure'),
    Input(component_id=emiten, component_property='value')
)
def update_graph(selected_emiten):
    filter_data = data.query("StockCode=='"+selected_emiten+"'")
    filter_data = filter_data.reset_index()
    line_fig = px.line(filter_data,
                       x='Date', y='Close',
                       title=f'Emiten : {filter_data["StockName"][0]}')
    return line_fig

tambahkan kode buat run scriptnya

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

Panggil via terminal dengan perintah

python run2.py

Hasilnya

Untuk membuat banyak grafik ter update dengan sekali klik, langkah nya agak panjang dikit, nanti kita akan bahas tersendiri.