1. 程式人生 > >自己做量化交易軟體(15)通通量化AI框架的選股器設計1

自己做量化交易軟體(15)通通量化AI框架的選股器設計1

自己做量化交易軟體(15)通通量化AI框架的選股器設計 前面我們學會了單隻股票的分析,回測功能。下面我們開始設計選股器和量化分析的功能。 在設計選股器之前,我們先要學習一些python基本操作技巧。 一、股票程式碼處理技巧 1、數字型別轉換 我們獲取的資料格式都不相同,特別是股票程式碼,有些是數字1,有些是字元1,有些股票程式碼帶字尾,例如’60000.SH’,'000001.SZ,‘000001.XSHE’,'000300.XSHG’等等。無論什麼方式,我們都做一些簡單的轉化為通通標準股票程式碼格式。 深圳股票程式碼: ‘000001.SZ’ 上海股票程式碼: ‘600000.SH’ 指數程式碼:‘000300.ZS’ 各種資料轉化函式命令如下:

#數字int轉換為字串str
s_code=str(n_code) 

#字串str轉換為數字int
n_code=int(s_code)

程式碼演示:

n_code=10
#數字int轉換為字串str
s_code=str(n_code) 
print(s_code,type(s_code))
#字串str轉換為數字int
n_code=int(s_code)
print(n_code,type(n_code))

輸出結果: 10 <class ‘str’> 10 <class ‘int’>

2、字串處理 我們看到字串’10’ ,不夠長度6,需要在前面補’0’。 字串數值前面補0,用函式zfill(),看下面演示程式碼和結果:

s_code='10'
#字串數字前補夠0
s_code= s_code.zfill(6)

輸出結果: 000010 <class ‘str’>

3、補上股票字尾 看下面股票程式碼演示:

#通通股票程式碼轉換
def ttsn(s):
    s=s.strip()
    if (len(s)<6 and len(s)>0):
        s=s.zfill(6)+'.SZ'
    if len(s)==6:
        if s[0:1]=='0':
            s=s+'.SZ'
        else:
            s=s+'.SH'
    return s


#聚寬股票程式碼轉換
def jqsn(s):
    s=s.strip()
    if (len(s)<6 and len(s)>0):
        s=s.zfill(6)+'.XSHE'
    if len(s)==6:
        if s[0:1]=='0':
            s=s+'.XSHE'
        else:
            s=s+'.XSHG'
    return s

二、股票資料中的股票程式碼處理技巧 pandas是基於numpy構建的,為時間序列分析提供了很好的支援。pandas中有兩個主要的資料結構,一個是Series,另一個是DataFrame。 Series 類似於一維陣列與字典(map)資料結構的結合。它由一組資料和一組與資料相對應的資料標籤(索引index)組成。這組資料和索引標籤的基礎都是一個一維ndarray陣列。可將index索引理解為行索引。 Series的表現形式為:索引在左,資料在右。 DataFrame是一個類似表格的資料結構,索引包括列索引和行索引,包含有一組有序的列,每列可以是不同的值型別(數值、字串、布林值等)。DataFrame的每一行和每一列都是一個Series,這個Series的name屬性為當前的行索引名/列索引名。 股票資料一般用pandas包的 DataFrame 來存放。 上述的方法無法對 DataFrame整列資料處理。用迴圈操作又充分發揮了Python的速度慢的弱點,因此可以用一些Python的技巧來提高速度。 DataFrame序列中的股票格式轉換可以用類似下面的命令來瞬間完成。

#短字串補全快速運算
base.code=['0'*(6-len(x)) + x for x in base.code.astype(str)]

三、股票程式碼的運算 我們通過若干演算法,例如財務資料或者技術指標等策略, 篩選了一批資料。怎樣通過這些資料建立我們的目標備選股票池。並且完成股票池之間的邏輯運算。 例如 股票池的合併、黑名單的過濾等等運算。我們可以充分利用Python的特徵和優勢,來快速完成股票池運算。 我們可以充分利用這些不同資料特性,快速完成所需工作。 1、pandas和numpy資料相互轉換 下面給出DataFrame中的股票程式碼轉列表例子,重點要看說明和記住例子,演示程式碼如下:

import pandas as pd
import numpy as np
import HP_data as hp
#獲取業績報告資料
'''
report_data返回資料格式 如下:
code,程式碼
name,名稱
esp,每股收益
eps_yoy,每股收益同比(%)
bvps,每股淨資產
roe,淨資產收益率(%)
epcf,每股現金流量(元)
net_profits,淨利潤(萬元)
profits_yoy,淨利潤同比(%)
distrib,分配方案
report_date,釋出日期
'''

#獲取獲取2015年第4季度的業績報告資料
t2015=hp.get_report_data(2015,4) 

#選取eps_yoy,每股收益同比(%)的排名前20位股票資料。
top20=t2015.sort_values(by='eps_yoy',ascending=False).head(20)

#獲取股票程式碼的Series序列,帶原始資料索引
S_code=top20.code

#dataframe重建索引,從0開始順序
S_code2 = S_code.reset_index(drop=True)

#將股票程式碼Series序列轉為列表list資料
l_code=S_code.tolist()

#將列表list轉為array序列資料,與Series序列區別是無索引。
a_code=np.array( l_code)

#將array序列資料轉為 Series序列,增加了從0開始順序自然索引。
S_code3= pd.Series(a_code, name = 'code')

#部分資料內容輸出結果
print('\n----S_code-----獲取股票程式碼的Series序列,帶原始資料索引')
print(S_code)
print('\n----S_code2-----重建索引,從0開始順序')
print(S_code2)
print('\n----l_code-----將股票程式碼Series序列轉為列表list資料')
print(l_code)
print('\n----a_code-----將列表list轉為array序列資料,與Series序列區別是無索引。')
print(a_code)
print('\n----S_code3-----將array序列資料轉為 Series序列,增加了從0開始順序自然索引。')
print(S_code3)

程式執行結果如下圖: 在這裡插入圖片描述 2、列表(list)和集合(set)相互轉換 Python資料格式有列表(list)和集合(set)。 列表有重複資料,並且 有序。 集合無重複資料,並且無序。 我們可以利用集合(set)的無重複特性,將股票程式碼轉化為集合(set),能夠快速完成股票程式碼去掉重複,股票程式碼池的合併,剔除股票黑名單等運算。 (1) 列表運算

#假定我們通過策略1篩選出股票池列表bk1
bk1=['600000', '600001', '600002', '600003', '600004', '000001', '000010']

#我們通過策略2篩選出股票池列表bk2,我們可以看到前面3個數據重複。
bk2=['600000', '600001', '600002','600981',  '600080', '600191']

#給bk1查入資料資料,list.insert(i, 資料) 
bk1=bk1.insert(1, '300751')    #在指定位置插入元素

#給bk2增加資料
bk2=bk2.append('600390')

#刪除bk2最後一個數據
bk2=bk2.pop()    #將最後一位的元素刪除

#刪除bk1中間第3個數據。
bk1=bk1.pop(3)    #刪除指定位置的元素

(2) 集合運算 python的set和其他語言類似, 是一個無序不重複元素集, 基本功能包括關係測試和消除重複元素. 集合物件還支援union(聯合), intersection(交), difference(差)和sysmmetric difference(對稱差集)等數學運算。 sets 支援 x in set, len(set),和 for x in set。作為一個無序的集合,sets不記錄元素位置或者插入點。因此,sets不支援 indexing, slicing, 或其它類序列(sequence-like)的操作。 集合t,s支援一系列標準操作,包括並集、交集、差集和對稱差集,例如: a = t | s # t 和 s的並集 b = t & s # t 和 s的交集 c = t – s # 求差集(項在t中,但不在s中) d = t ^ s # 對稱差集(項在t或s中,但不會同時出現在二者中) 下面給出集合運算的演示。

#建立集合st1,st2
print('\n----st1----')
st1=set(['002027', '600061', '600080','600659'])
print(st1)

print('\n----st2----')
st2=set(['000001', '600061', '600088','000002'])
print(st2)

#集合中增加可以通過列表list增加,再轉換為集合set。
#也可以通過集合並集運算來增加元素。
print('\n----st1---- st1中增加600090')
st1=st1.union(set(['600090']))
print(st1)

print('\n----a = st1 | st2-----')
#集合運算
a = st1 | st2   # st1 和 st2的並集
print(a)

print('\n----b = st1 & st2 -----')
b = st1 & st2  # st1和 st2的交集
print(b)

print('\n----c = st1 - st2 -----')
c = st1 - st2   # 求差集(項在st1中,但不在st2中)
print(c)

print('\n----d = st1 ^ st2-----')
d = st1 ^ st2  # 對稱差集(項在st1或st2中,但不會同時出現在二者中)
print(d)

print('\n----st2 remove 600088-----')
#集合元素刪除
st2=st2.difference(set(['600088']))
print(st2)
print(type(st1),type(st2))

程式執行結果如下圖: 在這裡插入圖片描述 (3)列表和集合轉換 我們根據演算法需要,利用列表和集合的特性,來實現我們的要求

#假定我們通過策略1篩選出股票池列表bk1,但又股票重複
bk1=['600000', '600001', '600002', '600001', '600000', '000001', '000010','000002']
print('\n-----列表bk1----')
print(bk1)

print('\n-----集合A----')
#轉換為集合A來去掉重複
A=set(bk1)
print(A)

print('\n-----列表bk2----')
#將結果轉為列表bk2
bk2=list(A)
print(bk2)

print('\n-----列表bk2排序----')
#對bk2進行排序
bk3=bk2.sort()
print(bk2)

程式執行結果如下圖: 在這裡插入圖片描述

今天我給大家介紹了關於股票程式碼和股票板塊運算的基本知識。下次開始設計有關選股器畫面的設計。