Exemplo n.º 1
0
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')
Exemplo n.º 2
0
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', '')
Exemplo n.º 3
0
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("")
Exemplo n.º 4
0
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"})
Exemplo n.º 5
0
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))
Exemplo n.º 6
0
    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)
Exemplo n.º 8
0
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)
Exemplo n.º 9
0
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"
    )
Exemplo n.º 10
0
    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")
Exemplo n.º 11
0
 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
Exemplo n.º 12
0
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={}&region=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
Exemplo n.º 13
0
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
Exemplo n.º 14
0
 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
Exemplo n.º 15
0
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()
Exemplo n.º 16
0
def get_symbol(symbol):
    stock = finvizfinance(symbol)
    company_name = stock.ticker_fundament()
    com = list(company_name.values())[0]

    return com
Exemplo n.º 17
0
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"
    )
Exemplo n.º 18
0
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"})
Exemplo n.º 19
0
def test_finvizfinance_finvizfinance():
    stock = finvizfinance('tsla')
    stock_info = stock.ticker_full_info()
    assert (stock_info is not None)
Exemplo n.º 20
0
def get_fundamentals(ticker):
    return finvizfinance(ticker).TickerFundament()
Exemplo n.º 21
0
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)
Exemplo n.º 22
0
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')
Exemplo n.º 23
0
def test_finvizfinance_quote():
    stock = finvizfinance('tsla')
    stock_info = stock.TickerFullInfo()
    assert (stock_info is not None)
Exemplo n.º 24
0
def fetchChart():
    for ticker in tqdm(ticker_list):
        stock = finvizfinance(ticker)
        stock.TickerCharts(out_dir='../website/src/charts/watchlist')