量化策略——市盈率策略选股源码

0
回复
4369
查看
[复制链接]

95

主题

18

回帖

515

积分

高级会员

积分
515
来源: 2019-7-16 22:20:18 显示全部楼层 |阅读模式
市盈率是我们选股的一个和重要参考,本文以市盈率为选股模型,运用python实现选股:
  1. import talib

  2. import numpy as np

  3. import math

  4. import pandas

  5. import time

  6. import datetime

  7. from functools import reduce

  8. #init方法是您的初始化逻辑,context对象可以在任何函数之间传递

  9. def init(context):

  10. #滑点默认值为2‰

  11. context.set_slippage(0.002)

  12. #交易费默认值为0.25‰

  13. context.set_commission(0.00025)

  14. #基准默认为沪深300

  15. context.set_benchmark("000300.SH")

  16. #调仓周期

  17. task.weekly(option_stock, weekday=2, time_rule=market_open(minute=5))

  18. #下面为几个定时执行的策略代码,可放开注释替换上面的执行时间

  19. #task.daily(option_stock, time_rule=market_close(minute=5)) #每天收盘前5分钟运行

  20. #task.weekly(option_stock, weekday=2, time_rule=market_open(minute=5)) #每周周二开盘后5分钟运行

  21. #task.monthly(option_stock, tradingday=1 ,time_rule=market_open(minute=5)) #每月第1个交易日开盘后5分运行

  22. #每天开盘前进行选股

  23. def before_trade(context):

  24. context.stock_list = choose_stock_finance()

  25. #日或分钟或实时数据更新,将会调用这个函数

  26. def handle_data(context,data_dict):

  27. pass

  28. #操作股票

  29. def option_stock(context,data_dict):

  30. stock_list = context.stock_list

  31. sell_stock(context,stock_list,data_dict) #先卖出股票再买入

  32. for stock in stock_list:

  33. buy_stock(context,stock) #买入股票

  34. #策略买入信号函数

  35. def buy_stock(context, stock):

  36. context.percentage = 1 #设置单支股票最大买入仓位

  37. stock_buy_num = 10 #最多买入股票数量

  38. stock_percentage = 0.99/stock_buy_num #每支股票买入的最大仓位

  39. if len(context.portfolio.positions) < stock_buy_num:

  40. if stock_percentage > context.percentage: #设置单支股票最大买入仓位

  41. stock_percentage = context.percentage #更换买入仓位

  42. order_percent(stock, stock_percentage) #买入股票

  43. #策略卖出信号函数

  44. def sell_stock(context,stock_list,data_dict):

  45. for stock in list(context.portfolio.positions.keys()):

  46. if not (stock in stock_list):

  47. order_target_value(stock,0) #如果不在股票列表中则全部卖出

  48. #选股函数

  49. def choose_stock_finance():

  50. dataframe = get_fundamentals(

  51. query(

  52. 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

  53. ).filter(

  54. fundamentals.equity_valuation_indicator.pe_ratio_ttm > 10

  55. ).filter(

  56. fundamentals.equity_valuation_indicator.pe_ratio_ttm < 40

  57. ).filter(

  58. fundamentals.equity_valuation_indicator.pe_ratio_nobtest > 10

  59. ).filter(

  60. fundamentals.equity_valuation_indicator.pe_ratio_nobtest < 40

  61. ).filter(

  62. fundamentals.equity_valuation_indicator.pe_ratio > 10

  63. ).filter(

  64. fundamentals.equity_valuation_indicator.pe_ratio < 40

  65. ).filter(

  66. fundamentals.financial_analysis_indicator.inc_gross_profit > 1

  67. ).filter(

  68. fundamentals.financial_analysis_indicator.inc_gross_profit < 100

  69. ).filter(

  70. fundamentals.equity_valuation_indicator.market_cap_2 > 10000000000

  71. ).filter(

  72. fundamentals.equity_valuation_indicator.market_cap_2 < 30000000000

  73. )

  74. )

  75. stock_list = dataframe.columns.values

  76. return stock_list

复制代码
外汇.jpg



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 免费注册
关注微信