TAMath transform
LN - 自然对数
函数说明
计算数组中每个元素的自然对数(以e为底)。
语法
python
result = TA.LN(records)参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| records | array | 数值数组,所有元素必须>0 |
返回值
返回自然对数数组
计算方法
对输入数组的每个元素x(x > 0),返回 ln(x) = log_e(x)
使用场景
- 对数收益率计算(最常用)
- 价格数据稳定化
- 指数关系线性化
- 对数正态分布处理
基础示例
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_volatility2. 价格稳定化
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_prices3. 正态性检验
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()替代