# -*- coding: utf-8 -*-
"""
获取某只股票的数据绘制K线图、计算日收益率、绘制收益率直方图、计算VaR
并绘制VaR图
Created on Sun Sep 15 13:15:50 2024
@author: 24384
"""
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import akshare as ak
import numpy as np
import pandas as pd
import mplfinance as mpf # 需先 pip install mplfinance
import seaborn as sns
import time
from requests.exceptions import ConnectionError, Timeout, TooManyRedirects
# # 列出系统所有可用字体
# fonts = fm.findSystemFonts()
# font_names = [fm.FontProperties(fname=font).get_name() for font in fonts]
# print("系统可用字体:")
# for font_name in font_names:
# print(font_name)
# 手动选择一个支持中文的字体
font_name = 'Microsoft YaHei' # 根据输出结果修改
try:
plt.rcParams['font.family'] = font_name
plt.rcParams['axes.unicode_minus'] = False # 负号正常显示
print(f"成功使用字体: {font_name}")
except Exception as e:
print(f"加载字体时发生错误: {e},使用默认字体。")
def get_stock_data(stock_code, start_date, end_date, max_retries=3, retry_delay=5):
"""获取股票数据,添加重试机制和错误处理"""
for attempt in range(max_retries):
try:
print(f"尝试获取 {stock_code} 的数据,尝试次数: {attempt + 1}/{max_retries}")
stock_df = ak.stock_zh_a_hist_tx(
symbol=stock_code,
start_date=start_date,
end_date=end_date,
adjust=""
)
if stock_df is None or stock_df.empty:
print(f"警告:获取到的 {stock_code} 数据为空")
return None
if 'date' in stock_df.columns:
stock_df = stock_df.set_index('date')
stock_df.index = pd.to_datetime(stock_df.index)
else:
print(f"错误:未找到日期列。可用列名: {stock_df.columns.tolist()}")
return None
return stock_df['close']
except (ConnectionError, Timeout, TooManyRedirects) as e:
print(f"网络连接错误: {e}")
if attempt < max_retries - 1:
print(f"将在 {retry_delay} 秒后重试...")
time.sleep(retry_delay)
else:
print("达到最大重试次数,获取数据失败")
return None
except Exception as e:
print(f"发生未知错误: {e}")
return None
def plot_kline(stock_code, start_date, end_date):
try:
stock_df = ak.stock_zh_a_hist_tx(
symbol=stock_code,
start_date=start_date,
end_date=end_date,
adjust=""
)
if stock_df is None or stock_df.empty:
print("K线数据为空,无法绘制K线图")
return
stock_df = stock_df.rename(columns={'date': 'Date', 'open': 'Open', 'high': 'High', 'low': 'Low', 'close': 'Close', 'amount': 'Volume'})
stock_df['Date'] = pd.to_datetime(stock_df['Date'])
stock_df.set_index('Date', inplace=True)
title = f'{stock_code} K线图'
mpf.plot(stock_df[['Open', 'High', 'Low', 'Close', 'Volume']], type='candle', volume=True, style='yahoo', title=title)
except RequestException as e:
print(f"获取数据时发生网络请求错误: {e}")
except Exception as e:
print(f"绘制K线图时发生错误: {e}")
def monte_carlo_simulations(close_prices, num_simulations=10000, days=1):
"""返回蒙特卡洛模拟的所有收益率数组"""
returns = close_prices.pct_change().dropna()
mean_return = returns.mean()
std_return = returns.std()
simulations = np.zeros(num_simulations)
for i in range(num_simulations):
daily_returns = np.random.normal(mean_return, std_return, days)
final_return = np.prod(1 + daily_returns) - 1
simulations[i] = final_return
return simulations
def monte_carlo_var(simulations, confidence_level=0.95):
"""根据模拟结果计算VaR"""
var = np.percentile(simulations, 100 * (1 - confidence_level))
return var
def plot_var_results(simulations, var_value, confidence_level=0.95, days=1):
"""绘制蒙特卡洛模拟收益率分布和VaR"""
plt.figure(figsize=(10, 6))
sns.histplot(simulations, bins=30, kde=True, stat="density", color='skyblue')
plt.axvline(x=var_value, color='red', linestyle='--',
label=f"{int(confidence_level*100)}% VaR: {var_value:.2%}")
plt.title(f"蒙特卡洛模拟股票收益率分布与VaR({days}天)")
plt.xlabel("收益率")
plt.ylabel("密度")
plt.legend()
plt.grid(True, linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()
def plot_price_history(stock_prices):
plt.figure(figsize=(10, 4))
sns.lineplot(data=stock_prices)
plt.title("历史股票价格走势")
plt.xlabel("日期")
plt.ylabel("价格")
plt.grid(True, linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()
if __name__ == "__main__":
# 参数设置
stock_code = 'sh600938' # 中国海油
start_date = '20240101'
end_date = '20250521'
num_simulations = 10000
days = 10
confidence_level = 0.95
# 获取股票数据
close_prices = get_stock_data(stock_code, start_date, end_date)
if close_prices is None:
print("无法获取股票数据,程序退出")
exit()
# 绘制历史价格
plot_price_history(close_prices)
# 蒙特卡洛模拟
simulations = monte_carlo_simulations(close_prices, num_simulations, days)
var = monte_carlo_var(simulations, confidence_level)
print(f"单只股票 {stock_code} 在 {confidence_level * 100:.0f}% 置信水平下,{days} 天的 VaR 为: {var:.2%}")
# 绘制模拟结果与VaR
plot_var_results(simulations, var, confidence_level, days)
# 绘制K线图
plot_kline(stock_code, start_date, end_date)
分类: 股票
-
绘制某只股票的K线图、收益率、计算VaR并绘图
-
python单只股票蒙特卡洛风险计算及绘图方法
import akshare as ak import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import time # 字体设置 plt.rcParams["font.family"] = ["simkai.ttf", "Microsoft YaHei", "SimHei"] try: import matplotlib.font_manager as fm font = fm.FontProperties(fname=r"C:\Windows\Fonts\msyh.ttc") plt.rcParams["font.family"] = font.get_name() except Exception: plt.rcParams["font.family"] = ["SimHei", "simkai.ttf"] from requests.exceptions import ConnectionError, Timeout, TooManyRedirects def get_stock_data(stock_code, start_date, end_date, max_retries=3, retry_delay=5): """获取股票数据,添加重试机制和错误处理""" for attempt in range(max_retries): try: print(f"尝试获取 {stock_code} 的数据,尝试次数: {attempt + 1}/{max_retries}") stock_df = ak.stock_zh_a_hist_tx( symbol=stock_code, start_date=start_date, end_date=end_date, adjust="" ) if stock_df is None or stock_df.empty: print(f"警告:获取到的 {stock_code} 数据为空") return None if 'date' in stock_df.columns: stock_df = stock_df.set_index('date') stock_df.index = pd.to_datetime(stock_df.index) else: print(f"错误:未找到日期列。可用列名: {stock_df.columns.tolist()}") return None return stock_df['close'] except (ConnectionError, Timeout, TooManyRedirects) as e: print(f"网络连接错误: {e}") if attempt < max_retries - 1: print(f"将在 {retry_delay} 秒后重试...") time.sleep(retry_delay) else: print("达到最大重试次数,获取数据失败") return None except Exception as e: print(f"发生未知错误: {e}") return None def monte_carlo_simulations(close_prices, num_simulations=10000, days=1): """返回蒙特卡洛模拟的所有收益率数组""" returns = close_prices.pct_change().dropna() mean_return = returns.mean() std_return = returns.std() simulations = np.zeros(num_simulations) for i in range(num_simulations): daily_returns = np.random.normal(mean_return, std_return, days) final_return = np.prod(1 + daily_returns) - 1 simulations[i] = final_return return simulations def monte_carlo_var(simulations, confidence_level=0.95): """根据模拟结果计算VaR""" var = np.percentile(simulations, 100 * (1 - confidence_level)) return var def plot_var_results(simulations, var_value, confidence_level=0.95, days=1): """绘制蒙特卡洛模拟收益率分布和VaR""" plt.figure(figsize=(10, 6)) sns.histplot(simulations, bins=30, kde=True, stat="density", color='skyblue') plt.axvline(x=var_value, color='red', linestyle='--', label=f"{int(confidence_level*100)}% VaR: {var_value:.2%}") plt.title(f"蒙特卡洛模拟股票收益率分布与VaR({days}天)") plt.xlabel("收益率") plt.ylabel("密度") plt.legend() plt.grid(True, linestyle='--', alpha=0.7) plt.tight_layout() plt.show() def plot_price_history(stock_prices): """绘制历史价格走势""" plt.figure(figsize=(10, 4)) sns.lineplot(data=stock_prices) plt.title("历史股票价格走势") plt.xlabel("日期") plt.ylabel("价格") plt.grid(True, linestyle='--', alpha=0.7) plt.tight_layout() plt.show() if __name__ == "__main__": # 参数设置 stock_code = 'sh600938' # 中国海油 start_date = '20240101' end_date = '20250521' num_simulations = 1000 days = 1 confidence_level = 0.95 # 获取股票数据 close_prices = get_stock_data(stock_code, start_date, end_date) if close_prices is None: print("无法获取股票数据,程序退出") exit() # 绘制历史价格 plot_price_history(close_prices) # 蒙特卡洛模拟 simulations = monte_carlo_simulations(close_prices, num_simulations, days) var = monte_carlo_var(simulations, confidence_level) print(f"单只股票 {stock_code} 在 {confidence_level * 100:.0f}% 置信水平下,{days} 天的 VaR 为: {var:.2%}") # 绘制模拟结果与VaR plot_var_results(simulations, var, confidence_level, days)

-
python代码绘制某只股票的K线图、均线、量能图
import akshare as ak import matplotlib.pyplot as plt import pandas as pd import mplfinance as mpf import matplotlib.dates as mdates import numpy as np import os from datetime import datetime, timedelta # 设置中文字体 plt.rcParams["font.family"] = ["SimHei", "Microsoft YaHei"] plt.rcParams["axes.unicode_minus"] = False # 解决负号显示问题 def get_stock_data(stock_code, start_date=None, end_date=None, adjust="qfq"): """ 使用 AkShare 获取股票数据 参数: stock_code (str): 股票代码,如 'sh000001' 或 '000001.SZ' start_date (str): 开始日期,格式 'YYYYMMDD',默认为 3 个月前 end_date (str): 结束日期,格式 'YYYYMMDD',默认为今天 adjust (str): 复权类型,'qfq' 为前复权,'hfq' 为后复权,None 为不复权 返回: DataFrame: 包含股票数据的 DataFrame """ # 处理默认日期 if end_date is None: end_date = datetime.now().strftime('%Y%m%d') if start_date is None: start_date = (datetime.now() - timedelta(days=90)).strftime('%Y%m%d') # 格式化股票代码以适应 AkShare if not stock_code.startswith(('sh', 'sz')): market = 'sh' if stock_code.startswith(('6', '9')) else 'sz' stock_code = f'{market}{stock_code}' try: # 使用 AkShare 获取股票日线数据 stock_data = ak.stock_zh_a_hist_tx(symbol=stock_code, start_date=start_date, end_date=end_date, adjust=adjust) # 重命名列以符合 mplfinance 要求 # 检查并映射成交量列名 volume_columns = ['成交量', '成交额', 'volume','amount'] volume_col = next((col for col in volume_columns if col in stock_data.columns), None) if volume_col is None: print("警告: 数据中未找到成交量列,图表可能不完整") stock_data['volume'] = 0 # 添加默认成交量列 else: stock_data = stock_data.rename(columns={volume_col: 'volume'}) # 重命名其他必要列 stock_data = stock_data.rename(columns={ '日期': 'date', '开盘': 'open', '收盘': 'close', '最高': 'high', '最低': 'low' }) # 转换日期格式 stock_data['date'] = pd.to_datetime(stock_data['date']) # 确保数据按日期排序 stock_data = stock_data.sort_values('date') # 检查是否有必要的列 required_columns = ['date', 'open', 'high', 'low', 'close', 'volume'] missing_columns = [col for col in required_columns if col not in stock_data.columns] if missing_columns: print(f"错误: 数据缺少必要的列: {', '.join(missing_columns)}") return None return stock_data except Exception as e: print(f"获取股票数据时出错: {e}") return None def plot_stock_daily_movement(stock_data, stock_name="股票", save_path=None, ma_periods=None): """ 绘制股票日变动情况,包括 K 线图和成交量及均线 参数: stock_data (DataFrame): 包含股票数据的 DataFrame,必须包含 'date', 'open', 'high', 'low', 'close', 'volume' 列 stock_name (str): 股票名称,用于图表标题 save_path (str): 图表保存路径,默认为 None 不保存 ma_periods (list): 均线周期列表,默认为 [5, 10, 20] """ if stock_data is None or stock_data.empty: print("没有数据可绘制图表") return # 设置默认均线周期 if ma_periods is None: ma_periods = [5, 10, 20] # 复制数据并准备 mplfinance 所需格式 plot_data = stock_data.copy() plot_data = plot_data.set_index('date') # 添加均线 for period in ma_periods: column_name = f'MA{period}' plot_data[column_name] = plot_data['close'].rolling(window=period).mean() # 设置 mplfinance 样式 mc = mpf.make_marketcolors(up='r', down='g', inherit=True) # 自定义均线颜色 ma_colors = ['blue', 'purple', 'orange', 'green', 'red', 'brown', 'gray'] ma_colors = ma_colors[:len(ma_periods)] # 确保颜色数量与均线周期数量匹配 s = mpf.make_mpf_style( marketcolors=mc, gridstyle='--', y_on_right=False, rc={ 'font.family': ['SimHei', 'WenQuanYi Micro Hei', 'Heiti TC', 'Microsoft YaHei'], 'lines.linewidth': 1.5 # 增加均线线条宽度 } ) # 绘制 K 线图和成交量 fig, axes = mpf.plot( plot_data, type='candle', style=s, title=f'{stock_name} 日变动情况', ylabel='价格 (元)', volume=True, ylabel_lower='成交量 (手)', mav=tuple(ma_periods), # 传递均线周期 returnfig=True, figsize=(14, 10), update_width_config=dict( candle_linewidth=1.2, # K线实体边框宽度 candle_width=0.6, # K线宽度 volume_width=0.8, # 成交量柱宽度 ) ) # 调整标题位置 fig.suptitle(f'{stock_name} 日变动情况', fontsize=16, y=0.98) # 添加均线图例 ax = axes[0] # K线图的轴 for i, period in enumerate(ma_periods): ax.plot([], [], color=ma_colors[i], label=f'MA{period}', linewidth=1.5) ax.legend(loc='upper left') # 如果指定了保存路径,则保存图表 if save_path: save_dir = os.path.dirname(save_path) if not os.path.exists(save_dir): os.makedirs(save_dir) plt.savefig(save_path, dpi=300, bbox_inches='tight') print(f"图表已保存至: {save_path}") plt.show() # 主函数 if __name__ == "__main__": # 用户输入股票代码和名称 stock_code = input("请输入股票代码(例如 000001 或 sh000001): ").strip() stock_name = input("请输入股票名称(例如 平安银行): ").strip() # 获取股票数据 print("正在获取股票数据...") stock_data = get_stock_data(stock_code) if stock_data is not None and not stock_data.empty: print(f"成功获取 {len(stock_data)} 天的股票数据") # 显示数据列名,用于调试 print(f"数据列名: {', '.join(stock_data.columns)}") # 可选:自定义均线周期 ma_input = input("请输入均线周期(用逗号分隔,默认 5,10,20): ").strip() if ma_input: try: ma_periods = [int(p.strip()) for p in ma_input.split(',')] except ValueError: print("无效的均线周期,使用默认值") ma_periods = [5, 10, 20] else: ma_periods = [5, 10, 20] # 绘制股票日变动情况 plot_stock_daily_movement(stock_data, stock_name, ma_periods=ma_periods) else: print("未能获取股票数据,请检查股票代码是否正确")
000937股票最近90天K线图 -
2025年1~5月份股票收益
从这个图表上看是亏了14,000,其实拉长时间来看并没有亏这么多,确实这半年亏太多了,就一个第一创业证券股赔了我14,000块钱。

-
37互娱股票今天是股权登记日
明天发放分红, 2024年分红10股3.7元。 2025年第一季度每10股派发2.1元,总共5.8元。这个股真的不错呀。
【东方财富】尊敬的客户,三七互娱(002555)2024年度分配方案为:10派3.70元(含税),2025年05月20日为股权登记日,更多详情请查看公司公告。如有疑问,请拨打客服热线95357。
【东方财富】尊敬的客户:您好,三七互娱(002555)2024年度分配方案为:10派3.70元(含税),2025年05月21日为除权除息日,详细内容请查看公司公告。如有疑问,请及时拨打客服热线95357。
分红提示

-
2025年4月30日银行股大跌
农行跌3%,37互娱跌了5.5%。节前股市……一个字“惨”

-
红利加股票波动炒股法
这位高手的策略具备可复制性,以20万本金为例,仅用8万操作,其余12万作储备。10万元本金,红利在4000-6000之间,核心策略如下:
1. **仓位控制**:限制仓位,预留现金应对风险、补仓或理财,降低亏损影响。
2. **选股标准**:选如银行股这类市盈率低、股息高、波动明显的股票,兼具分红与差价收益。
3. **挂单技巧**:提前设1%差价挂单,利用股价波动自动交易获利。
4. **盈利管理**:每月达本金10%盈利就提现超额部分,滚动操作。
策略精髓在于用闲钱、赚波动差价、严守纪律锁定利润。存在股息下降、股价振幅不足、极端行情失效等风险。普通人操作要点:以分红保底,把握差价机会,横盘时视为定期,遵循规则,理性炒股。
-
A股龙头公司
下面罗列出各个行业的龙头公司讨论讨论!(可能没有全覆盖)
1、银行:工商银行、建设银行、中国银行、农业银行、交通银行、邮储银行、招商银行、兴业银行、平安银行等。
2、证券:中信证券、中信建投、中金公司、国泰君安、申万宏源、东方财富等。
3、保险:中国人寿、中国人保、中国太保、新华保险、中国平安等。
4、电力:长江电力、国投电力、华能水电、桂冠电力、川投能源、中国核电、中国广核、三峡能源等。
5、白酒啤酒:贵州茅台、五粮液、泸州老窖、山西汾酒、青岛啤酒、重庆啤酒等。
6、食品饮料等:海天味业、双汇发展、伊利股份、安琪酵母等。
7、养殖:牧原股份、温氏股份、正邦科技等。
8、农业类:北大荒、海南橡胶、苏垦农发、隆平高科、登海种业等。
9、物流:顺丰控股、国货航、圆通速递、中国外运、东航物流、韵达股份、申通快递等。
10、房地产:保利发展、招商蛇口、万科等。
11、公路铁路:京沪高铁、大秦铁路、招商公路、宁沪高速、山东高速等。
12、煤炭开采:中国神华、陕西煤业、中煤能源、兖矿能源、电投能源等。
13、燃气:新奥股份、深圳能源、九丰能源、佛燃能源、陕天然气、皖天然气等。
14、消费电子:工业富联、立讯精密、传音控股、蓝思科技、歌尔股份等。
15、游戏:昆仑万维、三七互娱、巨人网络、完美世界等。
16、中药:片仔癀、云南白药、华润三九、同仁堂、白云山、东阿阿胶、达仁堂、天士力、以岭药业、江中药业、马应龙、昆药集团等。
17、通信类:中国移动、中国电信、中国联通、中兴通讯、中天科技、新易盛等。
18、军工:中航成飞、中国船舶、中航沈飞、中国重工、航发动力、中国卫通、中航西飞等。
19、医疗器械:迈瑞医疗、鱼跃医疗、乐普医疗等。
20、美容类:爱美客、珀莱雅、华熙生物、贝泰妮、完美生物、上海家化等。
21、医药商业:上海医药、益丰药房、九州通、国药股份、大参林、中国医药等。
22、化学及生物制药:百济神州、恒瑞医药、华东医药、复星医药、新和成、人福医药、天坛生物、华兰生物等。
23、钢铁:宝钢股份、包钢股份、中信特钢、杭钢股份等。
24、厨卫:老板电器、日出东方、万和电气、华帝股份、火星人、浙江美大等。
25、家电:美的集团、格力电器、海尔智家、苏泊尔、石头科技、海信家电、科沃斯、飞科电器等。
26、汽车类:比亚迪、赛力斯、上汽集团、长安汽车、广汽集团、福耀玻璃、潍才动力、华域汽车、赛轮轮胎、星宇股份等。
27、电网设备:国电南瑞、思源电气、正泰电器、许继电气、保变电气等。
28、计算机软件:海康威视、中科曙光、浪潮信息、中国长城、同花顺、金山办公、科大讯飞、三六零、恒生电子、东华软件、用友网络、指南针、宝信软件、紫光股份、中国软件等。
29、工业金属:紫金矿业、洛阳钼业、中国铝业、江西铜业、中金黄金等。
30、文化传媒:分众传媒、芒果超媒、凤凰传媒、中南传媒、人民网等。
31、家具用品:公牛集团、欧派家居、晨光股份、顾家家居、索菲亚、慕斯股份等。
32、旅游酒店:锦江股份、宋城演艺、华侨城、首旅酒店等。
33、电池:宁德时代、亿纬锂能、国轩高科、天赐材料等。
34、工程机械:三一重工、徐工机械、恒立液压、中联重科、杭叉集团等。
36、港口:上港集团、招商港口、宁波港、青岛港、唐山港等。
37、服装类:海澜之家、雅戈尔、森马服饰等。
38、首饰类:老凤祥、周大生、中国黄金等。

