File size: 3,536 Bytes
89ba317
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import pandas as pd
import numpy as np
import os
import io
from datetime import datetime
from datetime import timedelta

import hvplot as hv
import holoviews as hvs
import panel as pn
import hvplot.pandas

import yfinance as yf

from datasets import load_dataset

pn.extension('bokeh', template='bootstrap')

def _extract_raw_data(ticker):
  df = yf.Ticker(ticker)
  return df.history(period="6mo", interval="1d").reset_index()

def _transform_data(raw_data: pd.DataFrame):
  data = raw_data[["Date", "Open", "High", "Low", "Close", "Volume"]].copy(deep=True).rename(columns={
      "Date": "time",
      "Open": "open",
      "High": "high",
      "Low": "low",
      "Close": "close",
      "Volume": "volume",
  })
  t_delta = timedelta(hours=1)
  data['time_start'] = data.time - 9*t_delta # rectangles start
  data['time_end'] = data.time + 9*t_delta    # rectangles end
  data['positive'] = ((data.close - data.open)>0).astype(int)
  return data

def make_candle_stick(ticker):
    raw_data = _extract_raw_data(ticker = ticker)
    data = _transform_data(raw_data=raw_data)
    _delta = np.median(np.diff(data.time))
    candlestick = hvs.Segments(data, kdims=['time', 'low', 'time', 'high']) * hvs.Rectangles(data, kdims=['time_start','open', 'time_end', 'close'], vdims=['positive'])
    candlestick = candlestick.redim.label(Low='Values')
    candlechart = pn.Column(candlestick.opts(hvs.opts.Rectangles(color='positive', cmap=['red', 'green'], responsive=True), hvs.opts.Segments(color='black', height=400, responsive=True , show_grid=True)) , 
                     data.hvplot(x="time", y="volume", kind="line", responsive=True, height=200).opts( show_grid=True) )
                    #  data.hvplot(y="volume", kind="bar", responsive=True, height=200) )
    return candlechart

# Function to convert DataFrame to CSV
def get_csv(df):
    sio = io.StringIO()
    df.to_csv(sio, index=False)
    sio.seek(0)
    return sio

# Function to convert the 'Ticker' column to a comma-separated string in a text file
def get_text(df):
    tickers = df['Ticker'].tolist()
    tickers_str = ','.join(tickers)
    sio = io.StringIO()
    sio.write(tickers_str)
    sio.seek(0)
    return sio

dataset = load_dataset('AmirTrader/optioncharts.io', data_files='DFtickerTotal.csv')
df = dataset['train'].to_pandas()

#widget
ticker = pn.widgets.AutocompleteInput(name='Ticker', options=list(df.Ticker) , placeholder='Write Ticker here همین جا',value='ALL', restrict=False)
Industry = pn.widgets.CheckBoxGroup( name='Select Industry', value=list(set(df.Industry)), options=list(set(df.Industry)), inline=True)
Sector = pn.widgets.CheckBoxGroup( name='Select Sector', value=list(set(df.Sector)), options=list(set(df.Sector)), inline=False)
MarketCap = pn.widgets.FloatSlider(name='Market Capital (B$)', start=0, end=4000, step=1, value=1)


def get_DF(DF,ticker, Sector,MarketCap):
  if ticker and ticker!="ALL":
    table1 = pn.widgets.Tabulator(DF.query("Ticker == @ticker"), height=200, widths=200, show_index=False)
    chart1 = make_candle_stick(ticker)
    return pn.Column(table1,chart1)
  else:
    # return pn.widgets.Tabulator( DF.query(" Sector in @Sector & MarketCap>@MarketCap"), height=800, widths=200, show_index=False)
    return pn.widgets.Tabulator( DF, height=800, widths=200, show_index=False)

pn.extension('tabulator')
bound_plot = pn.bind(get_DF, DF=df,ticker=ticker, Sector=Sector ,MarketCap=MarketCap)

pn.Column(pn.Row(pn.Column(ticker, MarketCap, Sector),bound_plot)).servable(title="Option Volatility View")