量化曲线的平滑程度

思路

1. 对原始数据一阶求导,得到一阶导数数组。

2. 对一阶导数数组求标准差。导数的标准差提供了导数值的波动性,标准差越小,曲线越平滑。

平滑曲线

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import font_manager
fname="/usr/local/python3.6/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/simhei.ttf"
zhfont = font_manager.FontProperties(fname=fname)


# 生成示例数据:正弦波加噪声
np.random.seed(123456)
time = np.arange(0, 100, 0.1)
signal_period = 20  # 正弦波周期
signal = 10 * np.sin(2 * np.pi * time / signal_period)  # 正弦波

# 计算一阶导数(离散形式)
dt = time[1] - time[0]  # 时间步长
first_derivative = np.diff(signal) / dt

# 计算一阶导数的统计指标
std_dev_derivative = np.std(first_derivative)

# 打印导数的波动性指标
print(f"平滑数据的一阶导数标准差: {std_dev_derivative:.2f}")

# 绘制原始信号与导数
plt.figure(figsize=(14, 6))

plt.subplot(2, 1, 1)
plt.plot(time, signal, label='平滑数据')
plt.xlabel('Time')
plt.ylabel('Value')
plt.title('原始数据 及其 一阶导数', fontproperties=zhfont, fontsize=12)
plt.legend()

plt.subplot(2, 1, 2)
plt.plot(time[:-1], first_derivative, label='一阶导数', color='orange')
plt.xlabel('Time')
plt.ylabel('Value')
# plt.title('原始数据求导', fontproperties=zhfont, fontsize=12)
plt.legend()
plt.show()

# 绘制导数的直方图
plt.figure(figsize=(14, 4))
plt.hist(first_derivative, bins=50, color='orange', edgecolor='k', alpha=0.7)
plt.xlabel('Derivative Value')
plt.ylabel('Frequency')
plt.title('一阶导数直方图')
plt.show()

  

毛刺曲线

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import font_manager
fname="/usr/local/python3.6/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/simhei.ttf"
zhfont = font_manager.FontProperties(fname=fname)


# 生成示例数据:正弦波加噪声
np.random.seed(123456)
time = np.arange(0, 100, 0.1)
signal_period = 20  # 正弦波周期
signal = 10 * np.sin(2 * np.pi * time / signal_period)  # 正弦波
noise = np.random.normal(0, 2, len(time))  # 噪声
signal_with_noise = signal + noise

# 计算一阶导数(离散形式)
dt = time[1] - time[0]  # 时间步长
first_derivative = np.diff(signal_with_noise) / dt

# 计算一阶导数的统计指标
std_dev_derivative = np.std(first_derivative)

# 打印导数的波动性指标
print(f"毛刺数据的一阶导数标准差: {std_dev_derivative:.2f}")

# 绘制原始信号与导数
plt.figure(figsize=(14, 6))

plt.subplot(2, 1, 1)
plt.plot(time, signal_with_noise, label='毛刺数据')
plt.xlabel('Time')
plt.ylabel('Value')
plt.title('原始数据 及其 一阶导数', fontproperties=zhfont, fontsize=12)
plt.legend()

plt.subplot(2, 1, 2)
plt.plot(time[:-1], first_derivative, label='一阶导数', color='orange')
plt.xlabel('Time')
plt.ylabel('Value')
# plt.title('原始数据求导', fontproperties=zhfont, fontsize=12)
plt.legend()
plt.show()

# 绘制导数的直方图
plt.figure(figsize=(14, 4))
plt.hist(first_derivative, bins=50, color='orange', edgecolor='k', alpha=0.7)
plt.xlabel('Derivative Value')
plt.ylabel('Frequency')
plt.title('一阶导数直方图')
plt.show()

整体对比

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import font_manager
fname="/usr/local/python3.6/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/simhei.ttf"
zhfont = font_manager.FontProperties(fname=fname)



# 计算一阶离散导数
dt = time[1] - time[0]
smooth_derivative = np.diff(signal) / dt
noisy_derivative = np.diff(signal_with_noise) / dt

# 计算标准差
std_dev_smooth = np.std(smooth_derivative)
std_dev_noisy = np.std(noisy_derivative)

# 打印结果
print(f"平滑数据一阶导数标准差: {std_dev_smooth:.2f}")
print(f"毛刺数据一阶导数标准差: {std_dev_noisy:.2f}")

# 绘制信号与导数
plt.figure(figsize=(12, 6))

plt.subplot(2, 1, 1)
plt.plot(time, smooth_signal, label='平滑数据', color='blue')
plt.plot(time, noisy_signal, label='毛刺数据', color='orange')
plt.xlabel('Time')
plt.ylabel('Value')
plt.title('原始数据对比', fontproperties=zhfont, fontsize=12)
plt.legend()

plt.subplot(2, 1, 2)
plt.plot(time[:-1], smooth_derivative, label='平滑数据一阶导数', color='blue')
plt.plot(time[:-1], noisy_derivative, label='毛刺数据一阶导数', color='orange')
plt.xlabel('Time')
plt.ylabel('Derivative Value')
plt.title('一阶导数对比', fontproperties=zhfont, fontsize=12)
plt.legend()

plt.tight_layout()
plt.show()

# 绘制导数的直方图
plt.figure(figsize=(12, 4))

plt.subplot(1, 2, 1)
plt.hist(smooth_derivative, bins=50, color='blue', edgecolor='k', alpha=0.7)
plt.xlabel('Derivative Value')
plt.ylabel('Frequency')
plt.title('平滑数据一阶导数直方图', fontproperties=zhfont, fontsize=12)

plt.subplot(1, 2, 2)
plt.hist(noisy_derivative, bins=50, color='orange', edgecolor='k', alpha=0.7)
plt.xlabel('Derivative Value')
plt.ylabel('Frequency')
plt.title('毛刺数据一阶导数直方图', fontproperties=zhfont, fontsize=12)

plt.tight_layout()
plt.show()

 

posted @ 2024-07-04 19:23  lixin[at]hitwh  阅读(217)  评论(0编辑  收藏  举报