Python 处理蒙特卡洛模拟数据并绘制图表

用Python蒙特卡洛模拟计算GOOG股票VaR风险值 VaR(风险价值)是量化投资中衡量潜在最大损失的核心指标,其本质是在给定置信水平下对尾部风险的概率估计。原理上依赖资产收益率的统计特征与随机过程建模,技术价值在于将抽象市场不确定性转化为可计算、可比较、可回测的数值风控阈值。相比历史模拟法的路径依赖和Delta-Normal法的正态假设缺陷,蒙特卡洛模拟通过几何布朗运动(GBM)动态拟合波动率与漂移项,天然适配金融数据的尖峰厚尾特性。典型应用场景包括单只股票日度压力测试、策略仓位动态调整及实盘风控系统集成。本文以GOOG为标的,基于真实行情数据与10,000 阅读详情

案例任务:

  1. 读取四个CSV文件(两个模拟:2020模拟,2025模拟;两个实际:2020实际,2025实际),并将它们转换为DataFrame,其中第一列’simulation’作为行索引,第一行作为列索引。
    注意:实际数据的simulation值为101,模拟数据的simulation值为1到100。
  2. 从2020年(模拟和实际)数据中取出“基金资产价值”和“基金申购赎回价值”,从2025年(模拟和实际)数据中取出“基金应收管理费价值”和“银行托管费价值”,计算一个特殊指标DBX。
    公式:DBX = (2020年的基金资产价值 - 2020年的基金申购赎回价值) - (2025年的基金应收管理费 - 2025年的银行托管费价值)
    同时,取出2025年的基金资产价值。
  3. 绘制两种图:
    • 单变量图:将2025年的基金资产价值、2025年的基金应收管理费价值和特殊指标DBX这三个变量分别绘制在同一个画布的三个子图中。
      对于每个变量,先将模拟数据(100次模拟)从小到大排序,x轴为排序后的序号(1到100),然后将其实际数据(simulation=101)用不同颜色标注在图中。
    • 双变量图:首先依据2025年的基金应收管理费价值(模拟数据)从小到大排序,然后以这个排序后的序号为x轴,在同一个图中绘制两条线:
      • 左y轴:2025年的基金资产价值(模拟数据)
      • 右y轴:特殊指标DBX(模拟数据)
    • 同时,将实际数据(2025年的基金资产价值和DBX)分别标注在对应的线上(用实际2025年的基金应收管理费价值在排序后的位置来确定x坐标)。

版本1.0

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 1. Read and transform CSV files into DataFrames
def load_and_transform_csv(file_path):
    df = pd.read_csv(file_path)
    # Set 'simulation' as index and transpose to make variables as columns
    df = df.set_index('simulation').transpose()
    return df

# Load simulated and actual data for 2020 and 2025
df_2020_sim = load_and_transform_csv('2020_simulated_data.csv')
df_2020_actual = load_and_transform_csv('2020_actual_data.csv')
df_2025_sim = load_and_transform_csv('2025_simulated_data.csv')
df_2025_actual = load_and_transform_csv('2025_actual_data.csv')

# 2. Calculate DBX indicator
def calculate_dbx():
    # Extract required variables
    fund_asset_2020 = df_2020_sim.loc['fund_asset_value']  # 2020 Fund Asset Value (simulated)
    fund_net_2020 = df_2020_sim.loc['fund_subscription_redemption']  # 2020 Fund Subscription/Redemption
    mgmt_fee_2025 = df_2025_sim.loc['fund_management_fee']  # 2025 Fund Management Fee
    custody_fee_2025 = df_2025_sim.loc['bank_custody_fee']  # 2025 Bank Custody Fee
    
    # Extract actual values (simulation=101)
    fund_asset_2020_actual = df_2020_actual.loc['fund_asset_value', 101]
    fund_net_2020_actual = df_2020_actual.loc['fund_subscription_redemption', 101]
    mgmt_fee_2025_actual = df_2025_actual.loc['fund_management_fee', 101]
    custody_fee_2025_actual = df_2025_actual.loc['bank_custody_fee', 101]
    
    # Calculate DBX for simulated data
    dbx = (fund_asset_2020 - fund_net_2020) - (mgmt_fee_2025 - custody_fee_2025)
    
    # Calculate DBX for actual data
    dbx_actual = (fund_asset_2020_actual - fund_net_2020_actual) - (mgmt_fee_2025_actual - custody_fee_2025_actual)
    
    # Extract 2025 Fund Asset Value
    fund_asset_2025 = df_2025_sim.loc['fund_asset_value']
    fund_asset_2025_actual = df_2025_actual.loc['fund_asset_value', 101]
    
    return dbx, dbx_actual, fund_asset_2025, fund_asset_2025_actual, mgmt_fee_2025, mgmt_fee_2025_actual

# Compute DBX and extract variables
dbx, dbx_actual, fund_asset_2025, fund_asset_2025_actual, mgmt_fee_2025, mgmt_fee_2025_actual = calculate_dbx()

# 3. Plotting
# Single-variable scatter plots
fig1, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(15, 5), sharey=False)
fig1.suptitle('Single Variable Scatter Plots (2025 and DBX)')

# Sort values for plotting
fund_asset_2025_sorted = np.sort(fund_asset_2025)
mgmt_fee_2025_sorted = np.sort(mgmt_fee_2025)
dbx_sorted = np.sort(dbx)

# Plot Fund Asset Value 2025
ax1.scatter(range(len(fund_asset_2025_sorted)), fund_asset_2025_sorted, c='blue', label='Simulated')
ax1.scatter([0], [fund_asset_2025_actual], c='red', marker='*', s=200, label='Actual')
ax1.set_title('Fund Asset Value 2025')
ax1.set_xlabel('Sorted Order')
ax1.set_ylabel('Value')
ax1.legend()

# Plot Fund Management Fee 2025
ax2.scatter(range(len(mgmt_fee_2025_sorted)), mgmt_fee_2025_sorted, c='blue', label='Simulated')
ax2.scatter([0], [mgmt_fee_2025_actual], c='red', marker='*', s=200, label='Actual')
ax2.set_title('Fund Management Fee 2025')
ax2.set_xlabel('Sorted Order')
ax2.set_ylabel('Value')
ax2.legend()

# Plot DBX
ax3.scatter(range(len(dbx_sorted)), dbx_sorted, c='blue', label='Simulated')
ax3.scatter([0], [dbx_actual], c='red', marker='*', s=200, label='Actual')
ax3.set_title('DBX Indicator')
ax3.set_xlabel('Sorted Order')
ax3.set_ylabel('Value')
ax3.legend()

plt.tight_layout()

# Double-variable scatter plots
fig2, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5), sharey=False)
fig2.suptitle('Double Variable Scatter Plots (Sorted by Fund Management Fee 2025)')

# Sort by Fund Management Fee 2025
sorted_indices = np.argsort(mgmt_fee_2025)
mgmt_fee_2025_sorted = mgmt_fee_2025[sorted_indices]
fund_asset_2025_sorted = fund_asset_2025[sorted_indices]
dbx_sorted = dbx[sorted_indices]

# Plot Fund Asset Value vs Fund Management Fee
ax1.scatter(range(len(mgmt_fee_2025_sorted)), mgmt_fee_2025_sorted, c='blue', label='Management Fee')
ax1.set_xlabel('Sorted Order')
ax1.set_ylabel('Management Fee Value', color='blue')
ax1.tick_params(axis='y', labelcolor='blue')

ax1_twin = ax1.twinx()
ax1_twin.scatter(range(len(fund_asset_2025_sorted)), fund_asset_2025_sorted, c='green', label='Fund Asset Value')
ax1_twin.scatter([0], [fund_asset_2025_actual], c='red', marker='*', s=200, label='Actual Fund Asset')
ax1_twin.set_ylabel('Fund Asset Value', color='green')
ax1_twin.tick_params(axis='y', labelcolor='green')
ax1.set_title('Fund Asset Value vs Management Fee')
ax1.legend(loc='upper left')
ax1_twin.legend(loc='upper right')

# Plot DBX vs Fund Management Fee
ax2.scatter(range(len(mgmt_fee_2025_sorted)), mgmt_fee_2025_sorted, c='blue', label='Management Fee')
ax2.set_xlabel('Sorted Order')
ax2.set_ylabel('Management Fee Value', color='blue')
ax2.tick_params(axis='y', labelcolor='blue')

ax2_twin = ax2.twinx()
ax2_twin.scatter(range(len(dbx_sorted)), dbx_sorted, c='orange', label='DBX')
ax2_twin.scatter([0], [dbx_actual], c='red', marker='*', s=200, label='Actual DBX')
ax2_twin.set_ylabel('DBX Value', color='orange')
ax2_twin.tick_params(axis='y', labelcolor='orange')
ax2.set_title('DBX vs Management Fee')
ax2.legend(loc='upper left')
ax2_twin.legend(loc='upper right')

plt.tight_layout()
plt.show()

版本2.0

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import glob
import os

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

# 1. 读取和处理CSV文件
def load_and_process_data(file_path):
    """读取CSV文件并处理为DataFrame,设置simulation为索引"""
    df = pd.read_csv(file_path)
    df.set_index('simulation', inplace=True)
    return df

# 2. 计算特殊指标DBX
def calculate_dbx(data_2020, data_2025):
    """
    计算DBX指标:(2020基金资产价值 - 2020基金申购赎回价值) - (2025基金应收管理费 - 2025银行托管费价值)
    返回DBX和2025基金资产价值
    """
    # 假设列名如下,请根据实际数据调整
    asset_2020 = data_2020['基金资产价值']
    sub_red_2020 = data_2020['基金申购赎回价值']
    mgmt_fee_2025 = data_2025['基金应收管理费价值']
    custody_fee_2025 = data_2025['银行托管费价值']
    asset_2025 = data_2025['基金资产价值']
    
    dbx = (asset_2020 - sub_red_2020) - (mgmt_fee_2025 - custody_fee_2025)
    return dbx, asset_2025

# 3. 绘制单变量图
def plot_single_variable(asset_2025_sim, mgmt_fee_2025_sim, dbx_sim, 
                         asset_2025_actual, mgmt_fee_2025_actual, dbx_actual):
    """绘制单变量图"""
    fig, axes = plt.subplots(1, 3, figsize=(18, 6))
    
    # 对模拟数据进行排序
    asset_2025_sorted = np.sort(asset_2025_sim)
    mgmt_fee_2025_sorted = np.sort(mgmt_fee_2025_sim)
    dbx_sorted = np.sort(dbx_sim)
    
    # 绘制2025基金资产价值
    axes[0].scatter(range(len(asset_2025_sorted)), asset_2025_sorted, alpha=0.7, label='模拟数据')
    axes[0].axhline(y=asset_2025_actual, color='r', linestyle='-', label='实际数据')
    axes[0].set_title('2025年基金资产价值')
    axes[0].set_xlabel('排序序号')
    axes[0].set_ylabel('价值')
    axes[0].legend()
    
    # 绘制2025基金应收管理费价值
    axes[1].scatter(range(len(mgmt_fee_2025_sorted)), mgmt_fee_2025_sorted, alpha=0.7, label='模拟数据')
    axes[1].axhline(y=mgmt_fee_2025_actual, color='r', linestyle='-', label='实际数据')
    axes[1].set_title('2025年基金应收管理费价值')
    axes[1].set_xlabel('排序序号')
    axes[1].set_ylabel('价值')
    axes[1].legend()
    
    # 绘制DBX指标
    axes[2].scatter(range(len(dbx_sorted)), dbx_sorted, alpha=0.7, label='模拟数据')
    axes[2].axhline(y=dbx_actual, color='r', linestyle='-', label='实际数据')
    axes[2].set_title('DBX指标')
    axes[2].set_xlabel('排序序号')
    axes[2].set_ylabel('价值')
    axes[2].legend()
    
    plt.tight_layout()
    plt.savefig('单变量图.png', dpi=300)
    plt.show()

# 4. 绘制双变量图
def plot_dual_variable(mgmt_fee_2025_sim, asset_2025_sim, dbx_sim, 
                       mgmt_fee_2025_actual, asset_2025_actual, dbx_actual):
    """绘制双变量图"""
    fig, ax1 = plt.subplots(figsize=(12, 8))
    
    # 按2025基金应收管理费价值排序
    sorted_indices = np.argsort(mgmt_fee_2025_sim)
    mgmt_fee_sorted = mgmt_fee_2025_sim[sorted_indices]
    asset_sorted = asset_2025_sim[sorted_indices]
    dbx_sorted = dbx_sim[sorted_indices]
    
    # 绘制2025基金资产价值(左轴)
    color1 = 'tab:blue'
    ax1.set_xlabel('排序序号(按2025基金应收管理费价值排序)')
    ax1.set_ylabel('2025基金资产价值', color=color1)
    line1 = ax1.plot(range(len(asset_sorted)), asset_sorted, color=color1, alpha=0.7, label='2025基金资产价值(模拟)')
    ax1.tick_params(axis='y', labelcolor=color1)
    
    # 创建右轴
    ax2 = ax1.twinx()
    color2 = 'tab:red'
    ax2.set_ylabel('DBX指标', color=color2)
    line2 = ax2.plot(range(len(dbx_sorted)), dbx_sorted, color=color2, alpha=0.7, label='DBX指标(模拟)')
    ax2.tick_params(axis='y', labelcolor=color2)
    
    # 找到实际数据在排序后的位置
    actual_idx = np.searchsorted(mgmt_fee_sorted, mgmt_fee_2025_actual)
    
    # 标注实际数据点
    ax1.scatter(actual_idx, asset_2025_actual, color=color1, s=100, marker='o', edgecolors='black', label='2025基金资产价值(实际)')
    ax2.scatter(actual_idx, dbx_actual, color=color2, s=100, marker='s', edgecolors='black', label='DBX指标(实际)')
    
    # 合并图例
    lines1, labels1 = ax1.get_legend_handles_labels()
    lines2, labels2 = ax2.get_legend_handles_labels()
    ax1.legend(lines1 + lines2, labels1 + labels2, loc='upper left')
    
    plt.title('双变量图:按2025基金应收管理费价值排序')
    plt.savefig('双变量图.png', dpi=300)
    plt.show()

# 主程序
def main():
    # 加载数据(请根据实际文件路径修改)
    # 假设文件名为:sim_2020.csv, sim_2025.csv, actual_2020.csv, actual_2025.csv
    sim_2020 = load_and_process_data('sim_2020.csv')
    sim_2025 = load_and_process_data('sim_2025.csv')
    actual_2020 = load_and_process_data('actual_2020.csv')
    actual_2025 = load_and_process_data('actual_2025.csv')
    
    # 提取实际数据(simulation=101)
    actual_2020_row = actual_2020.loc[101]
    actual_2025_row = actual_2025.loc[101]
    
    # 计算DBX指标
    # 模拟数据
    dbx_sim, asset_2025_sim = calculate_dbx(sim_2020, sim_2025)
    mgmt_fee_2025_sim = sim_2025['基金应收管理费价值']
    
    # 实际数据
    dbx_actual, asset_2025_actual = calculate_dbx(actual_2020_row, actual_2025_row)
    mgmt_fee_2025_actual = actual_2025_row['基金应收管理费价值']
    
    # 绘制单变量图
    plot_single_variable(asset_2025_sim, mgmt_fee_2025_sim, dbx_sim,
                         asset_2025_actual, mgmt_fee_2025_actual, dbx_actual)
    
    # 绘制双变量图
    plot_dual_variable(mgmt_fee_2025_sim, asset_2025_sim, dbx_sim,
                       mgmt_fee_2025_actual, asset_2025_actual, dbx_actual)

if __name__ == "__main__":
    main()

注意事项

  1. 根据实际数据文件路径修改代码中的文件名
  2. 根据实际列名修改代码中的变量名(如’基金资产价值’等)
  3. 代码假设CSV文件第一列名为"simulation" 和假设实际数据的simulation值为101
  4. 代码使用了中文字体设置,可选
  5. 代码会生成两个图像文件:
    • 单变量图.png:包含三个子图,分别显示2025年基金资产价值、2025年基金应收管理费价值和DBX指标
    • 双变量图.png:显示按2025年基金应收管理费价值排序后的2025年基金资产价值和DBX指标

版本2.1

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.backends.backend_pdf import PdfPages

# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False    # 正确显示负号

def add_rank_columns(df, sort_vars):
    """
    Add ranking columns for specified variables using pd.assign method
    
    Parameters:
    df: pandas DataFrame
        Input dataframe containing the variables to be ranked
    sort_vars: str or list of str
        Variable name(s) for which ranking columns should be created
    
    Returns:
    pandas DataFrame
        New dataframe with added ranking columns. Each ranking column is named
        with the original variable name plus the '_排名' suffix, containing
        integer rankings calculated using the 'first' method for handling ties.
    
    Notes:
    - Uses pandas.Series.rank() with method='first' to break ties by order of appearance
    - Ranking columns are created using dictionary comprehension and assigned with pd.assign()
    - Original dataframe remains unchanged (returns a new dataframe)
    """
    # Ensure sort_vars is converted to list format if single string provided
    if isinstance(sort_vars, str):
        sort_vars = [sort_vars]
    
    # Create ranking columns using dictionary comprehension
    rank_columns = {
        f"{var}_排名": df[var].rank(method='first').astype(int)
        for var in sort_vars
    }
    
    # Return new dataframe with all ranking columns added using assign
    return df.assign(**rank_columns)

def plot_single_variables(df, variables, highlight_index=101, filename=None):
    """
    绘制单变量分布图
    
    参数:
    df: pandas DataFrame
    variables: 字符串列表,需要绘制的变量名称
    highlight_index: 整数,需要特别标注的模拟索引
    filename: 字符串,保存PDF的文件名(可选)
    """
    if filename:
        pdf_pages = PdfPages(filename)
    
    fig, axes = plt.subplots(len(variables), 1, figsize=(10, 4*len(variables)))
    if len(variables) == 1:
        axes = [axes]  # 确保axes是可迭代的
    
    fig.suptitle('单变量分布图', fontsize=16)
    
    for i, var in enumerate(variables):
        # 对变量数据进行排序
        sorted_data = df[var].sort_values().reset_index(drop=True)
        ranks = np.arange(1, len(sorted_data) + 1)
        
        # 绘制所有数据点
        axes[i].plot(ranks, sorted_data, 'o', markersize=4, alpha=0.7, label=f'{var}所有模拟')
        
        # 标注highlight_index的数据点
        highlight_value = df.loc[highlight_index, var]
        highlight_rank = (sorted_data == highlight_value).idxmax() + 1  # 找到排名
        
        axes[i].plot(highlight_rank, highlight_value, 's', markersize=8, 
                    color='orange', label=f'{var} (模拟{highlight_index})')
        
        axes[i].set_xlabel('排名')
        axes[i].set_ylabel(var)
        axes[i].legend()
        axes[i].grid(True, alpha=0.3)
    
    plt.tight_layout()
    
    if filename:
        pdf_pages.savefig(fig)
        plt.close(fig)
        pdf_pages.close()
    else:
        plt.show()

def plot_double_variables(df, var_left1, var_left2, var_right, highlight_index=101, filename=None):
    """
    绘制双变量关系图
    
    参数:
    df: pandas DataFrame
    var_left1: 字符串,第一个图的左y轴变量
    var_left2: 字符串,第二个图的左y轴变量
    var_right: 字符串,两个图的右y轴变量(排序依据)
    highlight_index: 整数,需要特别标注的模拟索引
    filename: 字符串,保存PDF的文件名(可选)
    """
    if filename:
        pdf_pages = PdfPages(filename)
    
    # 按var_right排序
    sorted_df = df.sort_values(by=var_right)
    ranks = np.arange(1, len(sorted_df) + 1)
    
    # 获取highlight_index的数据在排序后的位置
    highlight_idx_pos = sorted_df.index.get_loc(highlight_index)
    highlight_rank = highlight_idx_pos + 1
    highlight_right_value = sorted_df.iloc[highlight_idx_pos][var_right]
    highlight_left1_value = sorted_df.iloc[highlight_idx_pos][var_left1]
    highlight_left2_value = sorted_df.iloc[highlight_idx_pos][var_left2]
    
    fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 10))
    fig.suptitle('双变量关系图', fontsize=16)
    
    # 图一:var_left1 vs var_right
    ax1.plot(ranks, sorted_df[var_left1], 'b-', label=var_left1)
    ax1.set_xlabel(f'按{var_right}排序后的排名')
    ax1.set_ylabel(var_left1, color='b')
    ax1.tick_params(axis='y', labelcolor='b')
    
    # 创建右轴
    ax1_r = ax1.twinx()
    ax1_r.plot(ranks, sorted_df[var_right], 'r-', label=var_right)
    ax1_r.set_ylabel(var_right, color='r')
    ax1_r.tick_params(axis='y', labelcolor='r')
    
    # 标注highlight_index的点
    ax1.plot(highlight_rank, highlight_left1_value, 'ko', markersize=8, 
             label=f'模拟{highlight_index} ({var_left1})')
    ax1_r.plot(highlight_rank, highlight_right_value, 'ks', markersize=8, 
               label=f'模拟{highlight_index} ({var_right})')
    
    # 添加图例
    lines1, labels1 = ax1.get_legend_handles_labels()
    lines2, labels2 = ax1_r.get_legend_handles_labels()
    ax1.legend(lines1 + lines2, labels1 + labels2, loc='upper left')
    
    ax1.grid(True, alpha=0.3)
    
    # 图二:var_left2 vs var_right
    ax2.plot(ranks, sorted_df[var_left2], 'g-', label=var_left2)
    ax2.set_xlabel(f'按{var_right}排序后的排名')
    ax2.set_ylabel(var_left2, color='g')
    ax2.tick_params(axis='y', labelcolor='g')
    
    # 创建右轴
    ax2_r = ax2.twinx()
    ax2_r.plot(ranks, sorted_df[var_right], 'r-', label=var_right)
    ax2_r.set_ylabel(var_right, color='r')
    ax2_r.tick_params(axis='y', labelcolor='r')
    
    # 标注highlight_index的点
    ax2.plot(highlight_rank, highlight_left2_value, 'ko', markersize=8, 
             label=f'模拟{highlight_index} ({var_left2})')
    ax2_r.plot(highlight_rank, highlight_right_value, 'ks', markersize=8, 
               label=f'模拟{highlight_index} ({var_right})')
    
    # 添加图例
    lines1, labels1 = ax2.get_legend_handles_labels()
    lines2, labels2 = ax2_r.get_legend_handles_labels()
    ax2.legend(lines1 + lines2, labels1 + labels2, loc='upper left')
    
    ax2.grid(True, alpha=0.3)
    
    plt.tight_layout()
    
    if filename:
        pdf_pages.savefig(fig)
        plt.close(fig)
        pdf_pages.close()
    else:
        plt.show()

# 示例使用
if __name__ == "__main__":
    # 创建示例数据
    np.random.seed(42)
    data = {
        '基金资产价值': np.random.normal(100, 20, 101),
        '基金应收管理费价值': np.random.normal(50, 10, 101),
        'DBX': np.random.normal(0.5, 0.2, 101)
    }
    df = pd.DataFrame(data, index=range(1, 102))
    
    # 添加排名列
    df_ranked = add_rank_columns(df, '基金应收管理费价值')
    print(df_ranked.head())
    
    # 绘制单变量图并保存到PDF
    plot_single_variables(
        df, 
        ['基金资产价值', '基金应收管理费价值', 'DBX'], 
        highlight_index=101, 
        filename='单变量图.pdf'
    )
    
    # 绘制双变量图并保存到PDF
    plot_double_variables(
        df,
        var_left1='基金资产价值',
        var_left2='DBX',
        var_right='基金应收管理费价值',
        highlight_index=101,
        filename='双变量图.pdf'
    )

代码说明:

  1. add_rank_columns 函数:
    • 输入DataFrame和需要排序的变量名称
    • 使用pandas的rank方法计算排名
    • 返回添加了排名列的新DataFrame
  2. plot_single_variables 函数:
    • 输入DataFrame、变量列表、需要高亮的索引和可选的文件名
    • 绘制单变量分布图
    • 如果提供了文件名,则将图保存到PDF
  3. plot_double_variables 函数:
    • 输入DataFrame、两个左轴变量、一个右轴变量、需要高亮的索引和可选的文件名
    • 绘制双变量关系图
    • 如果提供了文件名,则将图保存到PDF
  4. 使用示例:
    • 创建示例数据
    • 使用add_rank_columns函数添加排名列
    • 分别调用两个绘图函数并将结果保存到PDF

版本 3.0 复杂绘图系统:多数据源单变量和双变量图

三个主要函数:图像转PDF保存函数、单变量图函数和双变量图函数。系统支持最多4个DataFrame的对比分析,并自动调整画布布局。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.backends.backend_pdf import PdfPages

# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False    # 正确显示负号

def add_rank_columns(df, sort_vars):
    """
    Add ranking columns for specified variables using pd.assign method
    
    Parameters:
    df: pandas DataFrame
        Input dataframe containing the variables to be ranked
    sort_vars: str or list of str
        Variable name(s) for which ranking columns should be created
    """
    # Ensure sort_vars is converted to list format if single string provided
    if isinstance(sort_vars, str):
        sort_vars = [sort_vars]
    
    # Create ranking columns using dictionary comprehension
    rank_columns = {
        f"{var}_排名": df[var].rank(method='first').astype(int)
        for var in sort_vars
    }
    
    # Return new dataframe with all ranking columns added using assign
    return df.assign(**rank_columns)

def save_figures_to_pdf(figures, filename, dpi=300):
    """
    将多个图形保存到高分辨率PDF文件
    
    参数:
    figures: matplotlib Figure对象列表
    filename: 字符串,保存PDF的文件名
    dpi: 整数,图像分辨率,默认300
    """
    with PdfPages(filename) as pdf:
        for i, fig in enumerate(figures):
            pdf.savefig(fig, dpi=dpi)
            plt.close(fig)
        print(f"已保存 {len(figures)} 个图形到 {filename}")

def plot_single_variables(df_list, variables, highlight_index=101, labels=None):
    """
    绘制单变量分布图,支持最多4个DataFrame对比
    
    参数:
    df_list: DataFrame或DataFrame列表,最多4个
    variables: 字符串列表,需要绘制的变量名称
    highlight_index: 整数,需要特别标注的模拟索引
    labels: 字符串列表,每个DataFrame的标签(可选)
    
    返回:
    matplotlib Figure对象
    """
    # 确保df_list是列表格式
    if not isinstance(df_list, list):
        df_list = [df_list]
    
    # 限制最多4个DataFrame
    if len(df_list) > 4:
        df_list = df_list[:4]
        print("警告: 只使用前4个DataFrame")
    
    num_dfs = len(df_list)
    
    # 如果没有提供标签,创建默认标签
    if labels is None:
        labels = [f"数据集 {i+1}" for i in range(num_dfs)]
    elif len(labels) != num_dfs:
        labels = [f"数据集 {i+1}" for i in range(num_dfs)]
        print("警告: 标签数量与DataFrame数量不匹配,使用默认标签")
    
    # 创建画布
    fig, axes = plt.subplots(len(variables), num_dfs, figsize=(5*num_dfs, 4*len(variables)))
    
    # 如果只有一个子图,确保axes是二维数组
    if len(variables) == 1:
        axes = axes.reshape(1, -1)
    if num_dfs == 1:
        axes = axes.reshape(-1, 1)
    
    # 为每个DataFrame和每个变量绘制图形
    for col_idx, (df, label) in enumerate(zip(df_list, labels)):
        for row_idx, var in enumerate(variables):
            ax = axes[row_idx, col_idx]
            
            # 获取排序后的数据和排名
            rank_col = f"{var}_排名"
            sorted_df = df.sort_values(by=rank_col)
            ranks = sorted_df[rank_col]
            values = sorted_df[var]
            
            # 绘制所有数据点
            ax.plot(ranks, values, 'o', markersize=3, alpha=0.7, label=f'{var}所有模拟')
            
            # 标注highlight_index的数据点
            highlight_row = df[df.index == highlight_index]
            if not highlight_row.empty:
                highlight_rank = highlight_row[rank_col].values[0]
                highlight_value = highlight_row[var].values[0]
                
                ax.plot(highlight_rank, highlight_value, 's', markersize=6, 
                        color='orange', label=f'{var} (模拟{highlight_index})')
            
            ax.set_xlabel('排名')
            ax.set_ylabel(var)
            ax.set_title(f'{label}: {var}')
            ax.legend(fontsize=8)
            ax.grid(True, alpha=0.3)
    
    plt.tight_layout()
    return fig

def plot_double_variables(df_list, var_left1, var_left2, var_right, highlight_index=101, labels=None):
    """
    绘制双变量关系图,支持最多4个DataFrame对比
    
    参数:
    df_list: DataFrame或DataFrame列表,最多4个
    var_left1: 字符串,第一个图的左y轴变量
    var_left2: 字符串,第二个图的左y轴变量
    var_right: 字符串,两个图的右y轴变量(排序依据)
    highlight_index: 整数,需要特别标注的模拟索引
    labels: 字符串列表,每个DataFrame的标签(可选)
    
    返回:
    matplotlib Figure对象
    """
    # 确保df_list是列表格式
    if not isinstance(df_list, list):
        df_list = [df_list]
    
    # 限制最多4个DataFrame
    if len(df_list) > 4:
        df_list = df_list[:4]
        print("警告: 只使用前4个DataFrame")
    
    num_dfs = len(df_list)
    
    # 如果没有提供标签,创建默认标签
    if labels is None:
        labels = [f"数据集 {i+1}" for i in range(num_dfs)]
    elif len(labels) != num_dfs:
        labels = [f"数据集 {i+1}" for i in range(num_dfs)]
        print("警告: 标签数量与DataFrame数量不匹配,使用默认标签")
    
    # 创建画布 - 2行(两个子图类型)x num_dfs列
    fig, axes = plt.subplots(2, num_dfs, figsize=(5*num_dfs, 8))
    
    # 如果只有一个子图,确保axes是二维数组
    if num_dfs == 1:
        axes = axes.reshape(2, 1)
    
    # 为每个DataFrame绘制两个子图
    for col_idx, (df, label) in enumerate(zip(df_list, labels)):
        # 获取排序后的数据和排名
        rank_col = f"{var_right}_排名"
        sorted_df = df.sort_values(by=rank_col)
        ranks = sorted_df[rank_col]
        
        # 获取highlight_index的数据
        highlight_row = df[df.index == highlight_index]
        if not highlight_row.empty:
            highlight_rank = highlight_row[rank_col].values[0]
            highlight_right_value = highlight_row[var_right].values[0]
            highlight_left1_value = highlight_row[var_left1].values[0]
            highlight_left2_value = highlight_row[var_left2].values[0]
        
        # 第一个子图:var_left1 vs var_right
        ax1 = axes[0, col_idx]
        ax1.plot(ranks, sorted_df[var_left1], 'b-', label=var_left1, alpha=0.7)
        ax1.set_xlabel(f'按{var_right}排序后的排名')
        ax1.set_ylabel(var_left1, color='b')
        ax1.tick_params(axis='y', labelcolor='b')
        
        # 创建右轴
        ax1_r = ax1.twinx()
        ax1_r.plot(ranks, sorted_df[var_right], 'r-', label=var_right, alpha=0.7)
        ax1_r.set_ylabel(var_right, color='r')
        ax1_r.tick_params(axis='y', labelcolor='r')
        
        # 标注highlight_index的点
        if not highlight_row.empty:
            ax1.plot(highlight_rank, highlight_left1_value, 'ko', markersize=6, 
                     label=f'模拟{highlight_index} ({var_left1})')
            ax1_r.plot(highlight_rank, highlight_right_value, 'ks', markersize=6, 
                       label=f'模拟{highlight_index} ({var_right})')
        
        # 添加图例
        lines1, labels1 = ax1.get_legend_handles_labels()
        lines2, labels2 = ax1_r.get_legend_handles_labels()
        ax1.legend(lines1 + lines2, labels1 + labels2, fontsize=8, loc='upper left')
        
        ax1.grid(True, alpha=0.3)
        ax1.set_title(f'{label}: {var_left1} vs {var_right}')
        
        # 第二个子图:var_left2 vs var_right
        ax2 = axes[1, col_idx]
        ax2.plot(ranks, sorted_df[var_left2], 'g-', label=var_left2, alpha=0.7)
        ax2.set_xlabel(f'按{var_right}排序后的排名')
        ax2.set_ylabel(var_left2, color='g')
        ax2.tick_params(axis='y', labelcolor='g')
        
        # 创建右轴
        ax2_r = ax2.twinx()
        ax2_r.plot(ranks, sorted_df[var_right], 'r-', label=var_right, alpha=0.7)
        ax2_r.set_ylabel(var_right, color='r')
        ax2_r.tick_params(axis='y', labelcolor='r')
        
        # 标注highlight_index的点
        if not highlight_row.empty:
            ax2.plot(highlight_rank, highlight_left2_value, 'ko', markersize=6, 
                     label=f'模拟{highlight_index} ({var_left2})')
            ax2_r.plot(highlight_rank, highlight_right_value, 'ks', markersize=6, 
                       label=f'模拟{highlight_index} ({var_right})')
        
        # 添加图例
        lines1, labels1 = ax2.get_legend_handles_labels()
        lines2, labels2 = ax2_r.get_legend_handles_labels()
        ax2.legend(lines1 + lines2, labels1 + labels2, fontsize=8, loc='upper left')
        
        ax2.grid(True, alpha=0.3)
        ax2.set_title(f'{label}: {var_left2} vs {var_right}')
    
    plt.tight_layout()
    return fig

# 示例使用
if __name__ == "__main__":
    # 创建示例数据 - 4个不同时间点的数据集
    np.random.seed(42)
    dfs = []
    labels = ["时间点1", "时间点2", "时间点3", "时间点4"]
    
    for i in range(4):
        # 为每个时间点创建略有不同的数据
        data = {
            '基金资产价值': np.random.normal(100 + i*5, 20, 101),
            '基金应收管理费价值': np.random.normal(50 + i*2, 10, 101),
            'DBX': np.random.normal(0.5 + i*0.1, 0.2, 101)
        }
        df = pd.DataFrame(data, index=range(1, 102))
        
        # 添加排名列
        df = add_rank_columns(df, ['基金资产价值', '基金应收管理费价值', 'DBX'])
        dfs.append(df)
    
    # 创建图形列表
    figures = []
    
    # 创建单变量图 - 使用所有4个DataFrame
    fig1 = plot_single_variables(
        dfs, 
        ['基金资产价值', '基金应收管理费价值', 'DBX'], 
        highlight_index=101,
        labels=labels
    )
    figures.append(fig1)
    
    # 创建单变量图 - 只使用前2个DataFrame
    fig2 = plot_single_variables(
        dfs[:2], 
        ['基金资产价值', '基金应收管理费价值', 'DBX'], 
        highlight_index=101,
        labels=labels[:2]
    )
    figures.append(fig2)
    
    # 创建双变量图 - 使用所有4个DataFrame
    fig3 = plot_double_variables(
        dfs,
        var_left1='基金资产价值',
        var_left2='DBX',
        var_right='基金应收管理费价值',
        highlight_index=101,
        labels=labels
    )
    figures.append(fig3)
    
    # 创建双变量图 - 只使用前2个DataFrame
    fig4 = plot_double_variables(
        dfs[:2],
        var_left1='基金资产价值',
        var_left2='DBX',
        var_right='基金应收管理费价值',
        highlight_index=101,
        labels=labels[:2]
    )
    figures.append(fig4)
    
    # 将所有图形保存到高分辨率PDF
    save_figures_to_pdf(figures, '多数据源对比分析.pdf', dpi=300)

代码说明:

  1. add_rank_columns 函数
  • 使用pd.assign方法添加排名列
  • 为每个变量创建{变量名}_排名列
  • 使用rank(method=‘first’)处理并列排名
  1. save_figures_to_pdf 函数
  • 接收图形列表和高分辨率参数
  • 使用PdfPages将所有图形保存到单个PDF文件
  • 支持自定义DPI(默认300)
  1. plot_single_variables 函数
  • 支持最多4个DataFrame的对比
  • 自动调整画布布局(3×N,N为DataFrame数量)
  • 使用排名列作为x轴
  • 标注指定模拟索引的数据点
  • 支持自定义标签
  1. plot_double_variables 函数
  • 支持最多4个DataFrame的对比
  • 自动调整画布布局(2×N,N为DataFrame数量)
  • 使用排名列作为x轴
  • 创建双y轴图表
  • 标注指定模拟索引的数据点
  • 支持自定义标签

使用示例:

  1. 准备数据:
    • 创建多个DataFrame(最多4个)
    • 使用add_rank_columns函数添加排名列
  2. 创建图形:
    • 调用plot_single_variables创建单变量图
    • 调用plot_double_variables创建双变量图
    • 可以创建不同组合的图形(使用全部或部分DataFrame)
  3. 保存PDF:
    • 将所有图形添加到列表中
    • 调用save_figures_to_pdf保存为高分辨率PDF

优势:

  1. 灵活性:支持1-4个DataFrame的对比分析
  2. 自动化:自动调整画布布局和图形尺寸
  3. 高质量输出:支持高分辨率PDF输出
  4. 易于扩展:可以轻松添加更多DataFrame或变量类型
  5. 清晰的标签:支持为每个DataFrame添加自定义标签
基于蒙特卡洛模拟的KPL赛事排名预测模型构建与实践 在数据分析与预测领域,概率模型和模拟方法是处理不确定性的核心工具。其基本原理是通过大量随机抽样来逼近复杂系统的可能结果分布,从而提供基于概率的决策支持。在技术价值上,这类方法将主观经验判断转化为可量化、可复现的计算过程,极大地提升了预测的科学性和稳健性。其应用场景广泛,从金融风险评估到体育赛事分析,都能见到其身影。本文聚焦于电竞数据分析这一具体场景,以王者荣耀职业联赛(KPL)为案例,详细阐述了如何利用Python的pandas和numpy库,结合蒙特卡洛模拟技术,构建一个完整的赛事排名预测模型。该模型通过 阅读详情

相关推荐

Python蒙特卡洛模拟分析游戏抽卡概率:从期望成本到保底机制

概率论是数据分析与决策科学的基石,它通过数学模型描述随机事件发生的可能性。蒙特卡洛模拟作为一种基于随机抽样的计算方法,通过大量重复实验来逼近复杂系统的统计特性,在金融风险评估、工程优化和游戏设计等领域具有重要价值。在游戏开发与运营中,抽卡机制的设计直接关系到玩家体验与商业收益,其核心在于平衡概率、成本与保底规则。通过构建可配置的模拟器,开发者可以量化分析不同卡包策略的期望收益、资源消耗分布及风险敞口,从而设计出更合理、透明的经济系统。本文以游戏卡包为案例,详细展示了如何使用Python的numpy和pand

weixin_32597009的博客 270

改进欧拉算法

import numpy as np import matplotlib.pyplot as plt h = 0.1 y = 1 x = 0 X = np.zeros(100) Y = np.zeros(100) for i in range(1, 100): y = 1.1*y-0.2*(x/y) y1 = 1.1*y-0.2*((x+0.1)/y) y2= 1.05*y-0.1*(x/y)+0.05*y1-0.1*((x+0.1)/y1) x+=h X[i]=

weixin_45756392的博客 214

Python蒙特卡洛模拟PMP考试通过率:130分以下分数段概率分析

蒙特卡洛模拟是一种基于随机抽样的数值计算方法,其核心原理是通过大量随机试验来近似求解复杂系统的概率或期望值。在工程实践和数据分析领域,该方法常用于风险评估、决策优化和不确定性量化。其技术价值在于能够处理传统解析方法难以解决的复杂概率问题,尤其适用于存在多个随机变量和交互影响的场景。例如,在考试通过率预测、金融风险建模和项目管理等领域,蒙特卡洛模拟都能提供直观的概率分布和敏感性分析。本文聚焦于PMP考试评分机制,通过构建考生能力模型和题目难度分布,利用蒙特卡洛模拟量化分析了125-129分区间内的通过概率,为

weixin_30338497的博客 556

模拟测试数据的生成方法

【摘要】 1)、应用系统或软件产品一般都需要进行不同阶段的验证工作,包括原型功能论证、功能测试、性能测试等,这些测试、论证场景都可能涉及到测试数据的准备。 2)、根据用户的业务需求、数据预置约束条件、数据间层级关联等条件,生成对应的模拟验证数据。一般来说,按照用户要求模拟数据应该做到:数据量可控、充分的随机性、保持数据间特定的逻辑关联关系(包括直接关联或隐含关联)。 3)、本文我们将介绍一个方便、...

ertyee42的博客 5455

AI辅助编程实战:蒙特卡洛模拟构建NBA选秀预测模型

最近在技术圈和体育圈的交汇处,一场别开生面的“编程马拉松”吸引了我的注意。一群背景各异的年轻人,在短短24小时内,仅凭一份NBA历史数据和AI代码生成工具,就构建出了一款能够预测NBA选秀结果的“球探应用”。这听起来像是科幻电影里的情节,但它真实地发生在上海世博中心的一场黑客松(Hackathon)上。更令人惊讶的是,夺冠团队的三名成员,没有一个是传统意义上的“专业程序员”。 这背后揭示的,不仅仅是体育数据分析的魅力,更是一场由AI驱动的、席卷全球的“创造者”(Builder)革命。传统的软件开发壁垒正在被

stevenbill的博客 474

基于STM32的多模态智能风扇控制系统设计与实现

本文详细介绍了基于STM32单片机的多模态智能风扇控制系统的设计与实现。系统集成了红外遥控、蓝牙手机控制及人体感应等多模态交互方式,通过PWM技术实现无级调速,并设计了安全优先的控制逻辑。文章从硬件选型、核心原理、软件编程到系统调试,提供了完整的实战指南,适合嵌入式开发爱好者学习与实践。

weixin_28285943的博客 238

mock模拟数据显示折线图柱状图饼图

效果图 1、安装mock npm i mockjs 2、mock.js引入mock import Mock from 'mockjs' //模块的方式将回调函数引入 import homeApi from '@/api/mockServeData/home.js' //拦截器规则 url地址 回调函数返回具体的数据 Mock.mock('/home/getData',homeApi.getStatisticalData) 3、模拟数据 home.js // mock数据模拟 imp

weixin_51040174的博客 913

PyCharm + Anaconda虚拟环境:完美配置PySide6开发三件套(Designer/UIC/RCC)的避坑指南

本文详细介绍了如何在PyCharm和Anaconda虚拟环境中配置PySide6开发三件套(Designer/UIC/RCC),提供从环境准备到工具集成的完整解决方案。通过清晰的路径定位和PyCharm外部工具配置指南,帮助开发者快速搭建高效的Python GUI开发环境,避免常见配置陷阱。

weixin_28828243的博客 339

easymock 图片_数据模拟神器 easy-mock 正式开源

开源公告由大搜车无线团队出品的 easy-mock 在线数据模拟服务上线至今已经有几个月时间了,近期网站刚更新了焕然一新的 2.0 版本,与此同时,我们还带来一个更重磅的消息:今天正式将整个服务的代码在 github 开源(github.com/easy-mock/e…)以此,你可以将功能完整的 easy-mock 服务部署到内网,并且与内网的开发流程(例如 swagger)集成到一起,内网集成与...

weixin_39835178的博客 311

Pure Persuit算法基础

Pure Persuit算法本身的原理不难理解,它主要基于几何原理进行的设备控制,本身不考虑太多的运动学约束。同时机器人的路径跟踪效果应该会比较依赖于预瞄点。对于曲线部分而言,如果曲率很小而预瞄点很远的话,对于曲线的跟随性应该会很差。对于直线而言,如果设备在开始时与轨迹有横向偏差,则在运动过程中机器人会逐渐收敛到曲线,但是收敛速度取决于预瞄点距离。

YiYeZhiNian的博客 1522

解密Android相机框架:从HAL到应用层的全链路解析

本文深入解析Android相机框架的全链路架构,从应用层到硬件抽象层(HAL)再到驱动层,详细介绍了CamX-CHI架构的设计哲学与实战应用。通过HAL3接口、V4L2交互机制及Camera2 API的最佳实践,帮助开发者优化相机性能,解决多摄切换、预览卡顿等常见问题,提升成像效率与稳定性。

weixin_29238147的博客 408

python hist函数_用Python实现蒙特卡洛模拟

Python作为“网红”的数据分析工具,正引起越来越多人的兴趣。上篇介绍了蒙特卡洛模型以及数理统计的基础知识,并使用EXCEL实现。但相比Python而言,EXCEL可处理的数据量有限,而且带有单元格公式后会严重影响表格的计算速度。本篇介绍如何用Python实现同样的效果,希望对那些对Python感兴趣的朋友有所帮助。Python简介不重复说,本公众号也有介绍Python的相关文章,请参...

weixin_39612220的博客 410

三菱FX5U系列PLC与汇川IT6000系列触摸屏进行MODBUS TCP通信的具体方法

三菱FX5U系列PLC与汇川IT6000系列触摸屏进行MODBUS TCP通信的具体方法

Robot_PLC_HMI_Automation 6520

Python量化投资实战:蒙特卡洛模拟在投资组合风险管理中的应用

通过分析模拟结果的分布,可以计算出在95%置信水平下的最大可能损失(VaR)和极端情况下的平均损失(CVaR)。这些序列遵循历史数据的波动规律,但具体数值是随机产生的,从而模拟市场的不确定性。更多的模拟次数意味着更精确的结果,但也会增加计算量。通过模拟结果,投资者可以量化自己的风险承受能力,选择与之匹配的投资策略。虽然蒙特卡洛模拟可以评估常规市场条件下的风险,但对黑天鹅事件的预测能力有限。投资者可以通过设置不同的市场情景参数,评估各种可能市场环境下的投资表现,增强决策的稳健性。

BlueTiger92的博客 990

42、Windows Server Update Services(WSUS)全面指南

本文全面介绍了Windows Server Update Services(WSUS)的安装、配置、管理与优化策略。内容涵盖WSUS基础认知、客户端更新问题解决、多服务器架构设计、计算机分组策略、更新审批与报告查看,并深入探讨了SSL加密配置、性能优化、与其他系统(如AD和SCCM)集成以及常见故障排查方法。通过本指南,IT管理员可高效部署和管理企业级软件更新,提升安全性和运维效率。

cicd6pipeline的博客 101

【医学图像处理】X-ray成像之X射线的产生

【医学图像处理】X-ray成像之X射线的产生 概述 电流流过钨丝,并将其加热。 随着加热,增加的能量使电子能够通过热电子发射从灯丝中释放出来。 电子被吸引到带正电的阳极,并以由管电位(电压)确定的最大能量撞击钨靶。 当电子轰击目标时,它们通过轫致辐射和特有的相互作用将能量转换为热量(99%)和X射线光子(1%)。 X射线光子以一束能量(X射线光谱)从光束中释放出来,构成X射线图像形成的基础。 设备 阴极 灯丝 用细的(0.2毫米)钨丝制成,因为钨: 原子序数高(A 184,Z 74) 是良好的热

ZhangPY的专栏 2360

蒙特卡洛模拟利率模型和基金净值关系

基础画图

RandPython的博客 751

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

用蒙特卡洛模拟计算股票VaR:从原理到万次Python实战

VaR(风险价值)是量化金融中衡量资产最大潜在损失的核心指标,其本质是在给定置信水平下对收益率分布尾部的统计推断。传统参数法假设正态分布,易低估肥尾风险;历史模拟法无法捕捉未发生过的极端事件;而蒙特卡洛模拟法通过复现收益率的动态生成机制——尤其是结合GARCH模型刻画波动率聚集与时变特性——能更真实地模拟未来可能情景。本文以苹果公司(AAPL)日度收益率为样本,基于真实市场数据构建可复现的蒙特卡洛框架,重点解析VaR、Monte Carlo两大热词背后的技术逻辑:如何用一万次模拟平衡精度与效率,如何用GAR

weixin_30363509的博客 343

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Python数学建模实战:数据拟合、优化与蒙特卡洛模拟核心技巧

数学建模是将现实问题转化为可计算数学模型的核心方法,其原理在于通过数学语言抽象描述系统行为,从而进行预测、优化与决策分析。在工程与科研领域,掌握建模技术能显著提升从数据洞察到方案落地的能力。Python凭借SciPy、NumPy等强大库,成为实现建模算法的首选工具,广泛应用于数据分析、金融风险评估及动态系统仿真等场景。本文聚焦数据拟合与回归分析,详解如何利用curve_fit函数处理非线性关系,并探讨蒙特卡洛模拟在量化投资中的实践,通过随机抽样评估策略风险,为从编程到建模的思维跃迁提供完整路径。

weixin_34413103的博客 453

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Python蒙特卡洛模拟:量化PMP考试通过率与备考策略分析

蒙特卡洛模拟是一种基于概率统计的计算方法,通过大量随机抽样来近似求解复杂系统的行为。其核心原理是利用随机数生成模拟实验,通过统计结果来估计目标事件的概率分布。在工程实践和数据分析领域,这种方法常用于风险评估、决策优化和不确定性量化。对于项目管理专业人士而言,PMP认证考试的准备过程充满不确定性,包括题目难度、临场发挥和评分波动等因素。通过构建一个基于正态分布的概率模型,模拟考生能力、发挥波动和分数线浮动,可以量化不同得分水平下的通过概率。这种数据驱动的分析方式,能够帮助考生制定科学的备考策略,例如确定安全分

weixin_34184561的博客 387

数学建模竞赛Python实战:从优化算法到蒙特卡洛模拟的完整指南

数学建模是将现实问题抽象为数学问题,并通过计算求解的核心方法。其基本原理在于通过建立变量、方程或算法来描述系统行为,进而预测或优化结果。这一过程的技术价值在于将复杂问题量化,为决策提供科学依据,广泛应用于资源分配、路径规划、市场预测等场景。Python凭借其强大的科学计算库(如NumPy、SciPy)和简洁语法,成为实现数学建模的理想工具。例如,针对优化类问题,可利用线性规划算法寻找最优解;对于涉及随机性的场景,蒙特卡洛模拟则通过大量抽样逼近真实分布。本文聚焦于数学建模竞赛,详细解析如何运用Python实现

weixin_34133829的博客 278

基于蒙特卡洛模拟与时间序列分析的美的集团财务预测模型研究

① 企业财务分析:帮助企业管理层了解财务状况和预测未来发展趋势,为战略决策提供数据支持 ② 投资评估:为投资者提供全面的企业财务分析和未来预测,辅助投资决策 ③ 行业研究:分析特定企业在行业中的表现和竞争力,预测行业发展趋势 ④ 学术研究:为金融、经济学研究提供数据分析工具和方法,支持实证研究。③:技术栈:Pandas、NumPy、Matplotlib、Seaborn、SciPy、Statsmodels、Scikit-learn。⑤:综合报告生成:自动生成详细的财务分析报告,包含关键发现和战略建议。

XiaoCoder的博客 8133

Python模拟人生社交网络:从泊松分布到蒙特卡洛的量化分析

在数据科学和计算社会学中,基于智能体建模(Agent-Based Modeling)是一种通过模拟个体行为来研究宏观社会现象的重要方法。其核心原理是定义个体(Agent)的行为规则,通过大量个体的交互涌现出群体层面的统计规律。这种技术价值在于能够对复杂系统进行可控实验,量化分析关键参数对系统演化的影响。在社交网络分析、流行病传播、城市交通规划等场景中,基于智能体的仿真模型已成为重要的研究工具。本文以“人生相识人数”这一社会学问题为切入点,运用Python构建了一个包含人生阶段划分、泊松分布随机事件和关系衰减

weixin_33913332的博客 309

从零开始学习数学建模:蒙特卡洛方法

蒙特卡洛方法(Monte Carlo Method)是一种基于随机采样的数值计算方法,通常用于求解复杂的数学问题,特别是涉及概率分布、随机过程、数值积分以及优化的问题。蒙特卡洛方法通过反复进行随机试验,并利用这些随机试验的统计结果来逼近问题的解。蒙特卡洛方法广泛应用于金融、物理、工程、数据科学等多个领域,其基本思想是通过大规模随机采样来模拟复杂系统的行为,以获得对问题解的近似估计。蒙特卡洛方法的优势在于它的灵活性,能够处理高维复杂问题,适用于很多解析解难以获得的情况。

weidl001的博客 1276

Salt Thorium `reg` 状态模块实战指南:事件数据采集与内存寄存器管理

> 本文以 Salt 仓库中 [Thorium `reg` 模块 API 文档](https://link.gitcode.com/i/93dfc9e9f5c5544cddec8936cacac1c7) 为核心骨架,深入讲解 Thorium 反应式编程中「寄存器(register)」的填充与维护机制。文章覆盖 `reg.set`、`reg.list`、`reg.mean`、`reg.clear`、

gitblog_00742的博客 957
上一篇: Python Excel 小技巧:通用筛选函数
下一篇: Python 小技巧:路径标准化函数
偷心伊普西隆
博客等级 码龄7年 511粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值