Python 股票基本面分析:数据驱动的搞钱密码

303 阅读8分钟

在投资的世界里,做出明智的决策往往需要深入理解公司的基本面。Python,作为一门强大的编程语言,为我们提供了一个高效、灵活的工具来分析股票的基本面数据,从而帮助我们更好地评估公司的内在价值和投资潜力。今天,就让我们一起探索如何利用Python进行股票基本面分析。

一、股票基本面分析的核心指标

股票基本面分析涉及多个关键指标,这些指标为我们提供了评估公司财务状况和市场表现的多维度视角。以下是一些常用的核心指标:

  1. EPS(每股收益):反映公司每股普通股分摊的净利润,是衡量公司盈利能力的重要指标。
  2. P/E(市盈率):反映公司股票价格与每股收益的比率,用于评估股票的估值水平。较高的市盈率可能意味着股票被高估,而较低的市盈率则可能表示股票被低估。
  3. PEG(预期收益增长比率):通过将市盈率除以公司未来12个月预期收益增长率计算得出。一般情况下,PEG低于1表示股票可能被低估,而PEG高于2则可能表示股票被高估。
  4. PB(市净率):反映公司股票价格与每股净资产的比率。市净率为1表示股票按账面价值交易,高于1表示溢价交易,低于1则可能表示股票被低估。
  5. ROE(股本回报率):衡量公司利用股东权益创造利润的能力。较高的ROE表明公司有效利用股东资金,可能带来股票需求增加和股价上涨。
  6. P/S(市销率):反映公司市值与其销售收入的比率,帮助评估公司股票的合理价值,特别适用于尚未盈利或因暂时性问题表现不佳的成长型公司。
  7. DPR(股息支付比率):反映公司支付的总股息与其净收入的比率,表示公司盈利中有多少用于支付股息。
  8. DY(股息收益率):反映公司每年支付的股息与其股票价格的比率,表示投资者通过股息获得的回报率。
  9. CR(流动比率):衡量公司以其流动资产偿还流动负债的能力。较高的流动比率通常表示公司具有较好的流动性。
  10. Beta(贝塔系数):衡量股票相对于整体市场波动性的指标。贝塔值高于1.0表示股票波动性大于市场,而贝塔值低于1.0表示股票波动性小于市场。
  11. 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. 数据可视化

为了更直观地展示股票的基本面数据,我们可以使用matplotlibseaborn等库进行数据可视化。以下是一个示例,展示如何创建股票基本面指标的可视化图表:

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工具。

如果你对这段内容有疑问或需要进一步的帮助,欢迎随时在下方评论区留言交流!