Skip to content

Commit 41b856a

Browse files
committed
Advance Decline Data Added
1 parent 9f7faff commit 41b856a

File tree

5 files changed

+79
-16
lines changed

5 files changed

+79
-16
lines changed

README.md

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
# MMI - Risk o Meter
2+
23
> Inspired by [Ticker Tape](https://www.tickertape.in/market-mood-index)
34
45
## Steps to Use
6+
57
- Install the requirements.txt file
68
- Uncomment the get_fii_activity() function in the code
79
- Run the code
810

911
## Features
1012

1113
## Roadmap
12-
- [ ] Gauge Charts Setup
14+
15+
- [x] Gauge Charts Setup
1316
- [x] FII Activity
1417
- [ ] Volatility and Skew
1518
- [x] Momentum
1619
- [ ] Market Breadth
1720
- [ ] Price Strength
18-
- [ ] Demand for Gold
21+
- [ ] Demand for Gold

data/mactivity/MA070322.csv

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
,,,,,Unnamed: 0, Total Market Capitalisation (Rs. Crores), 23899636.21
21
,INDEX,PREVIOUS CLOSE,OPEN,HIGH,LOW,CLOSE,GAIN/LOSS
32
,Nifty 50, 16245.35, 15867.95, 15944.60, 15711.45, 15863.15,-382.2
43
,Nifty 50, 16245.35, 15867.95, 15944.60, 15711.45, 15863.15,-382.2

mmiIndex.py

+59-13
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
from fileinput import filename
21
import streamlit as st
32
import pandas as pd
43
import numpy as np
54
import os
65
from datetime import datetime, timedelta, date
76

7+
import plotly.graph_objects as go
8+
89
# Custom imports
910
import nsepyData as nd
1011

@@ -45,20 +46,37 @@ def get_market_activity(data_dates):
4546
else:
4647
pass
4748

48-
# Market Activity Data
4949
#get_market_activity(nifty50)
5050

51-
@st.cache(suppress_st_warning=True)
51+
# Market Activity Data Processing
52+
#@st.cache(suppress_st_warning=True)
5253
def market_activity(data_dates):
53-
market_activity_list = []
54+
ma_adv_list = []
55+
ma_dec_list = []
5456
for i in data_dates.index:
5557
filename = 'data/mactivity/MA{}{}{}.csv'.format(i.strftime("%d"), i.strftime("%m"), i.strftime("%y"))
56-
market_activity = pd.read_csv(filename)
57-
st.write(market_activity)
58-
market_activity_list.append(market_activity.loc[market_activity.INDEX == 'ADVANCES'])
59-
st.write(market_activity_list)
58+
ma_data = pd.read_csv(filename)
59+
#st.write(filename, ma_data)
60+
ma_adv = ma_data['PREVIOUS CLOSE'].loc[ma_data['INDEX'] == 'ADVANCES']
61+
ma_dec = ma_data['PREVIOUS CLOSE'].loc[ma_data['INDEX'] == 'DECLINES']
62+
#ma_adv = ma_data.loc[ma_data['INDEX'] == 'ADVANCES']
63+
#ma_dec = ma_data.loc[ma_data['INDEX'] == 'DECLINES']
64+
ma_adv_list.append(ma_adv.values[0])
65+
ma_dec_list.append(ma_dec.values[0])
66+
ma_df = pd.DataFrame({'ADVANCES': ma_adv_list,
67+
'DECLINES': ma_dec_list
68+
}, index=data_dates.index)
69+
st.write(ma_df)
70+
return ma_df
6071

6172
market_activity(nifty50)
73+
ma_data = pd.read_csv('data/mactivity/MA030122.csv')
74+
ma_adv = ma_data['PREVIOUS CLOSE'].loc[ma_data['INDEX'] == 'ADVANCES']
75+
ma_dec = ma_data['PREVIOUS CLOSE'].loc[ma_data['INDEX'] == 'DECLINES']
76+
ma_adv_list = []
77+
ma_dec_list = []
78+
ma_adv_list.append(ma_adv.values[0])
79+
#st.write(ma_adv_list)
6280

6381
@st.cache()
6482
def fii_activity(data_dates):
@@ -83,7 +101,7 @@ def methodology(df):
83101
df['Rolling StdDev'] = df.iloc[:, -3].rolling(45).std()
84102
# Normalizing Data between 0 to 100
85103
df['Normalized'] = 100 * ((df['Rolling StdDev'] - df['Rolling StdDev'].min()) / (df['Rolling StdDev'].max() - df['Rolling StdDev'].min()))
86-
st.write(df['Normalized'].tail())
104+
#st.write(df['Normalized'].tail())
87105
return df['Normalized']
88106

89107
# Run this function to get data
@@ -95,22 +113,25 @@ def methodology(df):
95113
# FII Activity
96114
fii_activity = pd.read_csv('data/fii_activity.csv', index_col='Date', parse_dates=['Date'])
97115
#st.line_chart(fii_activity)
98-
st.line_chart(methodology(fii_activity))
99-
116+
mmi_fii = methodology(fii_activity)
117+
#st.line_chart(mmi_fii.tail())
100118

101119
# Volatility and Skew
102120
indiavix = pd.read_csv('data/indiavix.csv', index_col='Date', parse_dates=['Date'])
103121
indiavix['Rolling'] = indiavix['Close'].rolling(45).mean()
104122
#st.write(indiavix['Rolling'].tail())
123+
mmi_volatility = methodology(indiavix)
124+
#st.write(mmi_volatility.tail())
105125

106126
# Momentum
107127
# 30D & 90D EMA of Nifty 50
108128
nifty50['30D EMA'] = nifty50['Close'].ewm(span=30, adjust=False).mean()
109129
nifty50['90D EMA'] = nifty50['Close'].ewm(span=90, adjust=False).mean()
110130
nifty50['Momentum'] = (nifty50['90D EMA'] - nifty50['30D EMA']) / nifty50['90D EMA']
111-
#st.write(nifty50['Momentum'])
131+
#st.write('MMI Momentum', nifty50['Momentum'])
112132
#st.line_chart(nifty50.iloc[:, [3, -3, -2]])
113-
st.line_chart(methodology(nifty50))
133+
mmi_momentum = methodology(nifty50)
134+
#st.line_chart(mmi_momentum.tail())
114135

115136
# Market Breadth -> Modifies Arms Index
116137
#adratio = pd.read_html('https://www1.nseindia.com/products/content/equities/equities/historical_advdeclines.htm')
@@ -122,6 +143,31 @@ def methodology(df):
122143

123144
# Demand for Gold
124145

146+
# MMI Calculation
147+
mmi = 1/3*(mmi_fii + mmi_momentum)
148+
st.write('MMI Data', mmi.tail())
149+
150+
# Vizualization
151+
# Gauge Charts -> https://plotly.com/python/reference/indicator/
152+
fig = go.Figure(go.Indicator(
153+
mode = "gauge+number+delta",
154+
delta = {'reference': mmi[-2]},
155+
value = mmi[-1],
156+
domain = {'x': [0, 1], 'y': [0, 1]},
157+
title = {'text': "Risk-o-Meter"},
158+
gauge = {'axis': {'range': [None, 100],
159+
'tickmode': 'array',
160+
'ticktext': ['Extreme Fear', 'Fear', '', 'Greed', 'Extreme Greed'],
161+
'tickvals': [0, 30, 50, 70, 100]},
162+
'steps': [
163+
{'range': [0, 30], 'color': "lightgreen", 'name': 'Fear'},
164+
{'range': [30, 50], 'color': "rgb(255,200,0)", 'name': 'Risk'},
165+
{'range': [50, 70], 'color': "orange"},
166+
{'range': [70, 100], 'color': "red"}]}))
167+
168+
st.plotly_chart(fig, use_container_width=True)
169+
170+
st.write(mmi_fii.tail(), mmi_momentum.tail(), mmi_volatility.tail())
125171

126172
def get_dates():
127173
# Holiday List From NSE

requirements.txt

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
nsepy==0.8
22
numpy==1.22.3
33
pandas==1.3.5
4+
plotly==5.7.0
45
streamlit==1.8.1

scripts/testStreamlit.py

+14
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,18 @@
22
import streamlit as st
33
import numpy as np
44
import os
5+
import plotly.graph_objects as go
56

7+
fig = go.Figure(go.Indicator(
8+
domain = {'x': [0, 1], 'y': [0, 1]},
9+
value = 450,
10+
mode = "gauge+number+delta",
11+
title = {'text': "Speed"},
12+
delta = {'reference': 380},
13+
gauge = {'axis': {'range': [None, 500]},
14+
'steps' : [
15+
{'range': [0, 250], 'color': "lightgray"},
16+
{'range': [250, 400], 'color': "gray"}],
17+
'threshold' : {'line': {'color': "red", 'width': 4}, 'thickness': 0.75, 'value': 490}}))
18+
19+
st.plotly_chart(fig)

0 commit comments

Comments
 (0)