Python/Pandas计算Ichimoku图表组件

chi*_*liq 3 python pandas

我有Pandas DataFrame对象,包括Date,Open,Close,Low和High每日股票数据.我想计算Ichimoku图表的组件.我可以使用以下代码获取我的数据:

high_prices = data['High']
close_prices = data['Close']
low_prices = data['Low']
dates = data['Date']  # contains datetime objects
Run Code Online (Sandbox Code Playgroud)

我需要计算以下系列(Ichimoku称之为Tenkan-Sen系列):

(9期高+ 9期低)/ 2

  • 9周期高=过去9天的最高值,
  • 9期低=最近9天的最低低值,因此两者都应该在第9天开始.

在此输入图像描述

我在这里找到了R语言的解决方案,但是我很难将其翻译成Python/Pandas代码.

Ichimoku图表包含更多组件,但是当我知道如何计算Pandas中的Tenkan-Sen系列时,我将能够计算所有这些(我将共享代码).

chi*_*liq 7

感谢前面的回答,有代码:

# Tenkan-sen (Conversion Line): (9-period high + 9-period low)/2))
period9_high = pd.rolling_max(high_prices, window=9)
period9_low = pd.rolling_min(low_prices, window=9)
tenkan_sen = (period9_high + period9_low) / 2

# Kijun-sen (Base Line): (26-period high + 26-period low)/2))
period26_high = pd.rolling_max(high_prices, window=26)
period26_low = pd.rolling_min(low_prices, window=26)
kijun_sen = (period26_high + period26_low) / 2

# Senkou Span A (Leading Span A): (Conversion Line + Base Line)/2))
senkou_span_a = ((tenkan_sen + kijun_sen) / 2).shift(26)

# Senkou Span B (Leading Span B): (52-period high + 52-period low)/2))
period52_high = pd.rolling_max(high_prices, window=52)
period52_low = pd.rolling_min(low_prices, window=52)
senkou_span_b = ((period52_high + period52_low) / 2).shift(26)

# The most current closing price plotted 22 time periods behind (optional)
chikou_span = close_prices.shift(-22) # 22 according to investopedia
Run Code Online (Sandbox Code Playgroud)

  • 你几乎得到了它,你忘了在两个senkou跨度中添加`.shift(26)`,你忘记了`Chikou_Span = close_prices.shift(-26)` (3认同)
  • Chikou 是 `-26` 而不是 `-22` (3认同)

EdC*_*ica 6

我不是金融专家或策划专家,但以下显示了样本财务数据以及如何使用rolling_maxrolling_min:

In [60]:

import pandas.io.data as web
import datetime
start = datetime.datetime(2010, 1, 1)
end = datetime.datetime(2013, 1, 27)
data=web.DataReader("F", 'yahoo', start, end)
high_prices = data['High']
close_prices = data['Close']
low_prices = data['Low']
dates = data.index
nine_period_high = pd.rolling_max(data['High'], window= 9 )
nine_period_low = pd.rolling_min(data['Low'], window= 9 )
ichimoku = (nine_period_high + nine_period_low) /2
ichimoku
Out[60]:
Date
2010-01-04       NaN
2010-01-05       NaN
2010-01-06       NaN
2010-01-07       NaN
2010-01-08       NaN
2010-01-11       NaN
2010-01-12       NaN
2010-01-13       NaN
2010-01-14    11.095
2010-01-15    11.270
2010-01-19    11.635
2010-01-20    11.730
2010-01-21    11.575
2010-01-22    11.275
2010-01-25    11.220
...
2013-01-04    12.585
2013-01-07    12.685
2013-01-08    13.005
2013-01-09    13.030
2013-01-10    13.230
2013-01-11    13.415
2013-01-14    13.540
2013-01-15    13.675
2013-01-16    13.750
2013-01-17    13.750
2013-01-18    13.750
2013-01-22    13.845
2013-01-23    13.990
2013-01-24    14.045
2013-01-25    13.970
Length: 771
Run Code Online (Sandbox Code Playgroud)

调用data[['High', 'Low', 'Close', 'ichimoku']].plot()结果如下:

在此输入图像描述

更新

在@ PedroLobito的评论指出不完整/不正确的公式后,我采取了@ chilliq的答案并修改了pandas版本0.16.1及以上:

import pandas as pd
from pandas_datareader import data, wb
import datetime
start = datetime.datetime(2010, 1, 1)
end = datetime.datetime(2013, 1, 27)
d=data.DataReader("F", 'yahoo', start, end)
high_prices = d['High']
close_prices = d['Close']
low_prices = d['Low']
dates = d.index
nine_period_high = pd.rolling_max(d['High'], window= 9 )
nine_period_low = pd.rolling_min(d['Low'], window= 9 )
d['tenkan_sen'] = (nine_period_high + nine_period_low) /2

# Kijun-sen (Base Line): (26-period high + 26-period low)/2))
period26_high = pd.rolling_max(high_prices, window=26)
period26_low = pd.rolling_min(low_prices, window=26)
d['kijun_sen'] = (period26_high + period26_low) / 2

# Senkou Span A (Leading Span A): (Conversion Line + Base Line)/2))
d['senkou_span_a'] = ((d['tenkan_sen'] + d['kijun_sen']) / 2).shift(26)

# Senkou Span B (Leading Span B): (52-period high + 52-period low)/2))
period52_high = pd.rolling_max(high_prices, window=52)
period52_low = pd.rolling_min(low_prices, window=52)
d['senkou_span_b'] = ((period52_high + period52_low) / 2).shift(26)

# The most current closing price plotted 22 time periods behind (optional)
d['chikou_span'] = close_prices.shift(-22) # 22 according to investopedia
d.plot()
Run Code Online (Sandbox Code Playgroud)

导致以下情节,不清楚,因为已经说明我不是金融专家:

在此输入图像描述