《Python股票量化投资课程》第一部分 构建自己的股票数据库_案例_获取股票的实时价格

[复制链接]
查看6752 | 回复0 | 2023-10-29 11:02:05 | 显示全部楼层 |阅读模式
"""
  W6 D& ^2 r& m7 K3 J' A1 X《Python股票量化投资课程》第一部分 构建自己的股票数据库_案例_获取股票的实时价格$ x& @8 W7 @' a) Q' ]
; x- P6 Y3 r( k9 D
本节课讲解如何获取股票的实时价格/ o" |' ]6 \6 ?7 r# C/ R8 _
"""* P$ W6 a1 [+ y& w  u2 L
import time
! P+ S; v* @& V1 b/ b" t/ Rfrom urllib.request import urlopen  # python自带爬虫库
( J/ o, B) }7 J) y/ s3 P& M# X- z0 Mimport pandas as pd
$ W% R3 ?  o- _8 @# [import requests5 W3 k) P( ]: ~
  G* O: @$ E- g9 s
pd.set_option('expand_frame_repr', False)  # 当列太多时不换行8 f! @$ k# y7 Z( i/ n! T) s
pd.set_option('display.max_rows', 5000)  # 最多显示数据的行数
) A$ K2 D* N; O- N0 O) f! z/ Q6 F) w$ o6 |1 y, k4 Z3 P- r$ `

3 G: G6 Q) z9 d6 A0 q, {# =====神奇的网址
" p. ^0 e3 y+ W; b7 f( @# 返回一个股票的数据:https://hq.sinajs.cn/list=sz000001,修改股票代码/ d0 B1 j, U. y6 r! s4 s
# 返回一串股票的数据:https://hq.sinajs.cn/list=sh600000,sz000002,sz300001& H) r9 L5 @, C7 C" V3 d
# 正常网址:https://finance.sina.com.cn/realstock/company/sh600000/nc.shtml,6 o7 l) n4 B4 }8 p, u) g
* [$ ~5 \) a: r5 Z8 F. ]9 w( ^+ d8 T
def requestForNew(url, max_try_num=10, sleep_time=5):
* I# a# p3 S4 v1 I# l) D7 U1 ?$ Q    headers = {
, `; h6 B; i" i& a        'Referer': 'http://finance.sina.com.cn',) I5 [1 }# l1 H
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.62'
' N# l" h9 |6 Z7 i/ _    }* b/ _4 i6 T1 A* U* f  b
    for i in range(max_try_num):9 d( b6 m4 ?# O6 f
        response = requests.get(url, headers=headers, timeout=30)
& f0 B6 t5 f' o( p7 S4 p) N        if response.status_code == 200:
; n, b$ e% o% z6 H/ ~; I/ T) I            return response
6 Y# }+ V  ?% T7 Y* Q. o        else:# U$ K8 b" G) V4 j
            print("链接失败", response)
; L! s5 x$ B+ Y            time.sleep(sleep_time)
" j4 ^' T9 ^6 p7 U
4 v8 d, ]. h$ a- N( i* \5 L9 J) Z* z
& I7 q2 \. E: p6 q: S& B# =====构建网址! H% e/ `2 j: F- v( o* o! T9 A
# 正常股票:sh600000 sz000002,退市股票:sh600002 sz000003、停牌股票:sz300124,除权股票:sh600276,上市新股:sz0029520 i5 j+ a5 b7 ^2 C4 [
stock_code_list = ['sh600000', 'sz000002', 'sh600002', 'sz000003', 'sz300124', 'sh600276', 'sz002952']2 t+ G# D$ S" m8 r8 Z0 H/ {
url = "https://hq.sinajs.cn/list=" + ",".join(stock_code_list)
/ ^6 |& E# Q% p5 Y
$ ]. @, g' Z0 s9 V% [8 _8 ?# =====抓取数据% M% J+ k7 l! k/ J6 u7 t8 a
content = requestForNew(url).text  # 使用python自带的库,从网络上获取信息1 T+ h5 [. X$ e& p

7 y, e( s  h5 f- r. m$ ]# =====将数据转换成DataFrame
7 n+ z1 b3 U  Y. P# Y8 icontent = content.strip()  # 去掉文本前后的空格、回车等- ]& h0 a1 k& J6 M; X4 a
data_line = content.split('\n')  # 每行是一个股票的数据0 _9 I/ o4 P# P
data_line = [i.replace('var hq_str_', '').split(',') for i in data_line]
: K8 v" P" v  R! y6 odf = pd.DataFrame(data_line, dtype='float')  #
% j" P& @  n3 z/ E+ j  r+ ~5 B3 z" I, v3 ~" h8 T5 n5 A3 O0 O% e
# =====对DataFrame进行整理7 V' T. x/ h. o( g3 l
df[0] = df[0].str.split('="')
% f5 p( i. i+ [, H: ldf['stock_code'] = df[0].str[0].str.strip()' ?* Z4 c! L2 c3 H1 s3 R$ i* \4 V
df['stock_name'] = df[0].str[-1].str.strip()% Y9 L2 _* J4 t3 l/ G1 L" K
df['candle_end_time'] = df[30] + ' ' + df[31]  # 股票市场的K线,是普遍以当跟K线结束时间来命名的6 x/ ~& [0 O. W- J- O
df['candle_end_time'] = pd.to_datetime(df['candle_end_time'])8 V# f' C: V& ~, V

; p4 Z! C6 y% ?7 }+ _$ b0 {( B: rrename_dict = {1: 'open', 2: 'pre_close', 3: 'close', 4: 'high', 5: 'low', 6: 'buy1', 7: 'sell1',+ h1 Q1 C, \& o! V5 J: X8 @
               8: 'amount', 9: 'volume', 32: 'status'}  # 自己去对比数据,会有新的返现" l9 F  k, J5 L" p" k
# 其中amount单位是股,volume单位是元6 u' I" e0 n# H. \
df.rename(columns=rename_dict, inplace=True): b" K# W# w& x! [+ Y' `% k
df['status'] = df['status'].str.strip('";')
! a. _  C7 a$ p& h% N  k6 d( [df = df[['stock_code', 'stock_name', 'candle_end_time', 'open', 'high', 'low', 'close', 'pre_close', 'amount', 'volume',
' U. ?+ C& R  B; i4 K, P3 ^         'buy1', 'sell1', 'status']]
' _2 M1 A4 N. E; S, L' M# [  W3 Y* P; N) l1 b) X' F
print(df)
! z* W! W7 t" ?. [8 V) N# =====考察退市、停牌股票
7 B: V& C2 N& J- O* r; C' a# 根据特征去删除股票数据' P8 u, G3 B4 ?
# 通过amount来考察?
; }) X" v' V/ C. ~$ Vdf = df[df['open'] - 0 > 0.00001]
1 b8 z9 j0 @, o! p% k7 ^! l, T5 a7 J. S
# 如何区分退市和停牌?可能可以通过pre_close,还有status) Z$ _" c# q5 h" S/ L, i  k
$ x4 n' ^/ ?7 n! ~6 w8 b
# =====考察新上市的股票
8 o0 A' j9 Y( I' v  n1 e# 考察sz0029528 `4 r" B5 v. A! A5 {- x: |
# 对于新上市的股票,pre_close指的是发行价
1 u4 d' d3 o5 E+ K  Q. o" v- i9 c' V: G* _( T: @) r3 O8 h0 B
# =====考察除权股票
# H( {) b: v% I: d# 考察sh600276
) [# Q; }; b* K4 s0 {, i3 A# 对于今天除权的股票,pre_close不是昨天真正的收盘价,而是交易所计算出来并且公布的昨天的收盘价。
! A  J9 S* O3 _  G4 P# 有了这个数据,才能算出这个股票真正的涨跌幅
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

16

金钱

0

收听

0

听众
性别
保密

新手上路

金钱
16 元