def test_statements(): fstatments = Statements() df = fstatments.get_statements('tsla') assert (df is not None) with pytest.raises(ValueError, match=r"Invalid chart type 'dummy'"): finvizfinance('tsla').ticker_charts(charttype='dummy')
def test_finvizfinance_finvizfinance_chart(mocker): mocker.patch('finvizfinance.quote.finvizfinance._checkexist', return_value=True) mocker.patch('finvizfinance.quote.web_scrap', return_value="") image_scrap_mock = mocker.patch('finvizfinance.quote.image_scrap') finvizfinance('dummy').ticker_charts() image_scrap_mock.assert_called_with( 'https://finviz.com/chart.ashx?t=dummy&ty=c&ta=1&p=d', 'dummy', '')
def view(other_args: List[str], ticker: str): """View historical price with trendlines. [Source: Finviz] Parameters ---------- other_args : List[str] argparse other args ticker: str stock ticker """ parser = argparse.ArgumentParser( add_help=False, prog="view", description=""" View historical price with trendlines. [Source: Finviz] """, ) try: ns_parser = parse_known_args_and_warn(parser, other_args) if not ns_parser: return stock = finvizfinance(ticker) stock.TickerCharts() img = Image.open(ticker + ".jpg") img.show() print("") except SystemExit: print("")
def sub_news(request): """ Show news and sentiment of ticker in /ticker?quote={TICKER}. Data from Finviz Note: News are only available if hosted locally. Read README.md for more details """ ticker_selected = default_ticker(request) ticker_fin = finvizfinance(ticker_selected) news_df = ticker_fin.TickerNews() news_df["Date"] = news_df["Date"].dt.date link = news_df["Link"].to_list() del news_df["Link"] # Get sentiment of each news title and add it to a new column in news_df sentiment_list = list() all_titles = news_df['Title'].tolist() for title in all_titles: vs = analyzer.polarity_scores(title) sentiment_score = vs['compound'] if sentiment_score > 0.25: sentiment = "Bullish" elif sentiment_score < -0.25: sentiment = "Bearish" else: sentiment = "Neutral" sentiment_list.append(sentiment) news_df["Sentiment"] = sentiment_list news_df = news_df.to_html(index=False) return render(request, 'iframe_format.html', {"title": "News", "table": news_df, "link": link, "class": "ticker_news"})
def news_sentiment(): """ Get the news sentiment score of popular tickers from Finviz news """ print("-" * 100) print("Getting News Sentiment From Finviz ...") for ticker_selected in interested_tickers: ticker_fin = finvizfinance(ticker_selected) news_df = ticker_fin.TickerNews() news_df["Date"] = news_df["Date"].dt.date del news_df["Link"] all_titles = news_df[news_df['Date'] == news_df["Date"].unique() [0]]['Title'].tolist() num_rows = 0 total_score = 0 for title in all_titles: vs = analyzer.polarity_scores(title) sentiment_score = vs['compound'] if sentiment_score != 0: num_rows += 1 total_score += sentiment_score if num_rows == 0: avg_score = 25 else: avg_score = round((total_score / num_rows) * 100, 2) db.execute("INSERT INTO news_sentiment VALUES (?, ?, ?)", (ticker_selected, avg_score, date_updated)) conn.commit() print("News sentiment of {} completed!".format(ticker_selected))
def compare(self, ticker, compare_list, order='ticker', verbose=1): """Get screener table of similar property (Sector, Industry, Country) Args: ticker(str): the ticker to compare compare_list(list): choice of compare property (Sector, Industry, Country) or combination. order(str): sort the table by the choice of order verbose(int): choice of visual the progress. 1 for visualize progress Returns: df(pandas.DataFrame): screener information table """ check_list = ['Sector', 'Industry', 'Country'] error_list = [i for i in compare_list if i not in check_list] if len(error_list) != 0: print('Please check: {}'.format(error_list)) raise ValueError() stock = finvizfinance(ticker) stock_fundament = stock.TickerFundament() filters_dict = {} for compare in compare_list: filters_dict[compare] = stock_fundament[compare] self.set_filter(filters_dict=filters_dict) df = self.ScreenerView(order=order, verbose=verbose) return df
def fundamental_data(ticker): stock_info = finvizfinance(ticker) data = {} data = stock_info.TickerFundament() print(data['Company']) print(data['Industry']) print('P/E: ' + data['P/E']) print('EPS: ' + data['EPS (ttm)']) print('S/O: ' + data['Shs Outstand']) print('Beta: ' + data['Beta']) ''' Lets define if the stock is in a positive trend or not to do that, we will use SMA50 and SMA200 if both SMA are positive, we will say the stock is in a Strong positive trend if SMA200 is positive but SMA50 negative, its in a Weak positive trend if both SMA are negative, Strong negative trend finally, if SMA200 negative but SMA50 positive, Weak negative trend There are better ways to define trend, but this will be a useful quick way to do it ''' sma200 = str(data['SMA200']) sma50 = str(data['SMA50']) print('---------------------------') print('SMA200: ' + sma200) print('SMA50: ' + sma50) if sma200.startswith('-'): if sma50.startswith('-'): print(ticker + ' is in a Strong negative trend') else: print(ticker + ' is in a Weak negative trend') else: if sma50.startswith('-'): print(ticker + ' is in a Weak positive trend') else: print(ticker + ' is in a Strong positive trend') #Print Earnings table stock = yf.Ticker(ticker) cash_flows = stock.cashflow cash_flows = cash_flows / 1000000 df = stock.earnings df = df / 1000000 df['Growth (in %)'] = df['Earnings'].pct_change() * 100 sort_df = df.sort_values(by='Year', ascending=False) print('---------------------------') print('Stock earnings in $M:') print(sort_df) print('---------------------------') #Lets do a Free Cash Flow calculation to see how healthy the company is print('Free Cash Flow per year:') ndf = pd.DataFrame() ndf['cfo'] = cash_flows.loc['Total Cash From Operating Activities'] ndf['capex'] = cash_flows.loc['Capital Expenditures'] ndf['fcf'] = ndf['cfo'] + ndf['capex'] print(ndf)
def downSignalChart(): for signal in signals: fticker = Ticker() fticker.set_filter(signal=signal) tickers = fticker.ScreenerView() for ticker in tqdm(tickers): stock = finvizfinance(ticker) stock.TickerCharts(out_dir='../website/src/charts/signal/' + signal)
def app(): st.header("Financial Forecasting for S&P 500 Stocks") st.write( "This section will showcase our LSTM model price prediction, Technical Analysis, News Sentiment Analysis, Analyst's Ratings of your chosen stock." ) st.write( "**Disclaimer: Historical data instead of real-time data are used in this section. We do not ensure the accuracy of our prediction model and shall not be liable for any financial loss for your investment." ) st.markdown("***") st.sidebar.header('User Input Parameters') symbol, start, end = user_input_features() start = pd.to_datetime(start) end = pd.to_datetime(end) #symbol1 = get_symbol(symbol.upper()) #st.header(f""" {symbol1} """) stock = finvizfinance(symbol.lower()) stock_chart = stock.ticker_charts() st.image(stock_chart) # ## Technical Analysis st.subheader("Technical Forecast: ") technical(symbol) ta_1d = pd.read_csv("ta_1d.csv") st.dataframe(ta_1d) st.markdown("***") # ## News Sentiment Analysis st.subheader("News Sentiment Analysis: ") st.table(news_sentiment(symbol).head(5)) st.markdown("***") # ## Analyst Ratings st.subheader("Analyst Ratings: ") st.table(get_analyst_price_targets(symbol)) st.markdown("***") # ##LSTM st.subheader("LSTM Model Prediction: ") st.write( "This section will show how LSTMs can be used to learn the patterns in the stock prices. Using this model you will be able to predict tomorrow’s price of your stock based on the last 10 days prices." ) st.write( "It will take around 5 minutes to generate the result. Please be patient." ) lstm(symbol, start, end) st.markdown("***") st.write( "Disclaimer: The data are collected from Google, Yahoo Finance and Finviz" )
def getFinancials(self): # get from finvizfinance fstock = finvizfinance(self._ticker) self.stock_fundament = fstock.TickerFundament() # get statements statements = Statements() self.income_statement = statements.getStatements(self._ticker, statement="I") self.balance_sheet_statement = statements.getStatements(self._ticker, statement="B")
def getData(self): self.log.logger.debug(" About to retreive " + self.symbol) stock = finvizfinance(self.symbol) self.log.logger.debug(" For: " + self.symbol + " data:" + str(stock.TickerFundament())) df = pd.DataFrame(stock.TickerFundament().items(), columns=['key', 'value']) pd.set_option("display.max_rows", None, "display.max_columns", None) self.log.logger.debug(" Values loaded: \n" + str(df)) self.log.logger.debug(" DONE - Stock Public Data Fetcher " + str(self.symbol)) return df
def get_symbol(symbol): try: stock = finvizfinance(symbol) company_name = stock.ticker_fundament() com = list(company_name.values())[0] return com #url = "http://d.yimg.com/autoc.finance.yahoo.com/autoc?query={}®ion=1&lang=en".format(symbol) #result = requests.get(url).json() #for x in result['ResultSet']['Result']: #if x['symbol'] == symbol: #return x['name'] except Exception as e: return e
def get_finviz_image(ticker: str) -> bytes: """Get finviz image for given ticker Parameters ---------- ticker : str ticker Returns ------- bytes Image in byte format """ stock = finvizfinance(ticker) image_url = stock.ticker_charts(urlonly=True) r = requests.get(image_url, stream=True, headers=headers, timeout=5) r.raise_for_status() r.raw.decode_content = True return r.content
def getIntradayData(self): self.log.logger.debug(" About to retreive " + self.symbol) stock = finvizfinance(self.symbol) self.log.logger.debug(" For: " + self.symbol + " data:" + str(stock.TickerFundament())) df = pd.DataFrame() # df = pd.DataFrame(columns=['stock', 'price', '%Change', '%Volume']) df = df.append( { 'stock': self.symbol, 'price': stock.TickerFundament().get('Price'), '%Change': float(stock.TickerFundament().get('Change').strip('%')) / 100, '%Volume': float(stock.TickerFundament().get('Rel Volume')) }, ignore_index=True) self.log.logger.debug(" Values loaded: \n" + str(df)) self.log.logger.debug( " DONE - Stock Intraday Public Data Fetcher " + str(self.symbol)) return df
import pandas as pd import nltk import matplotlib.pyplot as plt from nltk.stem import WordNetLemmatizer from nltk.sentiment.vader import SentimentIntensityAnalyzer nltk.download('vader_lexicon') from finvizfinance.quote import finvizfinance stock = finvizfinance('tsla') df = stock.TickerNews() df = df[['Date', 'Title']] senti = SentimentIntensityAnalyzer() def get_sentiment_score(review): try: compound_score = senti.polarity_scores(review)['compound'] return compound_score except: return "error" df["Sentiment_score"] = df["Title"].apply(get_sentiment_score) df2 = df[df['Sentiment_score'] != 0] df2 = df2.reset_index(drop=True) plt.figure(figsize=(10, 8)) plt.plot('Date', 'Sentiment_score', data=df2) plt.xticks(rotation=50) plt.show()
def get_symbol(symbol): stock = finvizfinance(symbol) company_name = stock.ticker_fundament() com = list(company_name.values())[0] return com
def app(): st.write(""" # S&P 500 Stock Analyzer Shown below are the **Fundamentals**, **News Sentiment**, **Bollinger Bands** and **Comprehensive Report (Compared with SPY as a whole as benchmark)** of your selected stock! """) st.markdown("***") st.sidebar.header('User Input Parameters') symbol, start, end = user_input_features() start = pd.to_datetime(start) end = pd.to_datetime(end) #symbol1 = get_symbol(symbol.upper()) #st.subheader(symbol1) stock = finvizfinance(symbol.lower()) stock_chart = stock.ticker_charts() st.image(stock_chart) # Read data data = yf.download(symbol, start, end, threads=False) # ## SMA and EMA #Simple Moving Average data['SMA'] = talib.SMA(data['Adj Close'], timeperiod=20) # Exponential Moving Average data['EMA'] = talib.EMA(data['Adj Close'], timeperiod=20) # Plot st.subheader(f""" Simple Moving Average vs. Exponential Moving Average\n {symbol} """) st.line_chart(data[['Adj Close', 'SMA', 'EMA']]) # Bollinger Bands data['upper_band'], data['middle_band'], data['lower_band'] = talib.BBANDS( data['Adj Close'], timeperiod=20) # Plot st.subheader(f""" Bollinger Bands\n {symbol} """) st.line_chart( data[['Adj Close', 'upper_band', 'middle_band', 'lower_band']]) # ## MACD (Moving Average Convergence Divergence) # MACD data['macd'], data['macdsignal'], data['macdhist'] = talib.MACD( data['Adj Close'], fastperiod=12, slowperiod=26, signalperiod=9) # Plot st.subheader(f""" Moving Average Convergence Divergence\n {symbol} """) st.line_chart(data[['macd', 'macdsignal']]) # ## RSI (Relative Strength Index) # RSI data['RSI'] = talib.RSI(data['Adj Close'], timeperiod=14) # Plot st.subheader(f""" Relative Strength Index\n {symbol} """) st.line_chart(data['RSI']) st.markdown("***") st.subheader("Fundamentals: ") st.dataframe(get_fundamentals(symbol)) st.markdown("***") # ## Latest News st.subheader("Latest News: ") st.table(get_news(symbol).head(5)) st.markdown("***") # ## Recent Insider Trades st.subheader("Recent Insider Trades: ") st.table(get_insider(symbol).head(5)) st.markdown("***") st.write("Generating comprehensive stock report...") st.write("**please wait for some time... **") st.write( "This section will compare the historical performance of your selected stock with SPDR S&P 500 Trust ETF (Ticker: SPY) as benchmark." ) stock_report(symbol) # ## Stock report st.subheader(f"""**{symbol} Stock Report**""") #st.header(symbol + " Stock Report") HtmlFile = open("report.html", 'r', encoding='utf-8') source_code = HtmlFile.read() #print(source_code) components.html(source_code, height=9000) st.write( "Disclaimer: The data are collected from Google, Yahoo Finance and Finviz" )
def latest_news(request): """ Show news and sentiment of ticker in /latest_news?quote={TICKER}. Data from Finviz This is more detailed (graphs included) than sub_news() Note: News are only available if hosted locally. Read README.md for more details """ ticker_selected = default_ticker(request) ticker = yf.Ticker(ticker_selected) information = check_market_hours(ticker, ticker_selected) # To check if input is a valid ticker if "symbol" in information: ticker_fin = finvizfinance(ticker_selected) news_df = ticker_fin.TickerNews() news_df["Date"] = news_df["Date"].dt.date link = news_df["Link"].to_list() del news_df["Link"] sentiment_list = list() all_news = news_df['Title'].tolist() for title in all_news: vs = analyzer.polarity_scores(title) sentiment_score = vs['compound'] if sentiment_score > 0.25: sentiment = "Bullish" elif sentiment_score < -0.25: sentiment = "Bearish" else: sentiment = "Neutral" sentiment_list.append(sentiment) news_df["Sentiment"] = sentiment_list num_rows = 0 total_score = 0 latest_date = news_df["Date"].unique()[0] today_news = news_df[news_df['Date'] == latest_date]['Title'].tolist() for title in today_news: vs = analyzer.polarity_scores(title) sentiment_score = vs['compound'] if sentiment_score != 0: num_rows += 1 total_score += sentiment_score if num_rows == 0: avg_score = 25 else: avg_score = round((total_score / num_rows) * 100, 2) db.execute("UPDATE news_sentiment SET sentiment=? WHERE ticker=? AND date_updated=?", (avg_score, ticker_selected, str(datetime.now()).split()[0])) conn.commit() db.execute("SELECT * FROM news_sentiment WHERE date_updated=?", (str(datetime.now()).split()[0],)) ticker_sentiment = db.fetchall() days = 1 while not ticker_sentiment: db.execute("SELECT * FROM news_sentiment WHERE date_updated=?", (str(datetime.now()-timedelta(days=days)).split()[0],)) ticker_sentiment = db.fetchall() days += 1 ticker_sentiment = list(map(list, ticker_sentiment)) return render(request, 'news_sentiment.html', {"ticker_selected": ticker_selected, "information": information, "news_df": news_df.to_html(index=False), "link": link, "ticker_sentiment": ticker_sentiment, "latest_date": latest_date, "avg_score": avg_score}) else: included_list = ", ".join(sorted(full_ticker_list())) return render(request, 'news_sentiment.html', {"ticker_selected": ticker_selected, "included_list": included_list, "error": "error_true"})
def test_finvizfinance_finvizfinance(): stock = finvizfinance('tsla') stock_info = stock.ticker_full_info() assert (stock_info is not None)
def get_fundamentals(ticker): return finvizfinance(ticker).TickerFundament()
import pandas as pd from finvizfinance.quote import finvizfinance pd.set_option('display.max_columns', None) stocks = pd.read_csv('ownership(NASDAQ).csv') stocks = stocks[['Ticker', 'Inst Own']] stocks.dropna(inplace=True) I_filter = stocks['Inst Own'] > 0.9 I_select_stocks = stocks[I_filter]['Ticker'].values print(len(I_select_stocks), I_select_stocks) full_news_list = [] for i in I_select_stocks: pstock = finvizfinance(str(i)) news_df = pstock.TickerNews() news_df['symbol'] = str(i) print(str(i)) full_news_list.append(news_df) full_news = pd.concat(full_news_list) print(full_news) # full_news.to_csv('news.csv', index=False)
def test_finvizfinance_finvizfinance_chart_invalid(mocker): mocker.patch('finvizfinance.quote.finvizfinance._checkexist', return_value=True) mocker.patch('finvizfinance.quote.web_scrap', return_value="") with pytest.raises(ValueError, match=r"Invalid timeframe 'dummy'"): finvizfinance('tsla').ticker_charts(timeframe='dummy')
def test_finvizfinance_quote(): stock = finvizfinance('tsla') stock_info = stock.TickerFullInfo() assert (stock_info is not None)
def fetchChart(): for ticker in tqdm(ticker_list): stock = finvizfinance(ticker) stock.TickerCharts(out_dir='../website/src/charts/watchlist')