李津大局观:Python编程Renko砖块图实现杰西·利弗莫尔livemore的6点转向
利弗莫尔交易股票的基础在今天被称之为“技术分析(technical analysis)”鼻祖,1939年底,利弗莫尔写一本书《股票大作手操盘术(How To Trade In Stocks)》。书中详细介绍了利弗莫尔操盘技巧,其中最重要的就是到今天也很少人运用的6点转向原则。
图源:《股票大作手操盘术》
可以看出,六点转向本质上是价格趋势的过滤方法,是用来排除错误的噪声信号,留下主频的信号,而这里参数是设置为6个点。具体的livermore的操盘操作原则可以直接百度一下,篇幅有限或者买一本书详细翻阅比较好。原则是没错,但是缺少工具。
因此,今天文章的重点是,网络上大部分解释都不太正确,因为他们所使用的自然时间序列,而我翻阅原书对比发现,6点转向则不然,他用的是点位序列。直到通过长期的研究摸索,终于发现日本砖型图(renko chart)与利弗莫尔livermore的思想是如出一辙的。
举例:某指数的起点为1000,砖头高度为6。在上升趋势中,每上升6个点,绘制一个新的白色柱。例如当市场收盘价高于1006,绘制一个新的白色柱。反之,如果市场处于下降趋势,例如当市场收盘价低于994,则绘制一个黑色柱线。
然而日本砖型图(renko chart)纵观通达信、同花顺、大智慧都没有能够写出对应的代码,因此只能借助Python强大的编程力量。
砖型图极其简约明了,Renko Chart只有黑和白两种形态,可以用0和1代替,非常适合通过机器学习,从大量数据库去发掘其规律。
上图一个简单的策略:当等待出现2个相同颜色的砖块图后进场,在获得利润后,以一个反向的砖块出现作为出场信号。
至此,代码应该怎么写呢!直接复制黏贴以下代码,改后缀txt为py
import json
import pandas as pd
import matplotlib.pyplot as plt
import requests
import numpy as np
from finta import TA
import mplfinance as mpf
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def get_stock_hist_data_em(stock='399300',start_date='20210101',end_date='20500101',data_type='15'):
start_date=''默认上市时间
- ``1`` : 分钟
- ``5`` : 5 分钟
- ``15`` : 15 分钟
- ``30`` : 30 分钟
- ``60`` : 60 分钟
- ``101`` : 日
- ``102`` : 周
- ``103`` : 月
fq=0股票除权
fq=1前复权
fq=2后复权
'''
data_dict = {'1': '1', '5': '5', '15': '15', '30': '30', '60': '60', 'D': '101', 'W': '102', 'M': '103'}
klt = data_dict[data_type]
fq='1'
if stock[0] == '6':
stock = '1.' + stock
else:
stock = '0.' + stock
url = 'http://push2his.eastmoney.com/api/'
params = {
'fields1': 'f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13',
'fields2': 'f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61',
'beg': start_date,
'end': end_date,
'ut': 'fa5fd1943c7b386f172d6893dbfba10b',
'rtntype': end_date,
'secid': stock,
'klt': klt,
'fqt': fq,
'cb': 'jsonp1668432946680'
}
res = requests.get(url=url, params=params)
text = res.text[19:len(res.text) - 2]
json_text = json.loads(text)
try:
df = pd.DataFrame(json_text['data'])
df.columns = ['数据']
data_list = []
for i in df['数据']:
data_list.append(i.split(','))
data = pd.DataFrame(data_list)
columns = ['date', 'open', 'close', 'high', 'low', 'volume', '成交额', '振幅', '涨跌幅', '涨跌额', '换手率']
data.columns = columns
for m in columns[1:]:
data[m] = pd.to_numeric(data[m])
data.sort_index(ascending=True,ignore_index=True,inplace=True)
return data
except:
pass
def plot_kline_figure(stock='399006',start_date='20210101',end_date='20500101',data_type='D'):
df1=get_stock_hist_data_em(stock=stock,start_date=start_date,end_date=end_date)
df1.rename(columns={'date': 'Date', 'open': 'Open', 'close': 'Close', 'high': 'High', 'low': 'Low',
'volume': 'Volume'}, inplace=True)
df1['Date'] = pd.to_datetime(df1['Date'])
df1.set_index(['Date'], inplace=True)
mpf.plot(df1, type='renko',renko_params=dict(brick_size=6))
plt.show()
a=plot_kline_figure()
print(a)
至此,完美复现成功
我们得到了livemore当年看到的图表版的6点转向图,从上图可以看出交易信号,以及市场是怎么样运行的,这是由点数构成的,不由时间构成,这就避免了跳空缺口带来的走势断续。