在投资的世界里,做出明智的决策往往需要深入理解公司的基本面。Python,作为一门强大的编程语言,为我们提供了一个高效、灵活的工具来分析股票的基本面数据,从而帮助我们更好地评估公司的内在价值和投资潜力。今天,就让我们一起探索如何利用Python进行股票基本面分析。
一、股票基本面分析的核心指标
股票基本面分析涉及多个关键指标,这些指标为我们提供了评估公司财务状况和市场表现的多维度视角。以下是一些常用的核心指标:
- EPS(每股收益):反映公司每股普通股分摊的净利润,是衡量公司盈利能力的重要指标。
- P/E(市盈率):反映公司股票价格与每股收益的比率,用于评估股票的估值水平。较高的市盈率可能意味着股票被高估,而较低的市盈率则可能表示股票被低估。
- PEG(预期收益增长比率):通过将市盈率除以公司未来12个月预期收益增长率计算得出。一般情况下,PEG低于1表示股票可能被低估,而PEG高于2则可能表示股票被高估。
- PB(市净率):反映公司股票价格与每股净资产的比率。市净率为1表示股票按账面价值交易,高于1表示溢价交易,低于1则可能表示股票被低估。
- ROE(股本回报率):衡量公司利用股东权益创造利润的能力。较高的ROE表明公司有效利用股东资金,可能带来股票需求增加和股价上涨。
- P/S(市销率):反映公司市值与其销售收入的比率,帮助评估公司股票的合理价值,特别适用于尚未盈利或因暂时性问题表现不佳的成长型公司。
- DPR(股息支付比率):反映公司支付的总股息与其净收入的比率,表示公司盈利中有多少用于支付股息。
- DY(股息收益率):反映公司每年支付的股息与其股票价格的比率,表示投资者通过股息获得的回报率。
- CR(流动比率):衡量公司以其流动资产偿还流动负债的能力。较高的流动比率通常表示公司具有较好的流动性。
- Beta(贝塔系数):衡量股票相对于整体市场波动性的指标。贝塔值高于1.0表示股票波动性大于市场,而贝塔值低于1.0表示股票波动性小于市场。
- 52周范围:指示股票在过去52周内的价格区间,帮助投资者了解股票当前价格相对于其年度高点和低点的位置。例如,90%表示股票价格接近其52周高点。
这些指标为我们提供了评估公司财务状况和市场表现的多维度视角,帮助我们更全面地了解公司的投资价值。
二、使用Python进行股票基本面分析
1. 获取股票数据
要进行股票基本面分析,首先需要获取相关的股票数据。我们可以使用Python的yfinance库从雅虎财经获取股票的基本面数据。以下是一个简单的示例,展示如何获取股票数据并保存为JSON格式的文件:
import yfinance as yf
import pandas as pd
import json
import os
# 定义股票符号列表
tickers = ['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'FB']
# 定义数据路径
data_path = 'stock_data'
os.makedirs(data_path, exist_ok=True)
# 定义一个函数,用于获取股票数据并保存为JSON文件
def get_stock_data(ticker):
stock = yf.Ticker(ticker)
financials = stock.financials
balance_sheet = stock.balance_sheet
cashflow = stock.cashflow
stats = stock.stats()
data = {
'financials': financials.to_dict(),
'balance_sheet': balance_sheet.to_dict(),
'cashflow': cashflow.to_dict(),
'stats': stats
}
with open(os.path.join(data_path, f'{ticker}_fundamental.json'), 'w') as f:
json.dump(data, f)
# 获取所有股票的数据
for ticker in tickers:
get_stock_data(ticker)
print(f'已获取并保存 {ticker} 的股票数据')
2. 数据处理与分析
获取到股票数据后,我们需要对数据进行处理和分析。以下是一个示例,展示如何加载数据并进行基本的分析:
import pandas as pd
import numpy as np
# 定义一个函数,用于从JSON文件中加载数据
def load_stock_data(ticker):
with open(os.path.join(data_path, f'{ticker}_fundamental.json'), 'r') as f:
data = json.load(f)
return data
# 定义一个数据字典,用于存储每个指标的数据
data_dict = {
'EPS': [],
'P/E': [],
'PEG': [],
'PB': [],
'ROE': [],
'P/S': [],
'DPR': [],
'DY': [],
'CR': [],
'Beta': [],
'52周范围': []
}
# 加载每个股票的数据并填充到数据字典中
for ticker in tickers:
data = load_stock_data(ticker)
eps = data['financials']['Earnings Per Share'].get('2022-12-31', None)
pe = data['stats'].get('trailingPE', None)
peg = data['stats'].get('pegRatio', None)
pb = data['stats'].get('priceToBook', None)
roe = data['financials']['Return on Equity'].get('2022-12-31', None)
ps = data['stats'].get('priceToSales', None)
dpr = data['financials']['Dividend Yield'].get('2022-12-31', None)
dy = data['stats'].get('dividendYield', None)
cr = data['financials']['Current Ratio'].get('2022-12-31', None)
beta = data['stats'].get('beta', None)
fifty_two_week_range = data['stats'].get('fiftyTwoWeekRange', None)
data_dict['EPS'].append(eps)
data_dict['P/E'].append(pe)
data_dict['PEG'].append(peg)
data_dict['PB'].append(pb)
data_dict['ROE'].append(roe)
data_dict['P/S'].append(ps)
data_dict['DPR'].append(dpr)
data_dict['DY'].append(dy)
data_dict['CR'].append(cr)
data_dict['Beta'].append(beta)
data_dict['52周范围'].append(fifty_two_week_range)
# 创建DataFrame并处理缺失值
df = pd.DataFrame(data_dict, index=tickers)
df = df.replace({np.nan: None})
# 显示DataFrame
print(df)
3. 数据可视化
为了更直观地展示股票的基本面数据,我们可以使用matplotlib或seaborn等库进行数据可视化。以下是一个示例,展示如何创建股票基本面指标的可视化图表:
import matplotlib.pyplot as plt
import seaborn as sns
# 设置图表样式
plt.style.use('ggplot')
sns.set_palette('Set2')
# 创建一个包含所有指标的图表
fig, axes = plt.subplots(nrows=3, ncols=4, figsize=(20, 15))
fig.suptitle('股票基本面指标分析', fontsize=16, y=1.02)
# 绘制每个指标的柱状图
indicators = ['EPS', 'P/E', 'PEG', 'PB', 'ROE', 'P/S', 'DPR', 'DY', 'CR', 'Beta', '52周范围']
for i, indicator in enumerate(indicators):
row = i // 4
col = i % 4
ax = axes[row, col]
sns.barplot(x=df.index, y=df[indicator], ax=ax)
ax.set_title(indicator)
ax.set_xlabel('')
ax.set_ylabel('')
# 调整布局并显示图表
plt.tight_layout()
plt.show()
三、实战案例:基于基本面指标的选股模型
1. 莫伦卡选股模型
莫伦卡选股模型是一个基于基本面分析的选股框架,它通过设定一系列指标来评估股票的投资价值。以下是一个基于莫伦卡选股模型的Python实现,用于筛选出符合条件的股票:
import akshare as ak
import pandas as pd
import datetime
# 获取A股上市公司实时行情数据
stock_zh_a_spot_df = ak.stock_zh_a_spot()
# 选取前300支股票进行测试
df_stock = stock_zh_a_spot_df[['code', 'name']][63:200]
# 定义一个函数,用于评估单个股票是否符合莫伦卡选股模型的条件
def evaluate_stock(stock_code):
# 指标1:过去5年平均净资产收益率高于14%
df_financial = ak.stock_financial_analysis_indicator(stock=stock_code)
df1 = df_financial[df_financial.index > '2015-01-01']['净资产收益率(%)']
df1_sum = df1.replace('--', 0).astype(float).sum(axis=0, skipna=True)
df1_count = df1.count()
var1 = (df1_sum / df1_count) > 14
# 指标2:市盈率低于30且大于0
day = datetime.datetime.now() - datetime.timedelta(days=30)
date_start = datetime.datetime(day.year, day.month, day.day, 0, 0, 0)
df_indicator = ak.stock_a_lg_indicator(stock=stock_code)
df2_mean = df_indicator[df_indicator.trade_date > date_start].pe.mean()
var2 = df2_mean > 0 and df2_mean < 30
# 指标3:经营现金流为正
var3 = float(df_financial['每股经营性现金流(元)'].iat[1]) > 0
# 指标4:新期的净利润大于前5年的净利润
var4_1 = float(df_financial['扣除非经常性损益后的净利润(元)'].iat[1]) / 10000
var4_2 = df_financial['扣除非经常性损益后的净利润(元)'].iloc[2:8].astype(float).max() / 10000
var4 = var4_1 > var4_2
# 综合评估
var_all = var1 and var2 and var3 and var4
return var_all
# 对每支股票进行评估
result = []
for index, row in df_stock.iterrows():
stock_code = row['code']
stock_name = row['name']
is_good_stock = evaluate_stock(stock_code)
result.append({'code': stock_code, 'name': stock_name, 'is_good_stock': is_good_stock})
# 创建结果DataFrame
df_result = pd.DataFrame(result)
print(df_result)
2. 结果分析
通过上述代码,我们可以得到一个包含股票代码、名称以及是否符合莫伦卡选股模型条件的结果表。我们可以进一步分析这些结果,找出符合条件的优质股票。
# 筛选出符合条件的股票
good_stocks = df_result[df_result['is_good_stock'] == True]
print('符合条件的股票:')
print(good_stocks)
四、总结
Python在股票基本面分析中发挥着重要作用,通过获取、处理和分析股票数据,我们可以更科学地评估公司的投资价值。本文介绍了如何使用Python获取股票数据、计算关键指标、进行数据可视化以及构建选股模型。希望这些内容能帮助你在投资决策中更好地运用Python工具。
如果你对这段内容有疑问或需要进一步的帮助,欢迎随时在下方评论区留言交流!