Pharos
TAMath transform

LN - 自然对数

函数说明

计算数组中每个元素的自然对数(以e为底)。

语法

python
result = TA.LN(records)

参数

参数名类型说明
recordsarray数值数组,所有元素必须>0

返回值

返回自然对数数组

计算方法

对输入数组的每个元素x(x > 0),返回 ln(x) = log_e(x)

使用场景

  1. 对数收益率计算(最常用)
  2. 价格数据稳定化
  3. 指数关系线性化
  4. 对数正态分布处理

基础示例

python
import math

def main():
    records = exchange.GetRecords()
    if len(records) < 2:
        return
    
    # 计算对数收益率
    prices = [r['Close'] for r in records[-100:]]
    
    # 方法1:使用LN计算连续复利收益率
    log_prices = [math.log(p) for p in prices]
    log_returns = [log_prices[i] - log_prices[i-1] for i in range(1, len(log_prices))]
    
    # 对数收益率的优势:可加性
    total_return = sum(log_returns)
    Log(f"累计对数收益率: {total_return:.4f}")
    Log(f"等价于价格变化: {(math.exp(total_return) - 1) * 100:.2f}%")

高级应用

1. 波动率计算(对数收益率标准差)

python
def calculate_volatility():
    records = exchange.GetRecords()
    prices = [r['Close'] for r in records[-252:]]  # 一年数据
    
    # 计算对数收益率
    log_returns = []
    for i in range(1, len(prices)):
        log_return = math.log(prices[i] / prices[i-1])
        log_returns.append(log_return)
    
    # 年化波动率
    std_dev = TA.STDDEV(log_returns, len(log_returns))[-1]
    annual_volatility = std_dev * math.sqrt(252)
    
    Log(f"年化波动率: {annual_volatility * 100:.2f}%")
    return annual_volatility

2. 价格稳定化

python
def stabilize_prices():
    records = exchange.GetRecords()
    prices = [r['Close'] for r in records[-100:]]
    
    # 原始价格波动大
    # 对数转换后更平稳,适合建模
    log_prices = [math.log(p) for p in prices]
    
    # 对数价格的移动平均
    log_ma = TA.MA(log_prices, 20)
    
    # 转换回价格
    ma_prices = [math.exp(lp) for lp in log_ma]
    
    return ma_prices

3. 正态性检验

python
def check_normality():
    records = exchange.GetRecords()
    prices = [r['Close'] for r in records[-1000:]]
    
    # 简单收益率(通常不服从正态分布)
    simple_returns = [(prices[i] - prices[i-1]) / prices[i-1] 
                     for i in range(1, len(prices))]
    
    # 对数收益率(更接近正态分布)
    log_returns = [math.log(prices[i] / prices[i-1]) 
                   for i in range(1, len(prices))]
    
    Log(f"简单收益率均值: {sum(simple_returns)/len(simple_returns):.6f}")
    Log(f"对数收益率均值: {sum(log_returns)/len(log_returns):.6f}")

4. 夏普比率计算

python
def sharpe_ratio():
    records = exchange.GetRecords()
    prices = [r['Close'] for r in records[-252:]]
    
    # 对数收益率
    log_returns = [math.log(prices[i] / prices[i-1]) 
                   for i in range(1, len(prices))]
    
    # 年化收益
    annual_return = sum(log_returns)
    
    # 年化波动率
    std_dev = TA.STDDEV(log_returns, len(log_returns))[-1]
    annual_volatility = std_dev * math.sqrt(252)
    
    # 夏普比率(假设无风险利率=0)
    sharpe = annual_return / annual_volatility if annual_volatility > 0 else 0
    
    Log(f"夏普比率: {sharpe:.2f}")
    return sharpe

注意事项

  • 输入值必须 > 0
  • 对数收益率假设连续复利
  • 对数收益率具有时间可加性
  • 更适合正态分布假设
  • Python中可使用 math.log() 替代

相关函数

  • LOG10 - 常用对数
  • EXP - 指数函数(ln的反函数)
  • STDDEV - 标准差