一、建立环境
conda create -n chan python=2.7
利用Anaconda建立虚拟环境的时候,会显示虚拟环境的保存位置,比如:C:\ProgramData\Anaconda3\envs\chan
二、pycharm打开虚拟环境
记得选择“Exsiting envirement”
三、安装JQData
使用这里的方法安装失败,后来直接使用pip install jqdatasdk安装成功。
四、调试
单击打断点,双击取消断点
程序执行到断点处,会停住,并在这一行显示蓝色,放到断点的那一行会显示所有数据。点击F8继续执行代码。
跳到下一个断点。
F7
进入函数
F9
只在断点和交互处停止,快速调式。shift + f9 运行debug模式
五、测试代码
# -*- coding: UTF-8 –*-
from chan_lun_util import *
import numpy as np
import time
from jqdatasdk import *
auth('13xxxxxxx80','a4')
nan = 0
stock_code = '601318.XSHG'
start_date = '2016-02-05'
end_date = '2017-02-07'
quotes = get_price(stock_code, start_date, end_date, frequency='daily',skip_paused=False,fq='pre')
quotes[quotes['volume']==0]=np.nan
quotes= quotes.dropna()
# 处理以上分笔结果,组织成实际上图的点
k_line_list = []
date_list = quotes.index.tolist()
print(date_list[1])
data_per_day = quotes.values.tolist()
print(data_per_day)
x_date_list = quotes.index.values.tolist()
for index in range(len(date_list)):
date_time = date_list[index]
open_price = data_per_day[index][0]
close_price = data_per_day[index][1]
high_price = data_per_day[index][2]
low_price = data_per_day[index][3]
k_line_dto = KLineDTO(date_time,
date_time,
date_time,
open_price, high_price, low_price, close_price)
k_line_list.append(k_line_dto)
# 1.K线合并
merge_line_list = find_peak_and_bottom(k_line_list, "down")
# 2.分笔
fenbi_result,final_result_array,fenbi_seq_list = fen_bi(merge_line_list)
# 3.得到分笔结果,计算坐标显示
x_fenbi_seq = []
y_fenbi_seq = []
for i in range(len(final_result_array)):
if final_result_array[i]:
m_line_dto = merge_line_list[fenbi_seq_list[i]]
if m_line_dto.is_peak == 'Y':
peak_time = None
for k_line_dto in m_line_dto.member_list[::-1]:
if k_line_dto.high == m_line_dto.high:
# get_price返回的日期,默认时间是08:00:00
peak_time = k_line_dto.begin_time.strftime('%Y-%m-%d') +' 08:00:00'
break
x_fenbi_seq.append(x_date_list.index(long(time.mktime(datetime.strptime(peak_time, "%Y-%m-%d %H:%M:%S").timetuple())*1000000000)))
y_fenbi_seq.append(m_line_dto.high)
if m_line_dto.is_bottom == 'Y':
bottom_time = None
for k_line_dto in m_line_dto.member_list[::-1]:
if k_line_dto.low == m_line_dto.low:
# get_price返回的日期,默认时间是08:00:00
bottom_time = k_line_dto.begin_time.strftime('%Y-%m-%d') +' 08:00:00'
break
x_fenbi_seq.append(x_date_list.index(long(time.mktime(datetime.strptime(bottom_time, "%Y-%m-%d %H:%M:%S").timetuple())*1000000000)))
y_fenbi_seq.append(m_line_dto.low)

四、折线图
import matplotlib.pyplot as plt
#图形输入值
input_values = [1,2,3,4,5,7]
#图形输出值
squares = [1,4,9,6,25,7]
# plot根据列表绘制出有意义的图形,linewidth是图形线宽,可省略
plt.plot(input_values,squares,linewidth=5)
#设置图标标题
plt.title("Square Numbers",fontsize = 24)
#设置坐标轴标签
plt.xlabel("Value",fontsize = 14)
plt.ylabel("Square of Value",fontsize = 14)
#设置刻度标记的大小
plt.tick_params(axis='both',labelsize = 14)
#打开matplotlib查看器,并显示绘制图形
plt.show()
备注:其实只需要前面三行代码,就可以出效果了。
展示:

按时间轴
import pandas
import matplotlib
import mpl_finance
import matplotlib.pyplot as plt
def stockPricePlot(ticker):
# Step 1. Load Data
history = pandas.read_csv('../02. Data/01. IntradayUS/'+ticker+'.csv', parse_dates=True, index_col=0)
# Step 2. Data Manipulation
close = history['close']
close = close.resample('1D').ohlc() #根据close生成一天的4个价格
close = close.reset_index() #增加一个额外的索引列,从0开始
plt.plot(close['timestamp'],close['close'],linewidth=2)
plt.show()
stockPricePlot('AAON')
展示:

五、折线+均线+成交量
import pandas
import matplotlib
import mpl_finance
import matplotlib.pyplot as plt
from jqdatasdk import *
matplotlib.style.use('ggplot')
auth('138xxxxxxxx','a4')
stock_code = '600031.XSHG'
start_date = '2018-08-17'
end_date = '2019-08-17'
def getData():
"""通过聚宽平台获取数据"""
quotes = get_price(stock_code, start_date, end_date, frequency='daily',skip_paused=False,fq='pre')
return quotes
def stockPricePlot(df):
#生成100天均线数据
df['100ma'] = df['close'].rolling(window=100,min_periods=0).mean()
ax1 = plt.subplot2grid((6,1),(0,0),rowspan=5,colspan=1)
ax2 = plt.subplot2grid((6,1),(5,0),rowspan=5,colspan=1,sharex=ax1)
ax1.plot(df.index,df['close'])
ax1.plot(df.index,df['100ma'])
ax2.bar(df.index,df['volume'])
plt.show()
df = getData()
stockPricePlot(df)
成果展示:


六、K线合成
import pandas
import matplotlib
import mpl_finance
import matplotlib.pyplot as plt
from jqdatasdk import *
matplotlib.style.use('ggplot')
auth('138xxxxxxxx','axxx4')
stock_code = '600031.XSHG'
start_date = '2018-08-17'
end_date = '2019-08-17'
def getData():
"""通过聚宽平台获取数据"""
quotes = get_price(stock_code, start_date, end_date, frequency='30m', fields=['open','close','high', 'low','volume'],skip_paused=False,fq='pre')
# print(quotes)
return quotes
def stockPricePlot(df):
# #获取ohlc,同样带了时间的index
period_stock_date = df.resample('1D').last()
#日线的[open]等于那一天的第一个30分钟K的[open]
period_stock_date['open'] = df['open'].resample('1D').first()
period_stock_date['high'] = df['high'].resample('1D').max()
period_stock_date['low'] = df['low'].resample('1D').min()
period_stock_date['close'] = df['low'].resample('1D').last()
period_stock_date['volume'] = df['volume'].resample('1D').sum()
#股票在有些天没有交易,将这些天去掉
period_stock_date = period_stock_date[period_stock_date['open'].notnull()]
# #生成100天均线数据
period_stock_date['100ma'] = period_stock_date['close'].rolling(window=100,min_periods=0).mean()
ohlc = period_stock_date[['open', 'high', 'low', 'close']]
ohlc.index.name = 'timestamp'
ohlc = ohlc.reset_index()
#对日期格式进行转换,转换后变成了737278.0、737279.0这样的形式。
ohlc['timestamp'] = ohlc['timestamp'].map(matplotlib.dates.date2num)
ax1 = plt.subplot2grid((6,1),(0,0),rowspan=5,colspan=1)
ax2 = plt.subplot2grid((6,1),(5,0),rowspan=5,colspan=1,sharex=ax1)
mpl_finance.candlestick_ohlc(ax=ax1, quotes=ohlc.values, width=0.20, colorup='g', colordown='r')
ax1.plot(period_stock_date['100ma'])
ax2.bar(ohlc['timestamp'],period_stock_date['volume'])
plt.show()
df = getData()
stockPricePlot(df)
经测试,从30分钟合成日线完全正确:


成果展示:

不过这里还是有一个bug,就是有些日期print出来明明没有,但是在plot.show()的图表中却有这一天。

然后发现真的存在这个问题:
https://www.jianshu.com/p/c10e57ccc7ba?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation