http://t.csdn.cn/8hd5jhttp://t.csdn.cn/8hd5jpython有几个股票数据获取接口,如tushare,但其只能获取到一般指标,且是积分制,即如果要获取更多的指标和接口,则需要做任务提高积分;pytdx可以获取到基本指标,且速度较快,性能比较稳定;talib可以获取到股票高级技术量化指标,但经过测试,其获取到的数据与各大第三方股票软件数据不一致,如通达信、同花顺、东方财富.
先了解一下DIF、DEA、MACD指标的计算方式:
dif/dea/macd计算公式
经过调查,之所以有差距,是因为talib的DIF/DEA/MACD指标计算中用到的初始EMA指标,是将我们调用时间段的起始日EMA赋值为0,而各大交易软件商则将其股票上市日的EMA赋值为0.
那是不是我们将调用数据的起始时间定为股票上市时间就可以了呢,当然可以,利用tushare接口可以获取到股票的上市时间,但这样不能一次性获取所有,比较麻烦,需要单个调用。故知道了计算公式的我们可以自己计算。
代码如下:
#导入相关模块
from __future__ import print_function, absolute_import
from gm.api import *
import pandas as pd
import numpy as np
import tushare as ts
from datetime import date,timedelta,datetime
import time
#单只股票计算函数
def MACD(ts_code,start_time, end_time):
# 取历史数据,取到上市首日
ts.set_token('###########################')
pro=ts.pro_api()
data=pro.daily(ts_code=ts_code)
data.sort_values(by='trade_date',inplace=True)
# 将数据转化为dataframe格式
#data['bob'] = data['bob'].apply(lambda x: x.strftime('%Y-%m-%d')).tolist()
# 计算EMA(12)和EMA(16)
data['EMA12'] = data['close'].ewm(alpha=2 / 13, adjust=False).mean()
data['EMA26'] = data['close'].ewm(alpha=2 / 27, adjust=False).mean()
# 计算DIFF、DEA、MACD
data['DIFF'] = data['EMA12'] - data['EMA26']
data['DEA'] = data['DIFF'].ewm(alpha=2 / 10, adjust=False).mean()
data['MACD'] = 2 * (data['DIFF'] - data['DEA'])
# 上市首日,DIFF、DEA、MACD均为0
data['DIFF'].iloc[0] = 0
data['DEA'].iloc[0] = 0
data['MACD'].iloc[0] = 0
# 按照起止时间筛选
MACD = data[(data['trade_date'] >= start_time)]
return MACD
# 测试一下
ts.set_token('############################')
pro=ts.pro_api()
#获取主板上市股票
stocks = pro.stock_basic(exchange='', list_status='L', market='',fields='ts_code,symbol,name,industry,list_date')
df=pd.DataFrame()
x=0
n=len(stocks['ts_code'])
for i in list(stocks['ts_code']):
try:
a= MACD(ts_code = i,start_time = '2021-01-01',end_time = '20210308')
df=pd.concat([df,a],axis=0)
print(i)
time.sleep(0.301)
except:
pass
df= MACD(ts_code='',start_time = '2021-01-01',end_time = '20210308')
df.to_excel('cast.xlsx')
这里用了tushare获取股票的基本数据,然后进行计算。下面是UP主获取到的数据,经与交易软件对比,四舍五入后完全一致,感兴趣的小伙伴可以自己尝试一下。