Py学习  »  Python

【Python技术】akshare、matplotlib分析上证指数近10年月份涨跌情况

灵度智能 • 7 月前 • 141 次点击  
周末和朋友闲聊3月份的战绩,大家互相吐槽这行情的艰难。看了下群消息, 群里同学也在吐槽,怪量化么? 
对于自己来说,前面做得还算可以,下半月回撤了一些。后来我细想了下,还是怪自己太侥幸,自认为自己经过这几年的股市毒打,与之前已经不一样了,技术应该有了明显的进步。该休息的时候强行出手,非得证明下自己。不得不说, 1月2月赚钱只能说行情好,3月证明了自己的风险控制能力还是差了点。
为了验证下历年3月份的行情和接下来4月份的行情,最初我的想法 是拿出之前写的代码 运行3月份、4月份的结果看一看, 后来想了想, 每个月这样运行还是好麻烦,要不直接一步到位,直接看上证指数最近10年每个月的涨跌结果。
顶部截图就是大家想要的答案,好吧,看了下,历年3月、4月大盘大部分时候还是很惨的。

相关文章推荐:
【Python技术】ashare、pyplot数据分析历年1月份A股表现
【Python技术】春节前后真的有红包行情么?用历史数据分析

题外话:
有些时候,我们不得不相信历史数据,毕竟历史数据还是有很强的参考意义。 对于做技术出身的我来说,还是很相信历史数据分析的。 
有些时候,只是为了证明 自己和 历史的自己 不一样 强行为之。 事实上,个人确实有了一些进步。  但在大趋势面前,这点小小的进步根本不值一提了。 
后续的目标,在提升收益率的同时, 在大盘情绪不佳的时候,减少出手频次。 该休息就休息。

最后附上完整代码,需要的自取。 备注:如果发现格式有多余的特殊字符,用普通浏览器打开复制应该没问题。
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)




为了后续能正常收到文章推送,欢迎点赞在看,不然可能收不到消息哦。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/180574