|
市盈率是我们选股的一个和重要参考,本文以市盈率为选股模型,运用python实现选股:
- import talib
- import numpy as np
- import math
- import pandas
- import time
- import datetime
- from functools import reduce
- #init方法是您的初始化逻辑,context对象可以在任何函数之间传递
- def init(context):
- #滑点默认值为2‰
- context.set_slippage(0.002)
- #交易费默认值为0.25‰
- context.set_commission(0.00025)
- #基准默认为沪深300
- context.set_benchmark("000300.SH")
- #调仓周期
- task.weekly(option_stock, weekday=2, time_rule=market_open(minute=5))
- #下面为几个定时执行的策略代码,可放开注释替换上面的执行时间
- #task.daily(option_stock, time_rule=market_close(minute=5)) #每天收盘前5分钟运行
- #task.weekly(option_stock, weekday=2, time_rule=market_open(minute=5)) #每周周二开盘后5分钟运行
- #task.monthly(option_stock, tradingday=1 ,time_rule=market_open(minute=5)) #每月第1个交易日开盘后5分运行
- #每天开盘前进行选股
- def before_trade(context):
- context.stock_list = choose_stock_finance()
- #日或分钟或实时数据更新,将会调用这个函数
- def handle_data(context,data_dict):
- pass
- #操作股票
- def option_stock(context,data_dict):
- stock_list = context.stock_list
- sell_stock(context,stock_list,data_dict) #先卖出股票再买入
- for stock in stock_list:
- buy_stock(context,stock) #买入股票
- #策略买入信号函数
- def buy_stock(context, stock):
- context.percentage = 1 #设置单支股票最大买入仓位
- stock_buy_num = 10 #最多买入股票数量
- stock_percentage = 0.99/stock_buy_num #每支股票买入的最大仓位
- if len(context.portfolio.positions) < stock_buy_num:
- if stock_percentage > context.percentage: #设置单支股票最大买入仓位
- stock_percentage = context.percentage #更换买入仓位
- order_percent(stock, stock_percentage) #买入股票
- #策略卖出信号函数
- def sell_stock(context,stock_list,data_dict):
- for stock in list(context.portfolio.positions.keys()):
- if not (stock in stock_list):
- order_target_value(stock,0) #如果不在股票列表中则全部卖出
- #选股函数
- def choose_stock_finance():
- dataframe = get_fundamentals(
- query(
- fundamentals.equity_valuation_indicator.pe_ratio_ttm, fundamentals.equity_valuation_indicator.pe_ratio_nobtest, fundamentals.equity_valuation_indicator.pe_ratio, fundamentals.financial_analysis_indicator.inc_gross_profit, fundamentals.equity_valuation_indicator.market_cap_2
- ).filter(
- fundamentals.equity_valuation_indicator.pe_ratio_ttm > 10
- ).filter(
- fundamentals.equity_valuation_indicator.pe_ratio_ttm < 40
- ).filter(
- fundamentals.equity_valuation_indicator.pe_ratio_nobtest > 10
- ).filter(
- fundamentals.equity_valuation_indicator.pe_ratio_nobtest < 40
- ).filter(
- fundamentals.equity_valuation_indicator.pe_ratio > 10
- ).filter(
- fundamentals.equity_valuation_indicator.pe_ratio < 40
- ).filter(
- fundamentals.financial_analysis_indicator.inc_gross_profit > 1
- ).filter(
- fundamentals.financial_analysis_indicator.inc_gross_profit < 100
- ).filter(
- fundamentals.equity_valuation_indicator.market_cap_2 > 10000000000
- ).filter(
- fundamentals.equity_valuation_indicator.market_cap_2 < 30000000000
- )
- )
- stock_list = dataframe.columns.values
- return stock_list
复制代码
|
|