0、投资研究
```py
#encoding:gbk
import pandas as pd
import talib
import numpy as np
import matplotlib.pyplot as plt
from pylab import mpl
data = get_market_data(['open','close','volume','high','low','amount'],stock_code=['300056.SZ'],start_time='2006-1-1',period='1d',dividend_type='none',count=500)
```
```py
data_close = data['close']
data['ma5']=talib.SMA(data_close,timeperiod=5)
data['ma10']=talib.SMA(data_close,timeperiod=10)
#macd
macd,macdsignal,macdhist=talib.MACD(data_close,fastperiod=12,slowperiod=26)
# plt.plot(macd)
# plt.plot(macdsignal)
# plt.plot(macdhist)
# plt.show()
#布林带
uband,mband,lband=talib.BBANDS(data_close, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0)
# plt.plot(uband)
# plt.plot(mband)
# plt.plot(lband)
# plt.show()
# sub1=plt.subplot(211)
# plt.title('macd')
# plt.ylabel('MACD')
# plt.ylabel('BBANDS')
# sub1.plot(macdsignal)
# sub1.plot(macdhist)
# sub2=plt.subplot(212)
# sub2.plot(uband)
# sub2.plot(mband)
# sub2.plot(lband)
# plt.show()
def calZq1(data_close):
ma12=talib.SMA(data_close,timeperiod=12)
ma50=talib.SMA(data_close,timeperiod=50)
zq=np.array(ma12)-np.array(ma50)
zqMa = talib.SMA(zq,timeperiod=20)
zqStd = talib.STDDEV(zq,20)
temp = zqStd*1.31
up=zqMa+temp
low = zqMa-temp
mid=up+low
return up,low,mid/2,zq
def calZq3(data_close):
ma12=talib.SMA(data_close,timeperiod=36)
ma50=talib.SMA(data_close,timeperiod=150)
val=(ma12*3)-(ma50*3)
std3=talib.STDDEV(val,60)
temp = std3*1.31
up=val+temp
low=val-temp
mid = up+low
return up,low,mid/2,val
up,low,mid,val = calZq1(data_close)
up3,low3,mid3,val3=calZq3(data_close)
# print(up3)
sub1=plt.subplot(211)
plt.title('mid and log')
plt.ylabel('short')
sub1.plot(up)
sub1.plot(mid)
sub1.plot(low)
sub1.plot(val)
sub2=plt.subplot(212)
plt.ylabel('long')
sub2.plot(up3)
sub2.plot(mid3)
sub2.plot(low3)
sub2.plot(val3)
plt.show()
```
0、NumPy笔记
```py
#encoding:gbk
import pandas as pd
import talib
import numpy as np
import matplotlib.pyplot as plt
from pylab import mpl
data = get_market_data(['open','close','volume','high','low','amount'],stock_code=['300056.SZ'],start_time='2006-1-1',period='1d',dividend_type='none',count=500)
```
```py
data_close = data['close']
data['ma5']=talib.SMA(data_close,timeperiod=5)
data['ma10']=talib.SMA(data_close,timeperiod=10)
#macd
macd,macdsignal,macdhist=talib.MACD(data_close,fastperiod=12,slowperiod=26)
# plt.plot(macd)
# plt.plot(macdsignal)
# plt.plot(macdhist)
# plt.show()
#布林带
uband,mband,lband=talib.BBANDS(data_close, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0)
# plt.plot(uband)
# plt.plot(mband)
# plt.plot(lband)
# plt.show()
# sub1=plt.subplot(211)
# plt.title('macd')
# plt.ylabel('MACD')
# plt.ylabel('BBANDS')
# sub1.plot(macdsignal)
# sub1.plot(macdhist)
# sub2=plt.subplot(212)
# sub2.plot(uband)
# sub2.plot(mband)
# sub2.plot(lband)
# plt.show()
def calZq1(data_close):
ma12=talib.SMA(data_close,timeperiod=12)
ma50=talib.SMA(data_close,timeperiod=50)
zq=np.array(ma12)-np.array(ma50)
zqMa = talib.SMA(zq,timeperiod=20)
zqStd = talib.STDDEV(zq,20)
temp = zqStd*1.31
up=zqMa+temp
low = zqMa-temp
mid=up+low
return up,low,mid/2,zq
def calZq3(data_close):
ma12=talib.SMA(data_close,timeperiod=36)
ma50=talib.SMA(data_close,timeperiod=150)
val=(ma12*3)-(ma50*3)
std3=talib.STDDEV(val,60)
temp = std3*1.31
up=val+temp
low=val-temp
mid = up+low
return up,low,mid/2,val
up,low,mid,val = calZq1(data_close)
up3,low3,mid3,val3=calZq3(data_close)
# print(up3)
sub1=plt.subplot(211)
plt.title('mid and log')
plt.ylabel('short')
sub1.plot(up)
sub1.plot(mid)
sub1.plot(low)
sub1.plot(val)
sub2=plt.subplot(212)
plt.ylabel('long')
sub2.plot(up3)
sub2.plot(mid3)
sub2.plot(low3)
sub2.plot(val3)
plt.show()
```
## 自选板块调用
```py
# 获取自选板块个股
mystock=get_stock_list_in_sector('LJDAI')
mystock
```
## 函数功能练习
```py
#np功能练习
ls = list(range(100))
print(ls)
npls = np.array(range(100))
#查看列表内存占用
import sys
print('ls mem= ',sys.getsizeof(ls))
print('np array mem= ',sys.getsizeof(npls))
#同样的数据,列表占用内存是NP的一倍多
#random round用法
import random
import timeit
prize =[round(random.uniform(10.0,20.0),2) for i in range(20)]
print('价格:',prize)
pcount = [random.randint(1,10) for i in range(20)]
print('数量:',pcount)
prize_np = np.array(prize)
pcount_np = np.array(pcount)
toal=np.dot(prize_np,pcount_np)
print(round(toal,2))
#timeit 查看代码执行时间
# t =%timeit np.dot(prize_np,pcount_np)
#查看数组类型
prize_np.dtype
#多维数组
z= np.array([[1,2,3],[5,6,7]])
print('元素个数:',z.size)
print('维度:',z.shape)
print('维度:',z.ndim)
print('数组转置',z.T)
#数据类型的转换
pcount_np_f = pcount_np.astype('float32')
print('整数数组转化为浮点数数据类型:')
pcount_np_f
#np.arange用法
print(np.arange(10))
print(np.arange(4,10))
print(np.arange(4,10,2))
print(np.arange(4,10,0.2))
#np.linspace()用法 上面是步长,这里是分成多少等分 线性空间
print(np.linspace(4,10,50))
#创建全0数组
print(np.zeros(10,dtype='int'))
print(np.ones(10,dtype='int'))
print(np.zeros((3,5),dtype='float'))
print(np.empty((3,4)))
rshape= np.arange(15)
print('15个元素的一级数组:',rshape)
print('一维数组转换成二维数组:',rshape.reshape((3,5)))
#单位矩阵eye
print('eye:',np.eye(5))
```
## 数组运算
```py
#np运算
#数组和标量之间的运算
#同样大小数组之间的运算
#数组的索引 a[3] 二维数组访问:2行3列:a2[2][3] a2[2,3]
#数组的切片 a[5:8] a[:3] a2[1:3,:4] a2[:,:1] a2[:,1]
#与列表不同,数组切片时并不会自动复制,在切片数组上的修改会影响原数组 解决方法:copy()
a=np.arange(10)
b=np.linspace(0,18,10)
print(b)
print(a)
print(a**2)
print(a+1)
print('a*b=',a*b)
#选出数组中大于5的数
aa = [random.randint(0,20) for i in range(20)]
print(aa)
bb = np.array(aa)
#布尔型索引
bb[bb>5]
print('选出BB中大于5的数:',bb[bb>5])
print('bb>5 ',bb>5)
#选出数组中》5,且为偶数的列表
print('出数组中>5,且为偶数的列表:',bb[(bb>5) & (bb%2==0)])
#数组的花式索引
print('bb=',bb)
print('选出BB的1,3,4,6位置的数据:',bb[[1,3,5,6]])
c2= np.arange(15).reshape((3,5))
print('c2=',c2)
print('切片:',c2[:,1:4])
print('花式索引:取出前两行,1列和3列的数据:')
print(c2[:2,[1,3]])
```
## 数组运算
```py
#数组运算
#通用函数:round()
#一元函数: abs,sqrt,ext,log,ceil:向上取整,floor:向下取整,rint,trunc,modf:,isnan,isinf,cos,sin,tan
#二元函数:add,substract,multiply,divide,power,mod,maximum,minimum
import math
d2=np.arange(2,5,0.2)
print('d2=',d2)
print('round函数,四舍五入',d2.round())
print('rint函数,四舍五入',np.rint(d2))
print('no.round函数,四舍五入',np.round(d2))
print('ceil:',math.ceil(3.5))
print('floor:',math.floor(3.5))
print('trunc--向0取整',math.trunc(3.1))
print('trunc--向0取整',math.trunc(-3.1))
ia,ib = np.modf(d2)
print('modf 分离小数跟整数部分成两个数组',np.round(ia,2),ib)
#数据除0的问题
za= np.array([1,2,3,4,5])
zb= np.array([1,2,3,4,0])
zc= np.array([1,2,3,4,0])
#任意数除 0
zinf = za/zb
znan = zb/zc
print('inf演示:',zinf)
#出现 0/0
print('nan演示:',znan)
print('去除inf错误数据:',zinf[~np.isinf(zinf)])
print('去除nan错误数据:',zinf[~np.isnan(znan)])
#二元函数用法示例:
ma=np.array([1,2,3,4,5])
mb=np.array([5,4,3,2,1])
print('maximum示例:',np.maximum(ma,mb))
print('minimum示例:',np.minimum(ma,mb))
print('求和-sum:',ma.sum())
print('累加和-cumsum:',ma.cumsum())
print('平均数-mean:',ma.mean())
print('标准差-std:',ma.std())
print('求方差-var:',ma.var())
print('最小值-min:',ma.min())
print('最大值-max:',ma.max())
print('最小值索引-argmin:',ma.argmin())
print('最大值索引-argmax:',ma.argmax())
#随机数生成工具
print('rand-给定形状产生随机数:',np.random.rand())
print('rand-给定形状产生随机一维数组:',np.random.rand(10))
print('rand-给定形状产生随机二维数组:',np.random.rand(2,3))
print('randint-给定形状产生随机整数:',np.random.randint(1,10,5))
print('randint-给定形状产生随机整数:',np.random.randint(1,10,(3,5)))
print('choice-给定形状产生随机选择:',np.random.choice(ma))
print('choice-给定形状产生随机选择:',np.random.choice(ma,3))
print('choice-给定形状产生随机选择:',np.random.choice(ma,(3,3)))
print('uniform-给定形状产生随机数:',np.random.uniform(1.0,10.0))
print('uniform-给定形状产生随机一维数组:',np.random.uniform(1.0,10.0,3))
print('uniform-给定形状产生随机二维数级:',np.random.uniform(1.0,10.0,(3,5)))
print('shuffle-与random.shuffle相同-洗牌打乱:',np.random.shuffle(ma))
```
0、Pandas笔记
## Series 一维序列
```py
#Series 序列 一维
s1=pd.Series([11,12,13,14,15])
s2=pd.Series([11,12,13,14,15],index=list('abcde'))
print('没有指定索引s1:',s1[0],s1.index,s1.values)
# print(s1)
print('指定索引 s2:',s2['a'],s2[0],s2.index,s2.values)
# print(s2)
s3=pd.Series(np.arange(10))
print('Series运算:')
# print(s3,s3+2,s3+s3)
#索引 同样支持花式索引,条件索引
# print(s3[[1,3,4]],s3[s3>3])
#切片
bs3= s3[0:2]
# print(bs3)
#Series 支持字典特性
sd=pd.Series({'a':1,'b':5,'c':10})
# print(sd)
# print('a' in sd,sd.get('b'))
#切片时注意,标签切片时顾头也顾尾,下标切片时,顾头不顾尾
# print(sd['a':'b'])
# print(sd[0:1])
#索引是整数时,尽量不要用si[-1]这类的方法来取,最后一个元素,而是要用si.iloc[-1]来取
si = pd.Series(np.arange(10))
#loc参数为标签, iloc参数为索引,注意两者的区别
# print(si.iloc[-1],si.loc[9])
#按照索引对齐来计算
pa = pd.Series([1,3,4,6],index=list('abcd'))
pb = pd.Series([1,2,3,4,5],index=list('bdace'))
print(pa+pb)
#数据缺失可自动补0,比如说员工工资两月一发,中间有离职的处理 add,sub,div,mul 加减乘除
print(pa.add(pb,fill_value=0))
# print(pa.values+pb.values)
#删除缺失数据
# ==================================
c=pa+pb
print('删除缺失数据:',c.dropna())
print('删除缺失数据:',c[~c.isnull()])
print('删除缺失数据:',c[c.notnull()])
print('缺失数据填1',c.fillna(c.mean()))
```
## DataFrame
```py
import pandas as pd
import numpy as np
import sys
import time
import math
import matplotlib.pyplot as plt
#DataFrame是一个表格型的数据结构,含有一组有序的列。可以被看做是由Series组成的字典,并且共用一个索引
df1=pd.DataFrame({'one':[1,2,3,4],'two':[4,3,2,1]})
df2=pd.DataFrame({'one':[1,2,3,4],'two':[4,3,2,1]},index=list('abcd'))
# print(df1)
# print(df2)
df3=pd.DataFrame({'one':pd.Series([1,2,3],index=list('abc')),'two':pd.Series([4,3,2,1],index=['b','a','d','c'])})
print(df3)
df=get_market_data(fields=['open','close','high','low','volume','amount'],stock_code=['300056.SZ'],period='1d',dividend_type='front',count=500)
df.to_csv('300056.csv')
# df.index
# df.columns
# df.values
# df.describe()
# df.index.name
# df.columns[0]
df.index.name='date'
# df.index.name
#改列名无效
df.rename(columns={'low':'new_close'})
df
#索引
df['close'].iloc[0]
# df[['close','volume']]
#切片
# df[:10]
#loc 切片指向标签
df.loc[:'20181025',['close','open']]
#iloc 切片指向下标
df.iloc[0:10,1:5]
#布尔值索引
df[df['close']>10]
# df[df>10]
# df[df>20].fillna(0)
type(df.index[0])
df[df.index.isin(['20181025','20181026'])]
#axis=0:行 1:列 how=all:选定的行或列全为nan才删除, any:选定的行或列有一个nan就删除
df.dropna(how='all',axis=1)
```
## DataFrame运算
```py
#DataFrame运算
df.mean()
df.sum()
#按行或列索引排序 ascending:True 升序 False:降序 axis:0-按行排序,1-按列排序
# df.sort_index(ascending=False,axis=1)
#按值排序
# df.sort_values('close')
# df.sort_values(['close','open'])
# df.sort_values('close',ascending=False)
#函数运算
# #apply:将自定义函数应用在各行或者各列上,FUNC可返加标量或者Series
# df.apply(lambda x:x.sum())
#applymap:将函数用在DataFrame各个元素上
# df.applymap(lambda x:x+10)
#map 将函数用在Series各个元素上
import datetime
import dateutil
dateutil.parser.parse('20201030')
#成组处理日期:pandas
dft =pd.to_datetime(df.index)
# type(dft[0])
# print(dft)
#创建时间序列
pd.date_range('20171010','20201010')
#feq 默认是天D,H(out),W(eek),B(usiness)=工作日,S(emi-)M(onth)=半月,(min)T(es)=分钟,S(econd)=秒,A(year)=年
pd.date_range('20171010','20201010')
pd.date_range('20171010','20201010',freq='W-MON')
#periods:
pd.date_range('20171010',periods=20,freq='W-MON')
#将字符串索引转换为时间戳索引
df.index=pd.to_datetime(df.index)
df.index
#均线算法
df['ma5']=df['close'].rolling(5).mean()
df['ma10']=df['close'].rolling(10).mean()
#均线金叉、死叉、算法
death_cross=df[(df['ma10']>df['ma5'])&(df['ma10']<df['ma5']).shift(1)].index
golden_cross=df[(df['ma10']<=df['ma5'])&(df['ma10']>df['ma5']).shift(1)].index
print('死叉:',death_cross)
print('金叉',golden_cross)
death=df[df.index.isin(death_cross)]
plt.plot(df['close'],'r-')
plt.plot(death['high'],'b*')
plt.show()
#groupby
# df.groupby('A')
# df.groupby('A').get_group('bar')
#df.groupby(['A','B'])
#pd.merge(left,right,on='key',how='inner')
```
0、matplotlib
```py
import pandas as pd
import numpy as np
import sys
import time
import math
import matplotlib.pyplot as plt
#plot函数
# 线型linestyle(-,-.,--,...)
# 点型marker(v,^,s,*,H,+,x,D,o,)
# 颜色color(b,g,r,y,k,w,....)
# 标题: set_title
# X轴:xlabel
# Y轴:ylabel
df=get_market_data(fields=['open','close','high','low','volume','amount'],stock_code=['300056.SZ'],period='1d',dividend_type='front',count=100)
df.to_csv('300056.csv')
#pandas 集成了PLOT
df['close'].plot()
# plt.plot(df['close'],'rv-')
# plt.show()
#多图绘制
fig = plt.figure()
p1= fig.add_subplot(2,2,1)
p2= fig.add_subplot(2,2,2)
p3= fig.add_subplot(2,2,3)
p4= fig.add_subplot(2,2,4)
p1.plot(df['close'])
p2.plot(df['open'])
p3.plot(df['high'])
p4.plot(df['volume'])
plt.show()
```
0、talib笔记
```py
{
#周期指标
'CycleIndicators': [
'HT_DCPERIOD', #希尔伯特变换-显性周期
'HT_DCPHASE', #希尔伯特变换-主导周期相
'HT_PHASOR', #希尔伯特变换-相量分量
'HT_SINE', #希尔伯特变换-筋波
'HT_TRENDMODE' #希尔伯特变换-趋势与周期模式
],
#数学计算
'MathOperators': [
'ADD', #Vector Arithmetic Add(向量运算-加法)
'DIV', #Vector Arithmetic Div(除法)
'MAX', #指定周期内的最高价
'MAXINDEX', #指定周期内的最高价的索引(指数)
'MIN', #指定周期内的最低价
'MININDEX', #指定周期内的最低价的索引起引(指数)
'MINMAX', #指定周期内的最高价/最低价格
'MINMAXINDEX', #指定周期内的最高价/最低价的索引(指数)
'MULT', #乘法
'SUB', #减法
'SUM' #求和
],
#数学变换
'MathTransform': [
'ACOS',
'ASIN',
'ATAN',
'CEIL', #天花板
'COS',
'COSH',
'EXP',
'FLOOR', #地板
'LN',
'LOG10',
'SIN',
'SINH',
'SQRT',
'TAN',
'TANH'
],
#动量指标
'MomentumIndicators': [
'ADX', # Average Directional Movement Index (平均趋向指数)
'ADXR', # Average Directional Movement Index Rating
'APO', # Absolute Price Oscillator
'AROON', # Aroon
'AROONOSC', # Aroon Oscillator
'BOP', # Balance Of Power
'CCI', # Commodity Channel Index
'CMO', # Chande Momentum Oscillator
'DX', # Directional Movement Index
'MACD', # Moving Average Convergence/Divergence (平滑异同移动平均线)
'MACDEXT', # MACD with controllable MA type
'MACDFIX', # Moving Average Convergence/Divergence Fix 12/26
'MFI', # Money Flow Index
'MINUS_DI', # Minus Directional Indicator
'MINUS_DM', # Minus Directional Movement
'MOM', # Momentum
'PLUS_DI', # Plus Directional Indicator
'PLUS_DM', # Plus Directional Movement
'PPO', # Percentage Price Oscillator
'ROC', # Rate of change : ((price/prevPrice)-1)*100
'ROCP', # Rate of change Percentage: (price-prevPrice)/prevPrice
'ROCR', # Rate of change ratio: (price/prevPrice)
'ROCR100', # Rate of change ratio 100 scale: (price/prevPrice)*100
'RSI', # Relative Strength Index (相对强弱指数)
'STOCH', # Stochastic
'STOCHF', # Stochastic Fast
'STOCHRSI', # Stochastic Relative Strength Index
'TRIX', # 1-day Rate-Of-Change (ROC) of a Triple Smooth EMA
'ULTOSC', # Ultimate Oscillator
'WILLR' # Williams' %R
],
#重叠指标
'OverlapStudies': [
'BBANDS', #布林带
'DEMA', #双指数移动平均线
'EMA', #指数移动平均
'HT_TRENDLINE', #希尔伯特变换-瞬时趋势
'KAMA', #考夫曼自适应移动平均
'MA', #移动平均线
'MAMA', #自适应移动平均
'MAVP', #变周期移动平均
'MIDPOINT', #周期中点
'MIDPRICE', #周期中间价
'SAR',
'SAREXT',
'SMA', #简单移动平均线
'T3', #三指数移动平均
'TEMA', #三重指数移动平均线
'TRIMA', #三角形移动平均
'WMA' #加权移动平均线
],
#形态识别指标
'PatternRecognition': [
'CDL2CROWS', #两只乌鸦
'CDL3BLACKCROWS', #三只乌鸦
'CDL3INSIDE', #三内部上涨和下跌
'CDL3LINESTRIKE', #三线打击
'CDL3OUTSIDE', #三个部上涨和下跌
'CDL3STARSINSOUTH', #南方三星
'CDL3WHITESOLDIERS', #三白兵
'CDLABANDONEDBABY', #弃婴形态
'CDLADVANCEBLOCK', #大敌当前-前方受阻
'CDLBELTHOLD', #捉腰带线
'CDLBREAKAWAY', #脱离
'CDLCLOSINGMARUBOZU', #收盘缺影线
'CDLCONCEALBABYSWALL', #藏婴吞没有
'CDLCOUNTERATTACK', #反击线
'CDLDARKCLOUDCOVER', #乌云压顶
'CDLDOJI', #十字
'CDLDOJISTAR', #十字星
'CDLDRAGONFLYDOJI', #蜻蜓十字/T形十字
'CDLENGULFING', #吞噬模式
'CDLEVENINGDOJISTAR', #十字暮星
'CDLEVENINGSTAR', #暮星
'CDLGAPSIDESIDEWHITE', #向上/向下跳空并列阳线
'CDLGRAVESTONEDOJI', #墓碑十字典/倒T十字
'CDLHAMMER', #锤头线
'CDLHANGINGMAN', #上吊线
'CDLHARAMI', #Harami形态
'CDLHARAMICROSS', #Harami交叉模式
'CDLHIGHWAVE', #High-Wave Candle 狂浪的蜡烛
'CDLHIKKAKE', #陷阱
'CDLHIKKAKEMOD', #Modified Hikkake Pattern 修改Hikkake模式
'CDLHOMINGPIGEON', #家鸽
'CDLIDENTICAL3CROWS', #Identical Three Crows 相同三只乌鸦
'CDLINNECK', #In-Neck Pattern 颈部模式
'CDLINVERTEDHAMMER', #倒锤
'CDLKICKING', #反冲形态度
'CDLKICKINGBYLENGTH', #踢腿-牛/熊由长龙决定
'CDLLADDERBOTTOM', #梯子底部
'CDLLONGLEGGEDDOJI', #长腿
'CDLLONGLINE', #长线蜡烛
'CDLMARUBOZU', #
'CDLMATCHINGLOW', #相同低价格
'CDLMATHOLD', #
'CDLMORNINGDOJISTAR', #十字晨星
'CDLMORNINGSTAR', #晨星
'CDLONNECK', #颈部两模式
'CDLPIERCING', #刺透形态
'CDLRICKSHAWMAN', #黄包车、人力车
'CDLRISEFALL3METHODS', #上升/下降三法
'CDLSEPARATINGLINES', #分隔线
'CDLSHOOTINGSTAR', #流星
'CDLSHORTLINE', #短线蜡烛
'CDLSPINNINGTOP', #纺锤
'CDLSTALLEDPATTERN', #停滞模式
'CDLSTICKSANDWICH', #三明治,面包
'CDLTAKURI', #蜻蜓点水长下影
'CDLTASUKIGAP',
'CDLTHRUSTING', #插入模式
'CDLTRISTAR', #三星模式
'CDLUNIQUE3RIVER',
'CDLUPSIDEGAP2CROWS', #向上跳空两只乌鸦
'CDLXSIDEGAP3METHODS' #上/下缺口三种方法
],
##价格指标
'PriceTransform': [
'AVGPRICE', #平均价格
'MEDPRICE', #中间价格局
'TYPPRICE', #典型价
'WCLPRICE' #加权收盘价
],
## 统计函数
'StatisticFunctions': [
'BETA', #贝塔系数
'CORREL', #皮尔逊相关系数
'LINEARREG', #线性回归
'LINEARREG_ANGLE', #线性回归角度
'LINEARREG_INTERCEPT', #线性回归拦截
'LINEARREG_SLOPE', #线性回归斜率
'STDDEV', #标准偏差
'TSF', #时间序列预测
'VAR' #方差
],
#波动率指标
'VolatilityIndicators': [
'ATR', #平均真实波幅
'NATR', #归一化平均真实波幅
'TRANGE' #真实波幅
],
#量能指标
'VolumeIndicators': [
'AD', #查金A/D线
'ADOSC', #查金A/D振荡器
'OBV' #平均交易量
]
}
```
# 周期性指标Cycle Indicator Functions
[文库文档](https://wenku.baidu.com/view/0e35f6eead51f01dc281f18e.md)
## HT_DCPERIOD - Hilbert Transform - Dominant Cycle Period
函数名:HT_DCPERIOD
名称: 希尔伯特变换-主导周期
简介:将价格作为信息信号,计算价格处在的周期的位置,作为择时的依据。
```py
real = HT_DCPERIOD(close)
```
## HT_DCPHASE - Hilbert Transform - Dominant Cycle Phase
函数名:HT_DCPHASE
名称: 希尔伯特变换-主导循环阶段
```py
real = HT_DCPHASE(close)
```
## HT_PHASOR - Hilbert Transform - Phasor Components
函数名:HT_DCPHASE
名称: 希尔伯特变换-希尔伯特变换相量分量
```py
inphase, quadrature = HT_PHASOR(close)
```
## HT_SINE - Hilbert Transform - SineWave
函数名:HT_DCPHASE
名称: 希尔伯特变换-正弦波 NOTE: The HT_SINE function has an unstable period.
```py
sine, leadsine = HT_SINE(close)
```
## HT_TRENDMODE - Hilbert Transform - Trend vs Cycle Mode
函数名:HT_DCPHASE
名称: 希尔伯特变换-趋势与周期模式
```py
integer = HT_TRENDMODE(close)
```
ContextInfo
```py
#encoding:gbk
'''
本策略事先设定好交易的股票篮子,然后根据指数的CCI指标来判断超买和超卖
当有超买和超卖发生时,交易事先设定好的股票篮子
'''
import pandas as pd
import numpy as np
import talib
import time
def init(ContextInfo):
#hs300成分股中sh和sz市场各自流通市值最大的前3只股票
ContextInfo.trade_code_list=['601398.SH','601857.SH','601288.SH','000333.SZ','002415.SZ','000002.SZ','000936.SZ']
#设置股票池
ContextInfo.set_universe(ContextInfo.trade_code_list)
ContextInfo.accID = '6000000058'
ContextInfo.buy = True
ContextInfo.sell = False
#设定交易帐号
ContextInfo.set_account(ContextInfo.accID)
#设定起止回测点
ContextInfo.start='2020-10-01 10:00:00'
ContextInfo.end='2020-10-12 14:30:00'
#设定回测初始资金
ContextInfo.capital=100000
#设定交易滑点 0:tick跳数设置滑点 1:按固定值设置滑点 2:价格比例设置滑点
ContextInfo.set_slippage(1,0.01) #按固定值设置滑点值为0.1
#设定策略回测各种手续费率 ContextInfo.set_commission(commissionType, commissionList)
#commissionType 0:按比例 1:按每手(股)
#commissionList[opten_tax,close_tax,open_commission,close_commission,close_tdaycommission,min_commission] 分别数-买入印花税,卖出印花税,开仓费、平咋费、平今费、最小手续费
#注:如果只填写一个参数则代表输入的参数值赋值给 open_commission = close_commission = close_today_commission,其他的值均为 0,这时 commissionType 为 0
ContextInfo.set_commission(0.00025) #设定开分手续费和平仓手续费均为0.00025,其余为0
commissionList=[0,0.001,0.00025,0.00025,0,5] #设定买入印花税为0,卖出印花税为千分之一,开仓手续费万二点五,卖出手续费为万二点五,平今手续费为0,最小手续费为5元
ContextInfo.set_commission(0,commissionList)
#获取股票池中的股票
stockList = ContextInfo.get_universe()
for i,stock in enumerate(stockList):
print(i,ContextInfo.get_stock_name(stock))
print('是否停牌?',ContextInfo.is_suspended_stock(stock))
print('上市时间',ContextInfo.get_open_date(stock))
print('股票池',ContextInfo.get_universe())
#获取当前周期
print('当前周期:',ContextInfo.period)
#获取当前K线索引号
print('当前K线索引号:',ContextInfo.barpos)
#获取当前图K线数目
print('当前图K线数目',ContextInfo.time_tick_size)
#判定是否为最后一根K线
print('是否为最后一根K线:',ContextInfo.is_last_bar())
#判定是否为新的K线
print('判断是否为新K线?',ContextInfo.is_new_bar())
#获取当前主图代码
print('当前图股票代码:',ContextInfo.stockcode)
#获取当前主图复权处理方式 none:不复权 front:向前复权 back:向后复权 front_ratio:等比向前复权 back_ratio:等比向后复权
print('复权方式:',ContextInfo.dividend_type)
#获取回测基准
print('回测基准:',ContextInfo.benchmark)
#设定回测系统输出日志显示级别 0:信息 1:警告 2:错误 3:致命
#显示错误级别以上的信息
ContextInfo.data_info_level=1
#获取某个记录类型对应的某个时刻的记录情况
#buys:买入持仓,sells:卖出持仓,holdings:当前持仓,historysums:历史持仓汇总,dealdetails:交易明细
#返回结果 market:市场代码 stockcode:合约代码 open_close:期货1开0平,股票1买0卖 direction:1多0空 trade_price:持仓成本 current_price:持仓价值 profit:持仓盈亏
#postion:仓位数量 current_weight:仓位权重 benefit_weight:盈利占比权重 holding_periods:累计持仓天数 buy_sell_times:交易次数 commission:手续费 trade_balance:成交额或市值
#operate_type:操作类型 trade_date:交易日期
pos=ContextInfo.barpos
#print('当前K线的开仓记录:',get_result_records('buys',pos,ContexInfo))
#设置定时器run_time(funcName, period, startTime, market)
#500nMilliSecond, 5nSecond, 5nMinute, 5nDay,
ContextInfo.tcount=0
ContextInfo.run_time('mhHandleTimer','5nSecond','2019-10-10 13:00:00','SH')
def mhHandleTimer(ContextInfo):
ContextInfo.tcount +=1
print('定时器运行次数:',ContextInfo.tcount)
def handlebar(ContextInfo):
pass
def testLog():
d = ContextInfo.barpos #返回当前运行到的K线索引号
t = ContextInfo.get_bar_timetag(d) #获取当前K线对应的时间时间戳
date = timetag_to_datetime(t,'%Y%m%d') #将时间戳转化为日期的格式
print(d,t,date)
print (period,sell_value,buy_value)
print(ContextInfo.get_last_volume('000002.SZ'))
```
问题列表
# 获取自选股数据不成功
```python
ContextInfo.get_stock_list_in_sector('我的自选',int(time.time()))
```