You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何反转OHLC金融数据?

如何反转OHLC金融数据?

我完全懂你想要的效果——把OHLC蜡烛线整个反转:原来的上涨牛线变成下跌熊线,下跌熊线变成上涨牛线,同时还要每根蜡烛的高低点范围完全保留对吧?我来帮你把思路补全,再给你完善后的代码。

先再明确下基础概念:

  • 上涨蜡烛(牛线):收盘价高于开盘价
  • 下跌蜡烛(熊线):收盘价低于开盘价

从你给的示例来看,你要的不只是交换开收盘反转牛熊,还要让整个蜡烛的价格区间(高点到低点)也对应反转,这样整个图表的走势就完全反过来了。

完整的反转思路

其实不用分两步单独处理,咱们可以用一个更简洁的方法,一次性完成反转牛熊+保留高低点范围:
围绕每根蜡烛的高低点中点来翻转所有价格。具体来说,对于每根蜡烛的每个价格(开、收、高、低),用「高点+低点-原价格」来计算新价格。

为什么这个方法有效?

  1. 自动反转牛熊:如果原蜡烛是牛线(Open < Close),翻转后新Open = High+Low - Open,新Close = High+Low - Close,因为Open < Close,所以新Open > 新Close,直接变成熊线;反之熊线会自动变成牛线,完全不用额外判断。
  2. 完美保留高低点范围:翻转后的新High = High+Low - 原Low,新Low = High+Low - 原High,计算差值会发现:新High - 新Low = (High+Low - Low) - (High+Low - High) = High - Low,和原蜡烛的高低点差完全一致,范围丝毫不差。

完善后的代码

方法1:逐行处理(适合小数据集,直观易懂)

def invert_ohlc(row):
    high_low_sum = row['High'] + row['Low']
    # 翻转开、收盘价
    row['Open'] = high_low_sum - row['Open']
    row['Close'] = high_low_sum - row['Close']
    # 翻转高、低点(注意基于原高低点计算)
    row['High'] = high_low_sum - row['Low']
    row['Low'] = high_low_sum - row['High']
    return row

# 应用到整个数据集
df_inverted = df.apply(invert_ohlc, axis=1)

方法2:矢量化处理(适合大数据集,效率更高)

逐行的apply在数据量大的时候会比较慢,用Pandas的矢量化操作能大幅提升速度:

# 先计算所有行的高点+低点之和
high_low_sum = df['High'] + df['Low']

# 保存原高低点,避免后续覆盖影响计算
original_high = df['High'].copy()
original_low = df['Low'].copy()

# 批量翻转开、收、高、低价格
df['Open'] = high_low_sum - df['Open']
df['Close'] = high_low_sum - df['Close']
df['High'] = high_low_sum - original_low
df['Low'] = high_low_sum - original_high

验证效果

拿你给的第一行数据举例:
原数据:Open=1302000000,Close=1303550000,High=1303600000,Low=1302000000
处理后:
Open=1303600000+1302000000-1302000000=1303600000
Close=1303600000+1302000000-1303550000=1302050000
High=1303600000+1302000000-1302000000=1303600000
Low=1303600000+1302000000-1303600000=1302000000
可以看到,原来的牛线直接变成了熊线,高低点范围和原蜡烛完全一致,完全符合你想要的反转效果。

备注:内容来源于stack exchange,提问作者William

火山引擎 最新活动