用Python抓取大智慧除权数据

继续做的数据分析,由于新浪获取的是未复权数据,所以在分析的时候出了些小问题,结果变得扑所迷离。于是又用了几天Tushare的获取复权数据功能,本来是写了个循环,每天自动获取,可是几乎每次下载都卡死了,这真是坑爹的网络。翻了翻Tushare的这段代码,Tushare的这个数据倒也是新浪的,但是是从网页上扒下来的,过程好像获取了两个地址的数据,貌似一个复权因子一个后复权数据,没细看了。反正我也不认为这是合理的获取方式,理想的当然是JSON或者XML之类的格式最好了。百度了一圈,没有发现哪里有免费的前复权数据,更找不到除权数据,心想找到除权数据也好啊,自己来复权。这过程中,得到了几个新浪地址,好像和复权有关,但是也没琢磨出怎么用。在这里先把地址贴下来,有时间再研究。

http://vip.stock.finance.sina.com.cn/api/json.php/BasicStockSrv.getStockFuQuanData?symbol=sz000001&type=hfq,和惯例一样,symbol指得是股票代码,而type按拼音来说应该是后复权,但我输入qfq之后得到并非前复权。

http://biz.finance.sina.com.cn/stock/flash_hq/kline_data.php?symbol=sz000001&begin_date=20100101&end_date=20161206,同上,只是有开始和结束时间。

新浪没办法了,看到很多网友都是从大智慧获取,毕竟资料还多,于是下载安装了个大智慧365。装好后在安装目录下有个Download文件夹,而除权数据就在PWR文件夹里,FIN文件夹里放的是财务数据,而ABK里则是大智慧的板块数据。

这里之所以写个日志是因为,365里的数据结构并非网络上写的四字节方式,四字节转赠股,四字节红利,四字节的配股,四字节配股价。我所看到的是120字节分段的形式,任一只股票先120字节的4-12字节为代码,接来下的120字节里前四个字节为除权日期,接着4-20字节为空,剩下的就是除权数据了,而这个数据并非分段的数值形式,而是一句话,比如10股送5股之类的,就是说得到这句话后还要进行分割。一只票除权了多少次就有多少个这样的120字节了,整理之后把代码贴上:

path = '/home/jeff/Share/DZH/Download/PWR/' 
name = ['full_sh.PWR','full_sz.PWR']
data = []
for i in name:
    exFile = open(path+i,'rb')
    exFile.seek(8)
    while True:
        exContent = exFile.read(120)
        if not exContent:
            break
        if exContent[:4] == b'\xff\xff\xff\xff':
            code = exContent[4:12].decode('gbk')
        elif len(exContent) > 0:
            date= struct.unpack("I", exContent[:4])[0]
            date= time.localtime(date)
            exlist = exContent[20:].decode('gbk').split('\x00')[0][2:].split()
            present = 0
            bonus = 0
            rationed = 0
            price = 0
            for i in exlist:
                if '送' in i:
                    present += float(re.findall(r"\d+\.?\d*",i)[0])
                if '增' in i:
                    present += float(re.findall(r"\d+\.?\d*",i)[0])
                if '派' in i:
                    bonus += float(re.findall(r"\d+\.?\d*",i)[0])
                if '价' in i:
                    price += float(re.findall(r"\d+\.?\d*",i)[0])
                if '配' in i:
                    rationed += float(re.findall(r"\d+\.?\d*",i)[0]) - price
            data.append({'code':code[2:],'date':date,'present':present,'bonus':bonus,'price':price,'rationed':rationed})
return data

用Ubuntu来做个软路由

促成这篇文章的形成其实有很多因素,最早的时候用的路由是中兴的H618B,那240Mhz的处理器在脱机下载以及当NAS时性能感人,对了,那用的是Tomato系统,还只能双拨,就更感人了。后来换成了图拉丁,折腾了很久,又是敲腿又是自己动手焊了个DC-ATX电源,这时用的是OpenWRT系统的X86版本,性能方面好多了,好歹是图羊1G的频率,用了好长一段时间。但是因为是老板子了,没有PCI-E也没有装显卡,为了节省功耗嘛,可结果是出了点小问题又要死命折腾,很是啰嗦。实在累了,接着换了Modt平台,用了是建基i915的板子,处理器1.6G迅驰,又用了好长时间,可以说,这套东西基本上可以一直用下去了,系统非常稳定的,各种服务器运行非常正常。可是可是,某一天测功耗28瓦,天啊,还没加3.5硬盘呢,因为很久不看电影了,NAS功能一直没用,孰不可忍,加硬盘了还得了?换,于是某宝瞎逛,入手了一片N3150,真是牛逼,加上了所有的硬件都只有18瓦,包括3.5硬盘。可是如果只装个OpenWRT是不是大材小用啊,我都给它装了16G内存了,还能硬解码4K呢。于是,想起反正都是Linux的家族,应该Ubuntu也可以实现路由功能吧。

折腾这就又开始……备份硬盘资料,全盘安装Ubuntu,Desktop版本,现在的Linux系统安装应该说也是傻瓜的很,此过程忽略……

我这里是情况是板载千兆有线网卡,插了张PCI-E的AR9380无线网卡,还有一张RT2870USB无线网卡,RT2870是装了定向天线点对点接收单位的网络,有线网卡和9380做局域网使用。

第一步当然是用2870连上网络了,因为接下来会安装一些软件。接着用ifconfig -a查看所有的网卡名称,这等一下得用上。

sudo apt-get install isc-dhcp-serve
sudo apt-get install hostapd
sudo apt-get install bridge-utils
sudo apt-get install dnsmasq

配置网络接口:sudo gedit /etc/network/interfaces

auto lo
iface lo inet loopback
auto lan0   #有线网卡名称
iface lan0 inet manual
auto wlan0  #无线网卡名称
iface wlan0 inet manual
auto br0 #自定义的接口
iface br0 inet static
address 192.168.1.1  本机局域网地址 别的机器网关就是它了
netmask 255.255.255.0
broadcast 192.168.1.255
bridge-ports lan0 wlan0 #把两真实网卡桥连
bridge_fd 9
bridge_hello 2
bridge_maxage 12
bridge_stp off

配置DHCP服务器:sudo gedit /etc/dhcp/dhcpd.conf

subnet 192.168.1.0 netmask 255.255.255.0 {
    allow booting;
    allow bootp;
    interface br0;  网络接口填自定义的那个
    option domain-name-servers 58.20.127.238,192.168.1.1;  #分给客户的DNS地址
    default-lease-time 604800; #7 days
    max-lease-time 2592000; #30 days
    range 192.168.147.100 192.168.1.200;
    option subnet-mask 255.255.255.0;
    option broadcast-address 192.168.1.255;
    option routers 192.168.1.1;
}

sudo gedit /etc/default/isc-dhcp-server

INTERFACES="br0"

配置hostapd无线控制:sudo gedit /etc/hostapd/hostapd.conf

interface=wlan0  #无线网卡名称
bridge=br0   # 自定义的
driver=nl80211
ssid=Ubuntu  # 本热点的名称
# country_code=US
hw_mode=g  # 模式
channel=11  # 频道
dtim_period=1
rts_threshold=2347
fragm_threshold=2346
macaddr_acl=0
# accept_mac_file=/etc/hostapd/hostapd.accept #MAC地址限制,需要建立这个文件
# deny_mac_flie=/etc/hostapd/hostapd.deny
auth_algs=3
ieee80211n=1
ht_capab=[HT40-][SHORT-GI-40][DSSS_CCK-40]
wpa=2
wpa_passphrase=88888888  # 热点密码
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP CCMP
rsn_pairwise=CCMP

sudo gedit /etc/default/hostapd

RUN_DAEMON="yes"
DAEMON_CONF="/etc/hostapd/hostapd.conf"

这样设置之后,这两网卡会在network-manager里显示未托管了,但是还能控制剩下那个无线网卡接入断开某个网络。配置dnsmasq需要network-manager禁用dnsmasq-base,默认开启了。sudo geidt /etc/NetworkManager/NetworkManager.conf,注释掉里面的dns=dnsmasq

打开dnsmasq配置文件:sudo gedit /etc/dnsmasq.conf

listen-address=192.168.1.123,127.0.0.1

127.0.0.1是给自己用的,192.168.1.1是给局域网别的机器用
还有dnsmasq本身是带dhcp服务的,这里关掉它

no-dhcp-interface=br0
no-dhcp-interface=lan0
no-dhcp-interface=wlan0

在/etc目录下建立resolv.dnsmasq.conf 文件,并把resolv-file变改文件指向

resolv-file=/etc/resolv.dnsmasq.conf

表示 dnsmasq 会从这个指定的文件中寻找上级 dns 服务器列表,而不是从本机的(resolv.conf)中读取dns服务器列表,如果机器的地址是通过dhcp取得的话,该文件容易受到影响从而影响dnsmasq。

最后,在rc.local文件里加上:

/etc/init.d/isc-dhcp-server start #启动DHCP服务
iptables -t nat -A POSTROUTING -o wlan1 -j MASQUERADE #wlan1网络接入网卡

至此,一台超性能的路由+服务器一体机全部搞定,可惜了,家里装修的时候入网口没在客厅电视柜,否则装个KODI,又是一台HTPC了,而现在只能用来码代码了。