以比亚迪为例,对其收盘价计算回撤,计算逻辑的核心是求的当前日期及其之前日期的价格的最大值,然后计算回撤率,然后就可以求最大值了。
本文不仅给出回撤的计算,还画出了价格与回撤率的组合图,便于观察。
看完这篇文章,还能学会组合图的绘制,一张绘制两张图,双纵轴坐标。
什么也不说了,一切尽在代码中

import numpy as np
import tushare as ts
import pandas as pd
ts.set_token('你得code')
df = ts.pro_bar(ts_code='002594.SZ', adj='qfq', start_date='20200101', end_date='20221004')
df
ts_code trade_date open high low close pre_close change pct_chg vol amount
0 002594.SZ 20220930 263.0000 263.5500 249.0000 252.0100 264.5700 -12.5600 -4.7473 214035.88 5421385.039
1 002594.SZ 20220929 270.0000 271.8000 264.0000 264.5700 265.6200 -1.0500 -0.3953 88356.68 2355802.796
2 002594.SZ 20220928 273.0000 273.0000 265.5000 265.6200 273.9600 -8.3400 -3.0442 85620.18 2293531.516
3 002594.SZ 20220927 272.9600 274.8300 270.0600 273.9600 272.9500 1.0100 0.3700 83095.93 2262822.665
4 002594.SZ 20220926 266.4000 276.0000 263.5800 272.9500 266.4000 6.5500 2.4587 143606.40 3911414.127
... ... ... ... ... ... ... ... ... ... ... ...
663 002594.SZ 20200108 47.4894 48.2884 47.0899 47.2198 47.9888 -0.7690 -1.6025 110974.45 529249.404
664 002594.SZ 20200107 48.2484 48.4382 47.7091 47.9888 48.2185 -0.2297 -0.4764 93400.58 449013.435
665 002594.SZ 20200106 47.3296 49.1273 47.1299 48.2185 47.9788 0.2397 0.4996 169871.38 822172.472
666 002594.SZ 20200103 48.1386 48.9276 47.6192 47.9788 48.1086 -0.1298 -0.2698 129936.07 628361.961
667 002594.SZ 20200102 47.6292 48.4082 47.4495 48.1086 47.6093 0.4993 1.0487 159345.70 765516.493

668 rows × 11 columns

# 计算每个日期及其之前的最高收盘价:首先df最近日期的数据在第一行,也就是时间降序排列的,max(df.loc[idx:,'close']),就是计算本日期和之前日期的最高收盘价,如果最高收盘价是自己,那么说明没有回撤
for idx,row in df.iterrows():
    df.loc[idx,'max']=max(df.loc[idx:,'close'])
df
ts_code trade_date open high low close pre_close change pct_chg vol amount max
0 002594.SZ 20220930 263.0000 263.5500 249.0000 252.0100 264.5700 -12.5600 -4.7473 214035.88 5421385.039 353.3961
1 002594.SZ 20220929 270.0000 271.8000 264.0000 264.5700 265.6200 -1.0500 -0.3953 88356.68 2355802.796 353.3961
2 002594.SZ 20220928 273.0000 273.0000 265.5000 265.6200 273.9600 -8.3400 -3.0442 85620.18 2293531.516 353.3961
3 002594.SZ 20220927 272.9600 274.8300 270.0600 273.9600 272.9500 1.0100 0.3700 83095.93 2262822.665 353.3961
4 002594.SZ 20220926 266.4000 276.0000 263.5800 272.9500 266.4000 6.5500 2.4587 143606.40 3911414.127 353.3961
... ... ... ... ... ... ... ... ... ... ... ... ...
663 002594.SZ 20200108 47.4894 48.2884 47.0899 47.2198 47.9888 -0.7690 -1.6025 110974.45 529249.404 48.2185
664 002594.SZ 20200107 48.2484 48.4382 47.7091 47.9888 48.2185 -0.2297 -0.4764 93400.58 449013.435 48.2185
665 002594.SZ 20200106 47.3296 49.1273 47.1299 48.2185 47.9788 0.2397 0.4996 169871.38 822172.472 48.2185
666 002594.SZ 20200103 48.1386 48.9276 47.6192 47.9788 48.1086 -0.1298 -0.2698 129936.07 628361.961 48.1086
667 002594.SZ 20200102 47.6292 48.4082 47.4495 48.1086 47.6093 0.4993 1.0487 159345.70 765516.493 48.1086

668 rows × 12 columns

# 计算回撤率
df['max_rt']= df['close']/df['max']-1

# 正负转化,乘以100,转化为%
df['max_rt']=-df['max_rt']*100
df
ts_code trade_date open high low close pre_close change pct_chg vol amount max max_rt
0 002594.SZ 20220930 263.0000 263.5500 249.0000 252.0100 264.5700 -12.5600 -4.7473 214035.88 5421385.039 353.3961 28.689083
1 002594.SZ 20220929 270.0000 271.8000 264.0000 264.5700 265.6200 -1.0500 -0.3953 88356.68 2355802.796 353.3961 25.134997
2 002594.SZ 20220928 273.0000 273.0000 265.5000 265.6200 273.9600 -8.3400 -3.0442 85620.18 2293531.516 353.3961 24.837880
3 002594.SZ 20220927 272.9600 274.8300 270.0600 273.9600 272.9500 1.0100 0.3700 83095.93 2262822.665 353.3961 22.477922
4 002594.SZ 20220926 266.4000 276.0000 263.5800 272.9500 266.4000 6.5500 2.4587 143606.40 3911414.127 353.3961 22.763720
... ... ... ... ... ... ... ... ... ... ... ... ... ...
663 002594.SZ 20200108 47.4894 48.2884 47.0899 47.2198 47.9888 -0.7690 -1.6025 110974.45 529249.404 48.2185 2.071197
664 002594.SZ 20200107 48.2484 48.4382 47.7091 47.9888 48.2185 -0.2297 -0.4764 93400.58 449013.435 48.2185 0.476373
665 002594.SZ 20200106 47.3296 49.1273 47.1299 48.2185 47.9788 0.2397 0.4996 169871.38 822172.472 48.2185 -0.000000
666 002594.SZ 20200103 48.1386 48.9276 47.6192 47.9788 48.1086 -0.1298 -0.2698 129936.07 628361.961 48.1086 0.269806
667 002594.SZ 20200102 47.6292 48.4082 47.4495 48.1086 47.6093 0.4993 1.0487 159345.70 765516.493 48.1086 -0.000000

668 rows × 13 columns

# 计算最大回撤
max(df['max_rt'])
46.18689685526171
df.sort_values(by='trade_date',inplace=True) #排个序
df
ts_code trade_date open high low close pre_close change pct_chg vol amount max max_rt
667 002594.SZ 20200102 47.6292 48.4082 47.4495 48.1086 47.6093 0.4993 1.0487 159345.70 765516.493 48.1086 -0.000000
666 002594.SZ 20200103 48.1386 48.9276 47.6192 47.9788 48.1086 -0.1298 -0.2698 129936.07 628361.961 48.1086 0.269806
665 002594.SZ 20200106 47.3296 49.1273 47.1299 48.2185 47.9788 0.2397 0.4996 169871.38 822172.472 48.2185 -0.000000
664 002594.SZ 20200107 48.2484 48.4382 47.7091 47.9888 48.2185 -0.2297 -0.4764 93400.58 449013.435 48.2185 0.476373
663 002594.SZ 20200108 47.4894 48.2884 47.0899 47.2198 47.9888 -0.7690 -1.6025 110974.45 529249.404 48.2185 2.071197
... ... ... ... ... ... ... ... ... ... ... ... ... ...
4 002594.SZ 20220926 266.4000 276.0000 263.5800 272.9500 266.4000 6.5500 2.4587 143606.40 3911414.127 353.3961 22.763720
3 002594.SZ 20220927 272.9600 274.8300 270.0600 273.9600 272.9500 1.0100 0.3700 83095.93 2262822.665 353.3961 22.477922
2 002594.SZ 20220928 273.0000 273.0000 265.5000 265.6200 273.9600 -8.3400 -3.0442 85620.18 2293531.516 353.3961 24.837880
1 002594.SZ 20220929 270.0000 271.8000 264.0000 264.5700 265.6200 -1.0500 -0.3953 88356.68 2355802.796 353.3961 25.134997
0 002594.SZ 20220930 263.0000 263.5500 249.0000 252.0100 264.5700 -12.5600 -4.7473 214035.88 5421385.039 353.3961 28.689083

668 rows × 13 columns

df=df.set_index('trade_date')
import numpy as np                             # 导入各个模块
import matplotlib.pyplot as plt
import pandas as pd
from pandas import Series, DataFrame
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']   # 设置字体为黑体
mpl.rcParams['axes.unicode_minus'] = False     # 解决中文字体负号显示不正常问题

plt.rcParams.update({'font.size': 20})

fig = plt.figure(figsize=(30,15))
ax1 = fig.add_subplot(111)
df['close'].plot(ax=ax1,ls='-',alpha=1.0,label='收盘价',color='#000000')    # alpha表示点的透明程度
plt.xlabel('日期')
ax1.set_ylabel('收盘价')                  # 设置左边纵坐标标签
plt.legend(loc=2)            # 设置图例在左上方

ax2 = ax1.twinx()
df['max_rt'].plot(ax=ax2,grid=True,label='回撤率',alpha=0.7)
ax2.set_ylabel('回撤率',)       # 设置右边纵坐标标签
plt.legend(loc=1)                # 设置图例在右上方
plt.title('收盘价与回撤率')    # 给整张图命名
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HyAGqJpp-1665117029884)(output_6_0.png)]
从图中可以清楚的看到随着时间的走势,回撤的变化,最大回撤情况。

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐