获取财务数据(基本面数据)
get_fundamentals 查询财务数据,基本命数据,公司的数据(即将废弃)
4、 get_factor() 获取因子
用途:查询财务数据
- 回测的时候、主要拿来选股
- 400多种 财务指标
# 获取股票截止 T-1 日的因子数据
get_factor(order_book_ids, factors,count=1,universe=None,expect_df=False)
参数 | 类型 | 说明 |
---|---|---|
order_book_ids | str or str list | 合约代码,可传入 order_book_id, order_book_id list |
factors | str or str list | 因子名称,可查询 rqdatac.get_all_factor_names() 得到所有有效因子字段 |
count | int | 默认为 1,获取多少个交易日的数据 |
universe | str | 当获取界面因子时,universe 指定了因子计算时的股票池 |
expect_df | bool | 默认为 False,当设置为 True 时,返回 multi-index DataFrame。 |
-
股票池获取
index_components(order_book_id, date=None)
stocks = all_instruments(type='CS').order_book_id # 所有股票 stocks = index_components('000300.XSHG') # 沪深300 # 股票池 logger.info('stocks:{}'.format(stocks)) logger.info('len:{}'.format(len(stocks))) context.stocks = stocks
-
因子过滤
# 获取财务数据
# pe_ratio 获取市盈率因子 如果是单个数据则表现为 panel
# 多个因子 结果为 dataFrame
fund = get_factor(context.stocks, ['pe_ratio', 'pcf_ratio'])
# 过滤 指标pe_ratio > 20 并且 pcf_ratio < 50
fund = fund[(fund['pe_ratio'] > 20) & (fund['pcf_ratio'] < 50)]
- 排序
# 排序
fund = fund.sort_values(by='pe_ratio', ascending=True) # 升序排序
- 限制个数
# 个数限制
fund = fund.head(10)
# logger.info('fund01:\n{}'.format(fund))
获取财务数据,获取因子、排序、获取股票代码列表
# 可以自己import我们平台支持的第三方python模块,比如pandas、numpy等。
# 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。
def init(context):
# 在context中保存全局变量
context.s1 = "000001.XSHE"
# 实时打印日志
logger.info("RunInfo: {}".format(context.run_info))
stocks = all_instruments(type='CS').order_book_id # 所有股票
stocks = index_components('000300.XSHG') # 沪深300
# 股票池
logger.info('stocks:{}'.format(stocks))
logger.info('len:{}'.format(len(stocks)))
context.stocks = stocks
# before_trading此函数会在每天策略交易开始前被调用,当天只会被调用一次
def before_trading(context):
# 获取财务数据
# pe_ratio 获取市盈率因子 如果是单个数据则表现为 panel
# 多个因子 结果为 dataFrame
fund = get_factor(context.stocks, ['pe_ratio', 'pcf_ratio'])
# 过滤 指标pe_ratio > 20 并且 pcf_ratio < 50
fund = fund[(fund['pe_ratio'] > 20) & (fund['pcf_ratio'] < 50)]
# 排序
fund = fund.sort_values(by='pe_ratio', ascending=True) # 升序排序
# 个数限制
fund = fund.head(10)
# logger.info('fund01:\n{}'.format(fund))
# 丢弃日期列
fund = fund.reset_index(1, drop=True)
logger.info('fund:\n{}'.format(fund))
# 挑选后的股票代码
stock_list = fund.index.values
update_universe(fund.index.values)
logger.info('stock_list:\n{}'.format(stock_list))
# 你选择的证券的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新
def handle_bar(context, bar_dict):
# 开始编写你的主要的算法逻辑
pass
# after_trading函数会在每天交易结束后被调用,当天只会被调用一次
def after_trading(context):
pass
5、定时器
通过财务数据选股票、不用每天获取、一般每隔一个星期、一个月定期获取一些符合条件的股票
只能在init中使用
- scheduler.run_daily --每天运行
- scheduler.run_weekly–每周运行
- scheduler.run_monthly --每月运行
5.1 每月运行
scheduler.run_monthly(function, tradingday=t)
参数
参数 类型 注释 function function 使传入的 function
每日交易开始前运行。注意,function 函数一定要包含(并且只能包含)context, bar_dict 两个输入参数tradingday int 范围为[-23,1], [1,23] ,例如,1 代表每月第一个交易日,-1 代表每月倒数第一个交易日,用户必须指定
function 函数一定要包含 context, bar_dict两个输入参数
tradingday [-23, 1] [1, 23] 1代表每月第一个交易日, -1 代表每月倒数第一个交易日
def init(context):
# 定义按月运行 定时器
scheduler.run_monthly(get_data, tradingday=1)
# 参数必须符合
def get_data(context, bar_dict):
# 这里按月查询财务数据
q = query(fundamentals.eod_derivative_indicator.pb_ratio
).filter(fundamentals.eod_derivative_indicator.pb_ratio > 10
).filter(fundamentals.stockcode.in_(context.index_list))
fund =get_fundamentals(q)
logger.info(fund.T)
运行顺序
- 按月:2月 2月1日假设第一个交易日
- 2月1日,运行顺序 before_trading ==> get_data ==> handle_bar
- 2月其它日期 运行顺序 before_trading ==> handle_bar
#scheduler调用的函数需要包括context, bar_dict两个参数
def query_fundamental(context, bar_dict):
# 查询revenue前十名的公司的股票并且他们的pe_ratio在25和30之间。
stocks = all_instruments('CS').order_book_id
fundamental_df = get_factor(stocks, ['pe_ratio', 'revenue'])
fundamental_df = fundamental_df[(fundamental_df['pe_ratio'] > 25) & (fundamental_df['pe_ratio'] < 30)]
fundamental_df = fundamental_df.sort_values(by='revenue', ascending=False).head(10).reset_index(1, drop=True)
# 将查询结果dataframe的fundamental_df存放在context里面以备后面只需:
context.fundamental_df = fundamental_df
# 实时打印日志看下查询结果,会有我们精心处理的数据表格显示:
logger.info(context.fundamental_df)
update_universe(context.fundamental_df.index.values)
# 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。
def init(context):
# 每月的第一个交易日查询以下财务数据,以确保可以拿到最新更新的财务数据信息用来调整仓位
scheduler.run_monthly(query_fundamental, tradingday=1)