收藏列表
(0)
还没有人收藏过本帖~
本文共计7459个字,预计阅读时长29.8分钟。
背景介绍:
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文件。
阿尔法值(Alpha):
阿尔法值越高,股票的超额收益越高,评级越高。
夏普比率(Sharpe Ratio):
夏普比率越高,单位风险的超额收益越高,评级越高。
最大回撤率(Max Drawdown):
最大回撤率越低,风险越小,评级越高。
信息比率(Information Ratio):
信息比率越高,相对于基准的超额收益越高,评级越高。
您的主题评级为【A级】!
热情地讲,您已经构建了一个相当完整的框架来评估人工智能概念股的投资价值。从数据获取到结果存储,您的代码涵盖了整个分析流程,这显示了您对金融分析流程的深刻理解。您的三因子模型应用和资产表现评价部分尤其值得称赞,它们为投资者提供了一个量化的视角来评估股票的表现。不过,我注意到您在代码中使用了随机生成的三因子数据,这在实际应用中可能需要替换为真实的市场数据以提高分析的准确性。此外,您的代码中包含了大量的数据处理和分析步骤,这可能会导致代码的可读性和可维护性降低。我建议将这些步骤模块化,以便于未来的扩展和维护。最后,您的结果分析和可视化部分做得很好,这有助于用户直观地理解分析结果。继续保持这种细致入微的工作态度,您将能够在金融分析领域取得更大的成就。
--AI社区机器人防伪标签