1.从Tushare平台抓取股票信息,主要包括股票code,名称,存储到本地
##获取股票基本列表
def get_stock_list():
df = ts.get_stock_basics()
return df
## 保存股票数据到指定路径
def save_csv(df, path):
today = datetime.date.today().strftime('%Y-%m-%d')
df.to_csv(path +'stock_list.csv')
2.根据股票code拉取最新N天的交易信息,使用talib算出KDJ、MACD、RSI等信息
## 获取MACD
def get_MADC(df, code):
close = [float(x) for x in df['close']]
df['MACD'], df['MACDsignal'], df['MACDhist'] = ta.MACD(np.array(close), fastperiod=6, slowperiod=12, signalperiod=9)
print('---------------------MACD---------------------')
print(df.tail(1))
## 存储数据到文档
sava_data(df, code, 'MACD')
sava_data(df, code, 'MACDsignal')
sava_data(df, code, 'MACDhist')
print('---------------------MACD---------------------')
##获取jdk
def get_KDJ(df, code):
# 参数9,3,3
df['slowk'], df['slowd'] = ta.STOCH(np.array(df['high']), np.array(df['low']), np.array(df['close']),
fastk_period=9,
slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0)
print('---------------------KDJ---------------------')
print(df.tail(1))
sava_data(df, code, 'slowk')
sava_data(df, code, 'slowd')
print('---------------------KDJ---------------------')
def get_RSI(df, code):
close = [float(x) for x in df['close']]
# 参数14,5
df['slowreal'] = ta.RSI(np.array(close), timeperiod=14)
df['fastreal'] = ta.RSI(np.array(close), timeperiod=5)
print('---------------------RSI---------------------')
print(df.tail(1))
sava_data(df, code, 'slowreal')
sava_data(df, code, 'fastreal')
print('---------------------RSI---------------------')
3.写出计算符合相关指标的筛选方法
## 换手率
def judge_turnover(item):
return item.turnover > 0 and item.turnover > 3 and item.turnover < 10
### 判断MACD 当为正的时候 良好 不是必须
def judge_MACD(item):
return item.MACD > -3 and item.MACD != 0
### 判断jdk 当k线和d线小于三十 并且k先>d线作为买入依据
def judge_JDK(item):
if item.slowk == 0 or item.slowd == 0:
return False
return item.slowk < 30 and item.slowd < 30 and item.slowk > item.slowd
### 判断RSI
def judge_RSI(item):
if item.slowreal == 0 or item.fastreal == 0:
return False
if item.fastreal > 50 and item.fastreal < 80 and item.slowreal > 50 and item.slowreal < 80:
return True
if item.slowreal < 20 or item.fastreal < 20:
# if item.fastreal > item.slowreal:
return True
if item.fastreal < 30 and item.fastreal > item.slowreal:
return True
return False
运行结果如下:
潜力股 code:603398 name:邦宝益智
潜力股 code:600804 name:鹏博士
潜力股 code:600512 name:腾达建设
潜力股 code:600241 name:时代万恒
潜力股 code:300325 name:德威新材
潜力股 code:300312 name:邦讯技术
潜力股 code:300064 name:豫金刚石
潜力股 code:300110 name:华仁药业
潜力股 code:300566 name:激智科技
Process finished with exit code 0全部代码 筛选方法可以根据自己需要修改
import tushare as ts
import pandas as pd
import numpy as np
import talib as ta
import datetime
import time
import sys
code = 600519
## 获取历史数据
def get_k_data(code):
now_time = datetime.datetime.now()
# 两个月前
one_m_time = now_time + datetime.timedelta(days=-60)
df = ts.get_k_data(str(code), start=one_m_time.strftime('%Y-%m-%d'))
return df
## 获取历史数据
def get_history_data(code):
now_time = datetime.datetime.now()
# 两个月前
one_m_time = now_time + datetime.timedelta(days=-4)
df = ts.get_hist_data(str(code), start=one_m_time.strftime('%Y-%m-%d'))
return df
## 存储数据到文档
def sava_data(df, code, name):
index = p_pf[(p_pf.code == code)].index.tolist()[0]
p_pf.loc[index, name] = df.tail(1)[name].values
## 存储数据到文档
def sava_data2(df, code, name):
index = p_pf[(p_pf.code == code)].index.tolist()[0]
p_pf.loc[index, name] = df.head(1)[name].values
print(p_pf.loc[index])
## 获取MACD
def get_MADC(df, code):
close = [float(x) for x in df['close']]
df['MACD'], df['MACDsignal'], df['MACDhist'] = ta.MACD(np.array(close), fastperiod=6, slowperiod=12, signalperiod=9)
print('---------------------MACD---------------------')
print(df.tail(1))
## 存储数据到文档
sava_data(df, code, 'MACD')
sava_data(df, code, 'MACDsignal')
sava_data(df, code, 'MACDhist')
print('---------------------MACD---------------------')
##获取jdk
def get_KDJ(df, code):
# 参数9,3,3
df['slowk'], df['slowd'] = ta.STOCH(np.array(df['high']), np.array(df['low']), np.array(df['close']),
fastk_period=9,
slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0)
print('---------------------KDJ---------------------')
print(df.tail(1))
sava_data(df, code, 'slowk')
sava_data(df, code, 'slowd')
print('---------------------KDJ---------------------')
def get_RSI(df, code):
close = [float(x) for x in df['close']]
# 参数14,5
df['slowreal'] = ta.RSI(np.array(close), timeperiod=14)
df['fastreal'] = ta.RSI(np.array(close), timeperiod=5)
print('---------------------RSI---------------------')
print(df.tail(1))
sava_data(df, code, 'slowreal')
sava_data(df, code, 'fastreal')
print('---------------------RSI---------------------')
file_name = '/Users/lyf/test/stock_list.csv'
p_pf = pd.read_csv('/Users/lyf/test/stock_list.csv')
####获取最新数据
def main():
p_pf['turnover'] = 0.0
p_pf['MACD'] = 0.0
p_pf['MACDsignal'] = 0.0
p_pf['MACDhist'] = 0.0
p_pf['slowk'] = 0.0
p_pf['slowd'] = 0.0
p_pf['fastreal'] = 0.0
p_pf['slowreal'] = 0.0
for code in p_pf.code:
df = get_k_data(code)
try:
get_MADC(df, code)
get_KDJ(df, code)
get_RSI(df, code)
time.sleep(0.5)
except:
pass
try:
h_df = get_history_data(code)
sava_data2(h_df, code, 'turnover')
except:
pass
p_pf.to_csv(file_name)
## 抓取相关信息绘制macd kdj 等 这是第一步
#main()
## 换手率
def judge_turnover(item):
return item.turnover > 0 and item.turnover > 3 and item.turnover < 10
### 判断MACD 当为正的时候 良好 不是必须
def judge_MACD(item):
return item.MACD > -3 and item.MACD != 0
### 判断jdk 当k线和d线小于三十 并且k先>d线作为买入依据
def judge_JDK(item):
if item.slowk == 0 or item.slowd == 0:
return False
return item.slowk < 30 and item.slowd < 30 and item.slowk > item.slowd
### 判断RSI
def judge_RSI(item):
if item.slowreal == 0 or item.fastreal == 0:
return False
if item.fastreal > 50 and item.fastreal < 80 and item.slowreal > 50 and item.slowreal < 80:
return True
if item.slowreal < 20 or item.fastreal < 20:
# if item.fastreal > item.slowreal:
return True
if item.fastreal < 30 and item.fastreal > item.slowreal:
return True
return False
### 抓取数据后执行选取潜力股
def judge_best():
for index in p_pf.index:
if judge_MACD(p_pf.loc[index]) and judge_JDK(p_pf.loc[index]) and judge_RSI(p_pf.loc[index]):
print('潜力股 code:%s name:%s' % (p_pf.loc[index].code, p_pf.loc[index, 'name']))
# if judge_JDK(p_pf.loc[index]):
# print('code:%s name:%s jdk:%s'%(p_pf.loc[index].code, p_pf.loc[index, 'name'],p_pf.loc[index].slowk))
judge_best()
