刚发现 tushare.pro 上可以免费获取股票行情数据
一、步骤:
- 登录 tushare.pro, 注册账户,完善个人信息,得到120积分(可有免费获取股票行情数据的权限);
- 获取接口TOKEN,保存好,程序中会用到,
方法参考: https://tushare.pro/document/1?doc_id=39; - 开发代码,获取数据并写入数据库(这里使用的postgres数据库)。
二、核心代码功能:
1. 建表
DROP TABLE IF EXISTS pro.daily;
CREATE TABLE pro.daily(
ts_code varchar(255)
, trade_date varchar(255)
, open varchar(255)
, high varchar(255)
, low varchar(255)
, close varchar(255)
, pre_close varchar(255)
, change varchar(255)
, pct_chg varchar(255)
, vol varchar(255)
, amount varchar(255)
);
-- 注:数值字段使用 varchar 类型,没有用 float8,是因为取下的数据可能不非数值的,写时会报错;
-- 所以先取下来,以后再处理!
COMMENT ON table pro.daily IS '日线行情: 交易日每天15点~16点之间。本接口是未复权行情,停牌期间不提供数据';
COMMENT ON COLUMN pro.daily.ts_code IS '股票代码';
COMMENT ON COLUMN pro.daily.trade_date IS '交易日期';
COMMENT ON COLUMN pro.daily.open IS '开盘价';
COMMENT ON COLUMN pro.daily.high IS '最高价';
COMMENT ON COLUMN pro.daily.low IS '最低价';
COMMENT ON COLUMN pro.daily.close IS '收盘价';
COMMENT ON COLUMN pro.daily.pre_close IS '昨收价';
COMMENT ON COLUMN pro.daily.change IS '涨跌额';
COMMENT ON COLUMN pro.daily.pct_chg IS '涨跌幅 (未复权,如果是复权请用 通用行情接口 )';
COMMENT ON COLUMN pro.daily.vol IS '成交量 (手)';
COMMENT ON COLUMN pro.daily.amount IS '成交额 (千元)';
ALTER TABLE pro.daily ADD CONSTRAINT pk_daily UNIQUE (ts_code, trade_date);
CREATE INDEX idx_daily_trade_date ON pro.daily (trade_date);
2. 取数
python 安装 tushare 包:
pip install tushare -i https://pypi.tuna.tsinghua.edu.cn/simple
python 代码
# tushare 初始化
import tushare as ts, time, datetime
pro = ts.pro_api('your token')
#print(ts.__version__)
# postgres 初始化
import psycopg2
from io import StringIO
conn = psycopg2.connect(database="tushare", user="postgres", password="postgres"
, host="127.0.0.1", port="54321")
cur = conn.cursor()
# 取交易日历
tradeCal = pro.trade_cal(exchange=''
, start_date='19900101'
, end_date=datetime.datetime.now().strftime('%Y%m%d') # 取系统当前日期
, fields='cal_date'
, is_open='1'
)
#print(tradeCal)
# 一次写一天的数据(测试了多种方法,这是最快的写库方法)
def copy4strIo2db(df,tableName):
output = StringIO()
df.to_csv(output, sep='\t', index=False, header=False)
cur.copy_from(StringIO(output.getvalue()), tableName)
conn.commit()
#取日线行情
for tradeDate in tradeCal.cal_date:
#print(tradeDate)
daily = pro.daily(trade_date=tradeDate)
copy4strIo2db(daily,'pro.daily')
time.sleep(0.12) # 60秒访问500次,每次0.12秒
# 关闭数据库
cur.close()
conn.close()
祝成功!