Python фондовый скрининг не перестанет работать - PullRequest
3 голосов
/ 25 апреля 2020

Новый кодер и первый раз выкладываю вопрос. Я был бы очень признателен за помощь в проверке акций, которую я пытаюсь запустить. По сути, я извлекаю несколько биржевых тикеров (около 7000) из CSV-файла, а затем собираю данные по каждой из акций Finviz (веб-сайт финансовых данных). Тогда у меня есть несколько критериев, которые я изложил на основе инвестиционной книги. Код, вероятно, выглядит ужасно, поэтому я очень открыт для обратной связи, если у вас есть возможность взглянуть на него.

Проблема в том, что я до сих пор не заставил его работать. Я не имею в виду, что он останавливается и возникает ошибка, я имею в виду, что он продолжает работать вечно. Должна быть какая-то часть моего кода, которая заставляет его так долго. Любая помощь будет оценена. Код ниже:

import pandas as pd
import numpy as np

# Stock ticker URLs
# Local path
stock_tickers = r'local path/stock_symbols.csv'
df = pd.read_csv(stock_tickers)

stocks = df['Symbol'].tolist()

from bs4 import BeautifulSoup as bs
import requests


def get_fundemental_data(df):
    for symbol in df.index:
        try:
            url = ('http://finviz.com/quote.ashx?t=' + symbol.lower())
            soup = bs(requests.get(url).content, features="lxml")
            for m in df.columns:
                df.loc[symbol, m] = fundemental_metric(soup, m)
        except Exception as e:
            print(symbol, 'not found')
    return df


def fundemental_metric(soup, metric):
    return soup.find(text=metric).find_next(class_='snapshot-td2').text


metric = ['P/B',
          'P/E',
          'Market Cap',
          'Current Ratio',
          'Forward P/E',
          'PEG',
          'Debt/Eq',
          'EPS (ttm)',
          'Dividend %',
          'ROE',
          'ROI',
          'EPS Q/Q',
          'Insider Own'
          ]

df = pd.DataFrame(index=stocks, columns=metric)
df = get_fundemental_data(df)

# CLEAN UP THE DATA

# Replace '-' and '' values with NaN
df = df.replace('-', np.NaN)
df = df.replace('', np.NaN)

# Some metrics have 'B' or 'M' at the end to indicate billions or millions of $
# Convert all those values to floats measured in billions of $
df.loc[df['Market Cap'].str.strip().str[-1] == 'M', 'Market Cap'] = df['Market Cap'].str.strip().str[:-1].astype(float)\
                                                                   / 1000
df.loc[df['Market Cap'].str.strip().str[-1] == 'B', 'Market Cap'] = df['Market Cap'].str.strip().str[:-1].astype(float)

# Remove "%" signs
df['ROI'] = (df['ROI'].str[:-1])
df['ROE'] = (df['ROE'].str[:-1])
df['Dividend %'] = (df['Dividend %'].str[:-1])
df['EPS Q/Q'] = (df['EPS Q/Q'].str[:-1])
df['Insider Own'] = (df['Insider Own'].str[:-1])
df['Inst Own'] = (df['Inst Own'].str[:-1])

# Convert all values to floats
df = df.astype(float)

# Create a new DF for easy manipulation
df_II = df

# INTELLIGENT INVESTOR CRITERIA #

# Businesses which are "adequately sized" (i.e. market cap of >$2 billion)
df_II = df_II[(df_II['Market Cap'] > 2)]

# Businesses with a 'strong financial condition' (i.e. current ratio > 3:2)
df_II = df_II[(df_II['Current Ratio'] >= 1.5)]

# Price of stock no more than 1.5 times net asset value. Price-to-book ratio is less than 1.5
df_II = df_II[(df_II['P/B'] <= 1.5)]

# Business has demonstrated earning power (i.e. EPS Q/Q > 10%)
df_II = df_II[(df_II['EPS Q/Q'] > 10)]

# Business earns good returns on equity while employing little or no debt (i.e. Debt/Equity < 1 & ROE > 10%)
df_II = df_II[(df['Debt/Eq'] < 1) & (df_II['ROE'] > 10)]

# Management having substantial ownership in the business (i.e. Insider ownership > 15%)
df_II = df_II[(df_II['Insider Own'] > 15)]

xl_filepath = r'local file path/BG_StockPicks.xlsx'
df_II.to_excel(xl_filepath, index=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...