如何使用SQL计算单只股票的每日回撤值
如何计算单只股票的每日回撤值
嘿,我完全懂你的痛点——全数据集的最大回撤是抓全局最高点来算,但每日回撤需要动态跟踪到当天为止的历史最高价,逻辑上就是把“全局最高”换成“截至当日的滚动最高”,我给你拆解成具体的实现步骤,不管用Python还是Excel都能搞定:
核心逻辑回顾
你定义的每日回撤公式:
(截至当日及之前的最高价格 - 当前价格) / 截至当日及之前的最高价格
关键就在于“截至当日及之前的最高价格”——这是一个滚动计算的最大值,而不是整个数据集的固定最大值。
用Python Pandas实现(最常用的股票数据处理方式)
假设你已经把单只股票的价格数据整理成了Pandas DataFrame,比如包含Date(日期)和Close(收盘价)列:
计算滚动历史最高价
用cummax()函数,它会逐行计算从数据集开头到当前行的最大值,完美匹配“截至当日及之前的最高价格”需求:import pandas as pd # 假设你的数据存在df中,'Close'是收盘价列 df['Rolling_High'] = df['Close'].cummax()计算每日回撤值
直接套用你的公式即可:df['Daily_Drawdown'] = (df['Rolling_High'] - df['Close']) / df['Rolling_High']
举个直观的小例子:
如果前4天的收盘价是[100, 105, 102, 98],那么:
- 滚动最高价依次是
[100, 105, 105, 105] - 每日回撤就是
[0, 0, ~0.0286, ~0.0667](也就是0%、0%、2.86%、6.67%)
用Excel实现(适合手动处理小数据集)
如果用Excel操作,逻辑是一样的:
- 假设收盘价在B列(B2开始是第一天价格)
- 在C2单元格输入
=B2(第一天的滚动最高价就是自身) - 在C3单元格输入
=MAX(C2, B3),然后下拉填充到所有行——这就得到了截至每日的历史最高价 - 在D3单元格输入
=(C3-B3)/C3,下拉填充,就是每日回撤值
额外提示
- 当当日收盘价创新高时,滚动最高价会更新为当日价格,此时每日回撤值为0,完全符合你的定义
- 如果需要把回撤值转成百分比格式,不管是Pandas还是Excel都可以直接设置格式,比如Pandas里用
df['Daily_Drawdown'] = df['Daily_Drawdown'].mul(100).round(2)保留两位小数的百分比
内容的提问来源于stack exchange,提问作者Coding_Newbie
相关产品推荐
相关产品推荐

