周末和朋友闲聊3月份的战绩,大家互相吐槽这行情的艰难。看了下群消息, 群里同学也在吐槽,怪量化么? 对于自己来说,前面做得还算可以,下半月回撤了一些。后来我细想了下,还是怪自己太侥幸,自认为自己经过这几年的股市毒打,与之前已经不一样了,技术应该有了明显的进步。该休息的时候强行出手,非得证明下自己。不得不说, 1月2月赚钱只能说行情好,3月证明了自己的风险控制能力还是差了点。为了验证下历年3月份的行情和接下来4月份的行情,最初我的想法 是拿出之前写的代码 运行3月份、4月份的结果看一看, 后来想了想, 每个月这样运行还是好麻烦,要不直接一步到位,直接看上证指数最近10年每个月的涨跌结果。顶部截图就是大家想要的答案,好吧,看了下,历年3月、4月大盘大部分时候还是很惨的。有些时候,我们不得不相信历史数据,毕竟历史数据还是有很强的参考意义。 对于做技术出身的我来说,还是很相信历史数据分析的。 有些时候,只是为了证明 自己和 历史的自己 不一样 强行为之。 事实上,个人确实有了一些进步。 但在大趋势面前,这点小小的进步根本不值一提了。 后续的目标,在提升收益率的同时, 在大盘情绪不佳的时候,减少出手频次。 该休息就休息。最后附上完整代码,需要的自取。 备注:如果发现格式有多余的特殊字符,用普通浏览器打开复制应该没问题。import streamlit as st
import akshare as ak
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
from datetime import datetime
# 设置全局样式
plt.rcParams['font.sans-serif'] = ['STHeiti'] # 苹果系统字体
# plt.rcParams['font.sans-serif'] = ['SimHei'] # Windows系统使用此字体
plt.rcParams['axes.unicode_minus'] = False
# 配置页面
st.set_page_config(page_title="上证指数历年月度分析", layout="wide")
st.title("上证指数历年月度分析")
# 自定义双色系
dual_colors = ['#4CB050', '#FF3333'] # 绿跌红涨
cmap = mcolors.ListedColormap(dual_colors)
bounds = [-100, 0, 100] # 严格分界
norm = mcolors.BoundaryNorm(bounds, cmap.N)
# 数据获取
@st.cache_data
def get_data():
df = ak.stock_zh_index_daily(symbol="sh000001")
df['date'] = pd.to_datetime(df['date'])
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
return df[df['year'].between(2015, 2024)].sort_values('date')
# 构建月度数据
def build_table(df):
monthly = []
for y in range(2015, 2025):
row = {'年份': y}
for m in range(1, 13):
sub = df[(df['year'] == y) & (df['month'] == m)]
if
len(sub) >= 3:
chg = (sub.iloc[-1]['close'] / sub.iloc[0]['close'] - 1) * 100
row[f'{m}月'] = round(chg, 2)
monthly.append(row)
return pd.DataFrame(monthly).set_index('年份')
# 生成热力图
def plot_heatmap(data):
fig, ax = plt.subplots(figsize=(16, 6))
sns.heatmap(data,
cmap=cmap,
norm=norm,
annot=True,
fmt=".1f",
linewidths=0.5,
cbar=False,
annot_kws={'color': 'white', 'weight': 'bold'})
ax.set_xticklabels(['1月', '2月', '3月', '4月', '5月', '6月',
'7月', '8月', '9月', '10月', '11月', '12月'])
ax.set_title('月度涨跌幅分布', fontsize=14)
return fig
# 主程序
df = get_data()
monthly_df = build_table(df)
# 显示表格
st.subheader("数据表")
def color_cell(val):
color = '#FF3333'if val >= 0 else'#4CB050'
return f'background-color: {color}; color: white'
styled_df = monthly_df.style.format('{:.1f}%', na_rep="-").applymap(color_cell)
st.dataframe(styled_df, height=450, use_container_width=True)
为了后续能正常收到文章推送,欢迎点赞在看,不然可能收不到消息哦。