列举了一些常用的函数,此帖会不断更新~~~
### 函数来源:
1. 社区用户无私的奉献
2. JQ 员工产出
## 目录:
- 一、函数:
- [股票过滤](#股票过滤)
- [风控函数](#风控函数)
- [财务数据](#财务数据)
- [技术指标](#技术指标)
- 二、行业概念代码
- [证监会行业](#证监会行业)
- [聚宽一级行业](#聚宽一级行业)
- [聚宽二级行业](#聚宽二级行业)
- [申万一级行业](#申万一级行业)
- [申万二级行业](#申万二级行业)
- [申万三级行业](#申万三级行业)
- [概念板块](#概念板块)
## 一、函数
### 股票过滤
过滤停牌股票、ST股票、退市股票、新股等函数
```python
## 过滤停牌股票
def paused_filter(security_list):
current_data = get_current_data()
security_list = [stock for stock in security_list if not current_data[stock].paused]
# 返回结果
return security_list
## 过滤退市股票
def delisted_filter(context, security_list):
if g.filter_delisted:
current_data = get_current_data()
security_list = [stock for stock in security_list if not (('退' in current_data[stock].name) or ('*' in current_data[stock].name))]
# 返回结果
return security_list
## 过滤ST股票
def st_filter(security_list):
current_data = get_current_data()
security_list = [stock for stock in security_list if not current_data[stock].is_st]
# 返回结果
return security_list
## 只有ST股票
def st_filter(security_list):
current_data = get_current_data()
security_list = [stock for stock in security_list if current_data[stock].is_st]
# 返回结果
return security_list
## 获取上市新股
def get_new_stocks(context):
df = get_all_securities(types=['stock'])
date=context.current_dt.date()
new_stocks = list(df[df.start_date == date].index)
return new_stocks
```
### 风控函数
过滤停牌股票、ST股票、退市股票等函数
```python
## 个股止损
def security_stoploss(context,loss=0.1):
if len(context.portfolio.positions)>0:
for stock in context.portfolio.positions.keys():
avg_cost = context.portfolio.positions[stock].avg_cost
current_price = context.portfolio.positions[stock].price
if 1 - current_price/avg_cost >= loss:
log.info(str(stock) + ' 跌幅达个股止损线,平仓止损!')
order_target_value(stock, 0)
## 个股止盈
def security_stopprofit(context,profit=0.1):
if len(context.portfolio.positions)>0:
for stock in context.portfolio.positions.keys():
avg_cost = context.portfolio.positions[stock].avg_cost
current_price = context.portfolio.positions[stock].price
if current_price/avg_cost - 1 >= profit:
log.info(str(stock) + ' 涨幅达个股止盈线,平仓止盈!')
order_target_value(stock, 0)
## 大盘止损
# 止损方法1:根据大盘指数N日均线进行止损
def index_stoploss_sicha(index, context, n=60):
'''
当大盘N日均线(默认60日)与昨日收盘价构成“死叉”,则清仓止损
'''
if len(context.portfolio.positions)>0:
hist = attribute_history(index, n+2, '1d', 'close', df=False)
temp1 = mean(hist['close'][1:-1])
temp2 = mean(hist['close'][0:-2])
close1 = hist['close'][-1]
close2 = hist['close'][-2]
if (close2 > temp2) and (close1 < temp1):
log.info('大盘触及止损线,清仓!')
for stock in context.portfolio.positions.keys():
order_target_value(stock, 0)
# 止损方法2:根据大盘指数跌幅进行止损
def index_stoploss_diefu(index, context, n=10, zs=0.03):
'''
当大盘N日内跌幅超过zs,则清仓止损
'''
if len(context.portfolio.positions)>0:
hist = attribute_history(index, n, '1d', 'close',df=False)
if ((1-float(hist['close'][-1]/hist['close'][0])) >= zs):
log.info('大盘触及止损线,清仓!')
for stock in context.portfolio.positions.keys():
order_target_value(stock, 0)
```
### 财务数据
获取一段时期财务数据的季报、年报数据,及其总和与均值。
```
def get_fundamentals_sum_mean_value(security='000001.XSHE', search=income.basic_eps, count=5, frequency='quarter'):
'''
输入:
security: 要查询股票的代码
search: 要查询的字段,详情参考 API: get_fundamentals-查询财务数据
count: 单位时间长度,表示返回前几多少期的季报或者年报
frequency: 获取数据类型,'quarter'为季报,'year'为年报
输出:
sum_num: 总值
mean_num: 平均值
df: 一段时间内季报或者年报的 DataFrame
注:
对于年报数据, 我们目前只有 现金流表 和 利润表, 当查询其他表时, 会返回该年份最后一个季报的数据"
'''
import pandas as pd
def get_quarter(month):
if month in (1,2,3):
return 1
elif month in (4,5,6):
return 2
elif month in (7,8,9):
return 3
elif month in (10,11,12):
return 4
# 查询条件
q = query(
income.code,
income.statDate,
search,
).filter(
income.code.in_([security])
)
# 获取最近一次报表发布的日期
statDate_num = get_fundamentals(q)['statDate'][0]
# 获取最近一次报表发布所属的年份
year = datetime.datetime.strptime(statDate_num, "%Y-%m-%d").year
# 获取最近一次报表发布所属的月份
month = datetime.datetime.strptime(statDate_num, "%Y-%m-%d").month
# 获取最近一次报表发布日期所属的季度
qt = get_quarter(month)
# 获取季度列表
qt_list = range(qt,0,-1)+range(4,0,-1)*(count/4+1)
qt_list = qt_list[:count]
# 查询时间列表
data_list = []
# 获取查询的名称
name = str(search).split('.')[-1]
# 列名称
colums_list = []
# 获取拼接后的 DataFrame
if frequency == 'quarter':
for num in range(len(qt_list)):
s = str(year)+'q'+str(qt_list[num])
data_list.append(s)
colums_list.append(name + '_' + s)
if qt_list[num] == 1:
year -= 1
# 拼接列表
df = get_fundamentals(q, statDate = data_list[0])
df.set_index(df.code.values, inplace=True)
for t in data_list[1:]:
d = get_fundamentals(q, statDate = t)
d.set_index(d.code.values, inplace=True)
df = pd.concat([df[name],d[name]],axis = 1)
elif frequency == 'year':
for num in range(count):
year -= 1
s = str(year)
data_list.append(s)
colums_list.append(name + '_' + s)
# 拼接列表
df = get_fundamentals(q, statDate = data_list[0])
df.set_index(df.code.values, inplace=True)
for t in data_list[1:]:
d = get_fundamentals(q, statDate = t)
d.set_index(d.code.values, inplace=True)
df = pd.concat([df[name],d[name]],axis = 1)
else:
print "请输入正确的 frequency 参数,'quarter'为季报,'year'为年报. \n对于年报数据, 我们目前只有 现金流表 和 利润表, \n当查询其他表时, 会返回该年份最后一个季报的数据"
return
# 设置列名称
df.columns = colums_list[:len(df.iloc[0])]
# 计算总值
sum_num = sum(df.iloc[0])
# 计算平均值
mean_num = mean(df.iloc[0])
# 返回结果
return sum_num, mean_num, df
```
### 技术指标函数群
[技术指标文档](https://www.joinquant.com/help/api/help?name=technicalanalysis)
[在本地环境下载技术指标数据](https://www.joinquant.com/help/api/help?name=JQData#技术分析指标因子(付费))
## 二、行业概念代码
### 证监会行业
```
from jqdata import *
HY_ZJH = get_industries(name='zjw')
```
### 聚宽一级行业
```
from jqdata import *
HY_ZY =get_industries(name='jq_l1')
```
### 聚宽二级行业
```
from jqdata import *
HY_ZY =get_industries(name='jq_l2')
```
### 申万一级行业
```
from jqdata import *
SW1 = get_industries(name='sw_l1')
```
### 申万二级行业
```
from jqdata import *
SW2 = get_industries(name='sw_l2')
```
### 申万三级行业
```
from jqdata import *
SW3 = get_industries(name='sw_l3')
```
### 概念板块
```
from jqdata import *
GN = get_concepts()
```
好棒!不过我是新手,想把资料打印出来学习,求教怎么操作?
2017-02-22
@水乐水 这个没必要打印,写策略的时候复制调用一下即可。
2017-02-22
很好,但是 unit 参数可以传入,计算任意周期,使用效果更佳!
2017-02-22
目前的问题不再于 指标的函数 如何,而是当用这些指标去扫描上了一定量的股票,回测起来是一个灾难!
2017-02-22
@在风中 更改uilt对于风神来说不是大问题,这个只是给新用户用的,有能力的在这上面改一下即可。
2017-02-22