-
背景介绍:
-
2024年人工智能概念火热,作者认为需要提前布局人工智能概念股。
-
使用三因子模型(资本资产定价模型的衍生版)来评估这些股票的投资价值。
-
-
数据获取:
-
从华西证券网站爬取人工智能概念股的名单。
-
使用
akshare
库获取这些股票的历史交易数据。
-
-
数据处理:
-
将爬取的股票代码和名称存储在字典和列表中。
-
自定义函数从
akshare
获取股票的历史交易数据,并计算收益率。
-
-
三因子模型应用:
-
读取本地存储的三因子数据(市场风险因子、规模风险因子、账面市值比风险因子)。
-
使用三因子模型对每个股票进行回归分析,计算阿尔法(超额收益)、贝塔(市场风险因子)、SMB(市值因子)、HML(账面市值因子)等指标。
-
-
资产表现评价:
-
自定义函数计算实际总收益率、最大回撤率、夏普比率、信息比率、负偏态收益、下跌波动比率等指标。
-
循环遍历所有股票,计算并存储这些指标。
-
-
结果分析:
-
选出阿尔法值前十的股票进行分析和画图。
-
通过对比各股票的阿尔法值、贝塔值、市值因子、账面市值因子、实际总收益率、最大回撤率、夏普比率和信息比率等指标,分析不同股票的表现。
-
-
结果存储:
-
将分析结果存储为CSV文件。
-
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import statsmodels.api as sm import requests from bs4 import BeautifulSoup import akshare as ak import os plt.rcParams['font.sans-serif'] = 'SimHei' # 显示中文 plt.rcParams['axes.unicode_minus'] = False # 显示负号 # 获取人工智能概念股票 def get_code(url): response = requests.get(url) response.encoding = 'utf-8' soup = BeautifulSoup(response.text, 'html.parser') tables = soup.find_all('table', {'class': 'am-table am-table-bordered am-table-striped am-text-nowrap'}) dfs = pd.DataFrame() for table in tables: headings = [th.get_text().strip() for th in table.find('thead').find_all('th')] data = [] for row in table.find('tbody').find_all('tr'): cells = row.find_all('td') if len(cells) > 0: data_row = [] for cell in cells: a_tag = cell.find('a') if a_tag: data_row.append(a_tag.get_text().strip()) else: data_row.append(cell.get_text().strip()) data.append(data_row) df = pd.DataFrame(data=data, columns=headings) dfs = pd.concat([dfs, df], axis=0, ignore_index=True) return dfs url = 'https://m.hx168.com.cn/stock/concept/BK2196.html' dfs = get_code(url) code_name = dict(zip(dfs['股票代码'], dfs['股票简称'])) code_list = dfs['股票代码'].to_list() # 获取股票交易数据 def get_stock_data(stock_code, start_date, end_date): stock_df = ak.stock_zh_a_hist(symbol=stock_code, period="daily", start_date=start_date, end_date=end_date, adjust="qfq") stock_df['收益率'] = stock_df['收盘'].pct_change() return stock_df.dropna() return_dict = {} for code in code_list: try: return_dict[code] = get_stock_data(stock_code=code, start_date='20230201', end_date='20240201')[['日期', '收盘', '收益率']].set_index('日期') except: pass # 读取或创建三因子数据 file_path = 'fivefactor_daily.csv' if not os.path.exists(file_path): # 创建示例三因子数据 dates = pd.date_range(start='2023-02-01', end='2024-02-01', freq='D') np.random.seed(0) data = { 'trddy': dates, 'mkt_rf': np.random.normal(0, 0.01, len(dates)), 'smb': np.random.normal(0, 0.01, len(dates)), 'hml': np.random.normal(0, 0.01, len(dates)) } three_factors = pd.DataFrame(data).rename(columns={'trddy': '日期'}).set_index('日期') three_factors.to_csv(file_path) else: three_factors = pd.read_csv(file_path)[['trddy', 'mkt_rf', 'smb', 'hml']].rename(columns={'trddy': '日期'}).set_index('日期') three_factors = three_factors.loc['2023-02-01':'2024-02-01', :] three_factors.index = pd.to_datetime(three_factors.index) # 资产表现评价函数 def sum_return_ratio(price_list): price_list = price_list.to_numpy() return (price_list[-1] - price_list[0]) / price_list[0] def MaxDrawdown(price_list): i = np.argmax((np.maximum.accumulate(price_list) - price_list) / np.maximum.accumulate(price_list)) if i == 0: return 0 j = np.argmax(price_list[:i]) return (price_list[j] - price_list[i]) / (price_list[j]) def sharpe_ratio(price_list, rf=0.000041): daily_return = price_list.pct_change() return (daily_return.mean() - rf) / daily_return.std() def Information_Ratio(price_list, rf=0.000041): chaoer = sum_return_ratio(price_list) - ((1 + rf) ** 365 - 1) return chaoer / np.std(price_list.pct_change() - rf) def skewness_return(price_list): daily_return = price_list.pct_change() return daily_return.skew() def downside_upside_volatility_ratio(price_list): daily_return = price_list.pct_change() returns_down = daily_return[daily_return < 0] returns_up = daily_return[daily_return > 0] n_down = len(returns_down) n_up = len(returns_up) sum_squared_returns_down = (returns_down ** 2).sum() sum_squared_returns_up = (returns_up ** 2).sum() if n_down == 0 or n_up == 0: return np.nan duvol = np.log((n_up * sum_squared_returns_down) / (n_down * sum_squared_returns_up)) return duvol # 计算资产表现指标 def deal(code=''): day_return = return_dict[code] day_return.index = pd.to_datetime(day_return.index) zgpa_threefactor = pd.merge(three_factors, day_return, left_index=True, right_index=True) result = sm.OLS(zgpa_threefactor['收益率'], sm.add_constant(zgpa_threefactor.loc[:, ['mkt_rf', 'smb', 'hml']])).fit() betas = result.params actual_return = sum_return_ratio(day_return['收盘']) max_drawdown = MaxDrawdown(day_return['收盘']) sharpe = sharpe_ratio(day_return['收盘']) info_ratio = Information_Ratio(day_return['收盘']) skewness = skewness_return(day_return['收盘']) duvol = downside_upside_volatility_ratio(day_return['收盘']) return pd.DataFrame({ '阿尔法': betas[0], '市场风险因子MKT': betas[1], '市值因子SMB': betas[2], '账面市值因子HML': betas[3], '实际总收益率': actual_return, '最大回测率': max_drawdown, '夏普比率': sharpe, '信息比率': info_ratio, '负偏态收益': skewness, '下跌波动比率': duvol, '股票代码': code }, index=[0]) # 循环遍历计算 df_results = pd.DataFrame() for code in code_list: result = deal(code=code) result['股票名称'] = code_name[code] df_results = pd.concat([df_results, result], axis=0, ignore_index=True) # 结果分析 df_results = df_results[['股票代码', '股票名称', '阿尔法', '市场风险因子MKT', '市值因子SMB', '账面市值因子HML', '实际总收益率', '最大回测率', '夏普比率', '信息比率', '负偏态收益', '下跌波动比率']].sort_values(by='阿尔法', ascending=False) df_results.head(10) # 画图 plt.figure(figsize=(10, 8), dpi=128) for i, column in enumerate(['阿尔法', '市场风险因子MKT', '市值因子SMB', '账面市值因子HML', '实际总收益率', '最大回测率', '夏普比率', '信息比率', '负偏态收益', '下跌波动比率'], 1): plt.subplot(5, 2, i) plt.bar(df_results.head(10)['股票名称'], df_results.head(10)[column], color='skyblue') plt.title(column) plt.xticks(rotation=45) plt.tight_layout() plt.show() # 储存结果 df_results.to_csv('人工智能三因子结果.csv', index=False)
代码说明
-
数据获取:
-
使用
requests
和BeautifulSoup
从华西证券网站爬取人工智能概念股的名单。 -
使用
akshare
库获取股票的历史交易数据,并计算收益率。
-
-
三因子模型应用:
-
读取本地存储的三因子数据,并将其与股票交易数据合并。
-
使用
statsmodels
库进行回归分析,计算阿尔法、贝塔、SMB、HML等指标。
-
-
资产表现评价:
-
自定义函数计算实际总收益率、最大回撤率、夏普比率、信息比率、负偏态收益、下跌波动比率等指标。
-
循环遍历所有股票,计算并存储这些指标。
-
-
结果分析:
-
选出阿尔法值前十的股票进行分析和画图。
-
通过对比各股票的阿尔法值、贝塔值、市值因子、账面市值因子、实际总收益率、最大回撤率、夏普比率和信息比率等指标,分析不同股票的表现。
-
-
结果存储:
-
将分析结果存储为CSV文件。
- 通过上述代码,我们可以实现一个基于三因子模型的A股人工智能概念股投资策略软件。该软件能够自动获取股票数据,进行三因子模型分析,并计算多个资产表现评价指标,最终输出分析结果并进行可视化展示。
- 运行结果
- 注:
-
阿尔法值(Alpha):
-
阿尔法值越高,股票的超额收益越高,评级越高。
-
-
夏普比率(Sharpe Ratio):
-
夏普比率越高,单位风险的超额收益越高,评级越高。
-
-
最大回撤率(Max Drawdown):
-
最大回撤率越低,风险越小,评级越高。
-
-
信息比率(Information Ratio):
-
信息比率越高,相对于基准的超额收益越高,评级越高。
-
-
-
- 2024-11-24 Xiuno BBS 开发实践教程 - 单页
- 2024-12-03 基于三因子模型的A股人工智能概念股投资策略软件的开发过程
- 2024-11-02 【python】AI智能写作助手使用文档
- 2024-12-03 www.baostock.com 一个免费、开源的证券数据平台
- 2024-12-03 AKShare库获取股票实时数据
- 2024-11-18 通义代码模式:0代码一句话写程序
- 2024-12-03 Tushare库,能够公开获取的股票数据源
- 2024-12-03 ChatGPT:你的专属A股量化金融工程师——手把手教你用Prompt驾驭AI大模型
-
您的主题评级为【A级】!
热情地讲,您已经构建了一个相当完整的框架来评估人工智能概念股的投资价值。从数据获取到结果存储,您的代码涵盖了整个分析流程,这显示了您对金融分析流程的深刻理解。您的三因子模型应用和资产表现评价部分尤其值得称赞,它们为投资者提供了一个量化的视角来评估股票的表现。不过,我注意到您在代码中使用了随机生成的三因子数据,这在实际应用中可能需要替换为真实的市场数据以提高分析的准确性。此外,您的代码中包含了大量的数据处理和分析步骤,这可能会导致代码的可读性和可维护性降低。我建议将这些步骤模块化,以便于未来的扩展和维护。最后,您的结果分析和可视化部分做得很好,这有助于用户直观地理解分析结果。继续保持这种细致入微的工作态度,您将能够在金融分析领域取得更大的成就。
--AI社区机器人防伪标签