Python股票筛选器赢得';不要停止跑步
新的程序员和第一次发布问题。我真的很想得到一些关于我正在尝试运行的股票筛选程序的帮助。基本上,我从CSV文件中提取了一堆股票代码(大约7000个),然后从Finviz(金融数据网站)中获取每个股票的数据。然后我根据一本投资书制定了一些标准。代码可能看起来很糟糕,所以如果你有机会看一下的话,我非常乐意接受反馈 问题是,我还没有让它工作。我不是说它停止了,出现了一个错误,我是说它一直在运行。我的代码中一定有一部分花费了这么长时间。任何帮助都将不胜感激。代码如下:Python股票筛选器赢得';不要停止跑步,python,finance,stock,Python,Finance,Stock,新的程序员和第一次发布问题。我真的很想得到一些关于我正在尝试运行的股票筛选程序的帮助。基本上,我从CSV文件中提取了一堆股票代码(大约7000个),然后从Finviz(金融数据网站)中获取每个股票的数据。然后我根据一本投资书制定了一些标准。代码可能看起来很糟糕,所以如果你有机会看一下的话,我非常乐意接受反馈 问题是,我还没有让它工作。我不是说它停止了,出现了一个错误,我是说它一直在运行。我的代码中一定有一部分花费了这么长时间。任何帮助都将不胜感激。代码如下: import pandas as p
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)
将熊猫作为pd导入
将numpy作为np导入
#股票代码URL
#本地路径
stock\u tickers=r'local path/stock\u symbols.csv'
df=pd.read\u csv(股票行情)
stocks=df['Symbol'].tolist()
从bs4导入BeautifulSoup作为bs
导入请求
def获取基本数据(df):
对于df.index中的符号:
尝试:
url=('http://finviz.com/quote.ashx?t=“+symbol.lower())
soup=bs(requests.get(url.content,features=“lxml”)
对于df.columns中的m:
df.loc[符号,m]=基本度量(单位,m)
例外情况除外,如e:
打印(符号“未找到”)
返回df
def基本计量单位(汤,计量单位):
返回soup.find(text=metric).find_next(class='snapshot-td2').text
指标=['P/B',
“市盈率”,
“市值”,
“流动比率”,
“远期市盈率”,
"挂",,
“债务/Eq”,
“每股收益(ttm)”,
“股息%”,
“ROE”,
“投资回报率”,
“EPS Q/Q”,
“内部人自己的”
]
df=pd.DataFrame(指数=股票,列=度量)
df=获取基本数据(df)
#清理数据
#将“-”和“”值替换为NaN
df=df.replace('-',np.NaN)
df=df.替换(“”,np.NaN)
#一些指标的末尾有“B”或“M”,表示数十亿或数百万的数据$
#将所有这些值转换为以十亿为单位的浮点值$
df.loc[df['Market Cap'].str.strip().str[-1]='M','Market Cap']=df['Market Cap'].str.strip().str[-1].aType(浮动)\
/ 1000
df.loc[df['Market Cap'].str.strip().str[-1]='B','Market Cap']=df['Market Cap'].str.strip().str[-1].aType(浮动)
#删除“%”符号
df['ROI']=(df['ROI'].str[:-1])
df['ROE']=(df['ROE'].str[:-1])
df['divident%']=(df['divident%].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])
#将所有值转换为浮点数
df=df.astype(浮动)
#创建一个新的DF以便于操作
df_II=df
#智能投资者标准#
#“足够规模”的企业(即市值>20亿美元)
df_II=df_II[(df_II[‘市值’]>2)]
#“财务状况良好”(即流动比率>3:2)的企业
df_II=df_II[(df_II[‘流动比率’]>=1.5)]
#股票价格不超过资产净值的1.5倍。价格与账面比率小于1.5
df_II=df_II[(df_II['P/B']10%)
df_II=df_II[(df_II['EPS Q/Q']>10)]
#企业在几乎不负债或不负债的情况下获得良好的权益回报(即负债/权益<1%和净资产收益率>10%)
df_II=df_II[(df[‘债务/均衡’]<1)和(df_II[‘股本回报率’]>10)]
#对企业拥有实质所有权的管理层(即内部人所有权>15%)
df_II=df_II[(df_II[‘内部人拥有’]>15)]
xl_filepath=r'local file path/BG_StockPicks.xlsx'
df_II.到excel(xl_文件路径,索引=False)
要收集更多信息,您可以添加一些日志记录(一些打印语句暂时可以使用)查看程序的运行位置。您也可以在调试模式下运行它,并在整个过程中添加断点,以查看哪些调用占用的时间最多。您可能还想了解制作数据帧副本的相关信息,特别是python中的按引用传递。我不确定代码df_II=df的行为是否完全符合您的预期错误,具体问题。至少找出代码挂起的位置,然后构建尽可能短的挂起方式相同的程序(在不做更改的情况下运行时,删除所有不需要严格复制确切问题的内容)。请参阅帮助中心中的定义和“修剪提示”至少,您可能想看看是否有办法在一个可下载的文件中获取所有股票信息,然后进行处理。发出7000个独立请求不太可能执行得很好,或者服务提供商会非常友好地关注:-)您必须提供stock_symbols.csv的布局。仅从财务角度来看,您可能希望首先将股票分为多个部门,然后设置特定于部门的标准。要收集更多信息,可以添加一些日志记录(一些打印语句暂时可以使用)查看程序的运行位置。您也可以在调试模式下运行它,并在整个过程中添加断点,以查看哪些调用占用的时间最多。您可能还想了解制作数据帧副本的相关信息,特别是python中的按引用传递。我不确定代码df_II=df的行为是否完全符合您的预期错误,具体问题。至少找出代码挂起的位置,然后构建尽可能短的挂起方式相同的程序(在不做更改的情况下运行时,删除所有不需要严格复制确切问题的内容)。请参阅帮助中心中的定义和“修剪提示”至少,您可能想看看是否有办法在一个可下载的文件中获取所有股票信息,然后进行处理。发出7000个独立请求不太可能执行得很好,或者服务提供商会非常友好地关注:-)您必须提供stock_symbols.csv的布局。仅从财务角度来看,您可能希望首先将股票分为多个板块,然后再设置s