学习记录657@python计算股价的回撤与收盘价回撤率组合图实现
以比亚迪为例,对其收盘价计算回撤,计算逻辑的核心是求的当前日期及其之前日期的价格的最大值,然后计算回撤率,然后就可以求最大值了。本文不仅给出回撤的计算,还画出了价格与回撤率的组合图,便于观察。看完这篇文章,还能学会组合图的绘制,一张绘制两张图,双纵轴坐标。从图中可以清楚的看到随着时间的走势,回撤的变化,最大回撤情况。什么也不说了,一切尽在代码中。
·
以比亚迪为例,对其收盘价计算回撤,计算逻辑的核心是求的当前日期及其之前日期的价格的最大值,然后计算回撤率,然后就可以求最大值了。
本文不仅给出回撤的计算,还画出了价格与回撤率的组合图,便于观察。
看完这篇文章,还能学会组合图的绘制,一张绘制两张图,双纵轴坐标。
什么也不说了,一切尽在代码中
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()
从图中可以清楚的看到随着时间的走势,回撤的变化,最大回撤情况。

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