Spaces:
Sleeping
Sleeping
import streamlit as st | |
import os | |
import getpass | |
from langchain import PromptTemplate | |
from langchain import hub | |
from langchain.docstore.document import Document | |
from langchain.document_loaders import WebBaseLoader | |
from langchain.schema import StrOutputParser | |
from langchain.schema.prompt_template import format_document | |
from langchain.schema.runnable import RunnablePassthrough | |
import google.generativeai as genai | |
from langchain_google_genai import GoogleGenerativeAIEmbeddings | |
from langchain_google_genai import ChatGoogleGenerativeAI | |
from langchain.chains.llm import LLMChain | |
from langchain.chains import StuffDocumentsChain | |
from langchain_core.messages import HumanMessage | |
import requests | |
from tradingview_ta import TA_Handler, Interval | |
import yfinance as yf | |
from datetime import datetime, timedelta | |
from newsapi import NewsApiClient | |
st.set_page_config(layout="wide") | |
GOOGLE_API_KEY=os.environ['GOOGLE_API_KEY'] | |
st.title('Stock Market Insights') | |
st.sidebar.image("https://myndroot.com/wp-content/uploads/2023/12/Gemini-Dext.jpg",width =100) | |
st.sidebar.markdown("The App uses **Google Gemini API** for Text and Vision along with π¦οΈπ LangChain") | |
st.sidebar.info("Know more about [NSE Tickers](https://www.google.com/search?q=nse+tickers+list&sca_esv=a6c39f4d03c5324c&sca_upv=1&rlz=1C1GCEB_enIN1011IN1011&sxsrf=ADLYWILQPbew-0SrvUUWpI8Y29_uOOgbvA%3A1716470016765&ei=AEFPZp-zLvzHp84P_ZWtuA0&oq=NSE+Tickers+&gs_lp=Egxnd3Mtd2l6LXNlcnAiDE5TRSBUaWNrZXJzICoCCAAyBRAAGIAEMggQABgWGAoYHjIGEAAYFhgeMgYQABgWGB4yBhAAGBYYHjIGEAAYFhgeMgYQABgWGB4yBhAAGBYYHjILEAAYgAQYhgMYigUyCxAAGIAEGIYDGIoFSIIbUL0PWL0PcAF4AZABAJgB8QKgAfECqgEDMy0xuAEByAEA-AEBmAICoAKKA8ICChAAGLADGNYEGEeYAwCIBgGQBgiSBwUxLjMtMaAHtQU&sclient=gws-wiz-serp)") | |
st.sidebar.info("Know more about [Charts](https://chart-img.com/)") | |
ticker_user = st.text_input("Enter Ticker for NSE Stocks","") | |
gemini_embeddings = GoogleGenerativeAIEmbeddings(model="models/embedding-001") | |
llm = ChatGoogleGenerativeAI(model="gemini-1.5-pro",google_api_key = GOOGLE_API_KEY) | |
llm_vis = ChatGoogleGenerativeAI(model="gemini-pro-vision",google_api_key = GOOGLE_API_KEY) | |
def get_tradingview_analysis(symbol, exchange, screener, interval): | |
try: | |
stock = TA_Handler( | |
symbol=symbol, | |
screener=screener, | |
exchange=exchange, | |
interval=interval, | |
) | |
analysis_summary = stock.get_analysis() | |
return analysis_summary | |
except Exception as e: | |
return {"error": str(e)} | |
if ticker_user!="": | |
url1 = f"https://www.google.com/finance/quote/{ticker_user}:NSE?hl=en" | |
url2 = f"https://in.tradingview.com/symbols/NSE-{ticker_user}/" | |
url3 = f"https://in.tradingview.com/symbols/NSE-{ticker_user}/news/" | |
url4 = f"https://in.tradingview.com/symbols/NSE-{ticker_user}/minds/" | |
loader = WebBaseLoader([url1,url2,url3,url4]) | |
docs = loader.load() | |
st.divider() | |
# llm_prompt_template = """You are an expert Stock Market Trader for stock market insights based on fundamental, analytical, profit based and company financials. | |
# Based on the context below | |
# {context}, Summarize the stock based on Historical data based on fundamental, price, news, sentiment , any red flags and suggest rating of the Stock in a 1 to 10 Scale""" | |
llm_prompt_template = """You are an expert Stock Market Trader specializing in stock market insights derived from fundamental analysis, analytical trends, profit-based evaluations, and detailed company financials. Using your expertise, please analyze the stock based on the provided context below. | |
Context: | |
{context} | |
Task: | |
Summarize the stock based on its historical and current data. | |
Evaluate the stock on the following parameters: | |
1. Company Fundamentals: Assess the stock's intrinsic value, growth potential, and financial health. | |
2. Current & Future Price Trends: Analyze historical price movements and current price trends. | |
3. News and Sentiment: Review recent news articles, press releases, and social media sentiment. | |
4. Red Flags: Identify any potential risks or warning signs. | |
5. Provide a rating for the stock on a scale of 1 to 10. | |
6. Advise if the stock is a good buy for the next 2 weeks. | |
7. Suggest at what price we need to buy and hold or sell | |
PROVIDE THE DETAILS based on just the FACTS present in the document | |
PROVIDE THE DETAILS IN an JSON Object | |
""" | |
# st.sidebar.subheader('Prompt') | |
# user_prompt = st.sidebar.text_area("Enter Prompt",llm_prompt_template) | |
#https://huggingface.co/spaces/pradeepodela/Stock-Analyser/blob/main/app.py | |
interval = Interval.INTERVAL_1_DAY | |
analysis_summary = get_tradingview_analysis( | |
symbol=ticker_user, | |
exchange="NSE", | |
screener="india", | |
interval=interval, | |
) | |
st.title("Analysis Summary") | |
st.dataframe(analysis_summary.summary) | |
query = f"{ticker_user} stock" | |
details = { | |
"symbol": ticker_user, | |
"exchange": "NSE", | |
"screener": "india", | |
"interval": interval, | |
} | |
st.title("Details") | |
st.dataframe(details) | |
st.title("Oscillator Analysis") | |
st.dataframe(analysis_summary.oscillators) | |
st.title("Moving Averages") | |
st.dataframe(analysis_summary.moving_averages) | |
st.title("Summary") | |
st.dataframe(analysis_summary.summary) | |
st.title("Indicators") | |
st.dataframe(analysis_summary.indicators) | |
url = "https://api.chart-img.com/v2/tradingview/advanced-chart" | |
api_key = "l0iUFRSeqC9z7nDPTd1hnafPh2RrdcEy6rl6tNqV" | |
headers = { | |
"x-api-key": api_key, | |
"content-type": "application/json" | |
} | |
data = { | |
"height": 400, | |
"theme": "light", | |
"interval": "1D", | |
"session": "extended", | |
"symbol": f"NSE:{ticker_user}" | |
} | |
response = requests.post(url, headers=headers, json=data) | |
if response.status_code == 200: | |
with open("chart_t1.jpg", "wb") as f: | |
f.write(response.content) | |
st.image("chart_t1.jpg", caption='') | |
llm_prompt = PromptTemplate.from_template(llm_prompt_template) | |
llm_chain = LLMChain(llm=llm,prompt=llm_prompt) | |
stuff_chain = StuffDocumentsChain(llm_chain=llm_chain,document_variable_name="context") | |
res = stuff_chain.invoke(docs) | |
#create the humanmassage propmt templete with the image file | |
# hmessage = HumanMessage( | |
# content=[ | |
# { | |
# "type": "text", | |
# "text": "Based on the Image, suggest a BUY and SELL Strategy along with Risk based approach using Stop loss/Target price. PROVIDE THE DETAILS based on just the FACTS present and PROVIDE THE DETAILS IN an JSON Object", | |
# }, | |
# {"type": "image_url", "image_url": "chart_t1.jpg"}, | |
# ] | |
# ) | |
# message = llm_vis.invoke([hmessage]) | |
# st.write(message.content) | |
st.write(res["output_text"]) | |
# print("Image saved as chart-img-02.png") | |
else: | |
st.warning(f"Failed to retrieve image. Status code: {response.status_code}") | |
st.warning("Response:", response.text) | |