请选择 进入手机版 | 继续访问电脑版
2796 2

[源码分享] Python编写量化交易策略—基础教材 [推广有奖]

  • 0关注
  • 4粉丝

本科生

83%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
3 点
热心指数
3 点
信用等级
3 点
经验
1228 点
帖子
47
精华
0
在线时间
107 小时
注册时间
2017-7-13
最后登录
2019-5-22

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
    MINDGO量化平台推出策略编写教材,希望给哪些想要学习Python语言以及编写量化策略的小伙伴提供学习免费教材,详细教材登录MINDGO量化交易平台,点击策略库即可免费查看。如下图:

          除了一些学习教材,小伙伴还可以免费查看并且复制大师系列,分钟级量化策略的源代码,让你更快掌握Python编写策略的技巧。
         以下是均值回归策略编写技巧----策略编写学习教材(四),里面包括了如果用好Python的字典功能,以及理解均值回归策略的核心。希望能给小伙伴们带来帮助!
'''
                            均值回归策略编写技巧----策略编写学习教材(四)
    本章内容主要介绍了如何在MINDGO平台上快速学会编写均值回归策略,希望能给有需要的小伙伴带来一定帮助。
    本文建立于动量策略编写技巧之上,因此需要完整地学习的同学可以先看教材(三)
                                          
                                          
                                           均值回归策略逻辑
一、均值回归介绍
    均值回归是金融学的一个重要概念,也是一种数学方法,市场中指的是:个股股价偏离其内在价值过高或者
过低时,就会改变原有趋势,而形成靠拢内在价值的趋势。酷似价值规律,如下图:
    均值回归是否与动量效应冲突?从形式上看,动量效应认为趋势会延续,均值回归认为趋势会改变,但是从
内在逻辑上看,均值回归通过计算个股内在价值,从而研判个股内在趋势,但是动量效应与均值回归不同,它不
存在一个内在价值,或者说动量效应是研究价格的一种方式,而均值回归是研究价值的一种方式,因此两者形式
相冲,但内在逻辑不冲突。
    均值回归的核心:准确计算出个股内在价值。均值回归之所以能经久不衰,靠的是价值这口气活着,如果投
资者在运用均值回归时,无法准确计算出个股的价值,那么其结果必定是惨烈的,不是在股价上涨时提前抛售,
就是在股价下跌时过早买入。
    均值回归的价值计算方式:说实话,计算个股内在价值的方式有很多种,并且每个投资者都有自己的观点和
看法,因此本文为了演示策略,挑选了三种个股内在价值的计算方法:
    第一种市盈率法,目前一年期的货币基金利率为3%,对应股市中的平均市盈率为33倍。
    第二种市净率法,一般而言,市净率小于1,表明公司股价被严重低估,1-3是合理投资区间,超过3就表明公
司股价偏高。
    第三种市销率,市销率越低,说明该公司股票目前的投资价值越大,一般情况下,市销率小于2,则股票具有
投资价值,超过10,则说明风险较大。


二、构建简单均值回归策略
    根据上一节的内容,我们构建一个简单的均值回归策略:
    第一步:
    通过以上三种方法来判断其内在价值是否为低估,如果低估,则可能在一段时间内进行均值回归,也就是价格
上涨至价值区。其中市盈率,市销率,市净率是我们判断的指标,本策略采用经典打分法,也就是说,我们把单纯
的市盈率指标进行解剖,上文已经算出市盈率均值为33.因此将市盈率33以下的个股给予10分,反之则不给分。市
净率小于1的个股给予10分,在1至3区间的给予5分,反之不给分。市销率小于2的给予10分,在2-10区间的给予5分
,反之不给分。采用以上打分法,得分较高的个股说明其股价被低估的越严重,越有可能进行均值回复!
    第二步:
    确定调仓周期:一个月,确定最大持股数量:30只。
    第三步:
    设置风险措施,个股亏损超过10%,则进行止损。止盈为时间止盈,满一个月止盈。


                                         策略框架
I.初始化函数,设置账户条件
II.交易函数,用于买卖个股
III.选股函数,用于选择相应股票列表
IV.风控函数,用于止损止盈
'''
#=====================================================================================================
#导包操作
from datetime import timedelta, date
import pandas as pd
#=====================================================================================================
#=====================================================================================================
#初始化函数,设置初始条件
def initialize(account):
    account.n = 30
    account.trade_date = range(1,13,1)
    run_monthly(trade,date_rule=2)
    get_iwencai('未停牌,上市时间超过2年')
#=====================================================================================================
#=====================================================================================================
#设置止损止盈,handle_data是每日(分钟/tick)运行
def handle_data(account,data):
    if len(account.positions) > 0:
        securities = list(account.positions)
        for stock in securities:
            price = data.attribute_history(stock, ['close'], 1, '1d', skip_paused=False, fq='pre')
            if account.positions[stock].cost_basis /price['close'][0]-1 < -0.1:
                order_target(stock, 0)
#=====================================================================================================
#=====================================================================================================
#选股函数
def stocks_jz(account,data):
    date= get_last_datetime().strftime('%Y%m%d')
    #获取时间,并将其转化成年月日
    df = {'security': [], 1:[], 2:[], 3:[], 'score':[]}
    #创建字典,一个5个键,对应5个值
    stocks=account.iwencai_securities
    #从问财的选股结果导入到stocks
    for security in stocks:
        q=query(profit.symbol,valuation.pe_ttm,valuation.pb,valuation.ps_ttm
                ).filter(profit.symbol==security)
        yz = get_fundamentals(q, date=date).fillna(0)
        #get_fundamentals,获取股票代码,市盈率,市销率,市净率数据,fillna(0)能将数据缺失值填充为0
        df['security'].append(security)
        if (not (yz['valuation_pe_ttm'].empty or yz['valuation_ps_ttm'].empty or yz['valuation_pb'].empty)):
        #判断这些数据中是否有空值,如果存在则跳到101行,直接打0分
            if yz['valuation_pe_ttm'][0]<33 :
            #判断单个股票的市盈率因子,满足条件则加10分,不满足则不加分。
                df[1].append(10)
            else:
                df[1].append(0)
            if yz['valuation_ps_ttm'][0]<2.01:
                df[2].append(10)
            elif yz['valuation_ps_ttm'][0]<10.01 and yz['valuation_ps_ttm'][0]>2.01:
                df[2].append(5)
            else:
                df[2].append(0)
            if yz['valuation_pb'][0]<1.01:
                df[3].append(10)
            elif yz['valuation_pb'][0]<3.01 and yz['valuation_pb'][0]>1.01:
                df[3].append(5)
            else:
                df[3].append(0)
        else:
            df[1].append(0)
            df[2].append(0)
            df[3].append(0)
    for i in range(len(df['security'])):
        s = (df[1]+df[2]+df[3])
        #将三个因子的打分结果相加
        df['score'].append(s)
        #相加后的结果导入score键中
    df = pd.DataFrame(df).sort_values(by ='score', ascending=False)
    #将字典转化成DF格式,并以总分从大到小排序。
    account.sample = df['security'][:30]
    return account.sample
#=====================================================================================================
#=====================================================================================================
#交易函数
def trade(account, data):
    date = get_datetime()
    months = get_datetime().month
    if months in account.trade_date:
        jz_list = stocks_jz(account,data)
        stock_list = list(set(jz_list))
        if len(account.positions) > 0:
            for stock in list(account.positions):
                if stock not in stock_list:
                    order_target(stock, 0)
        if len(stock_list) > 0:
            for stock in stock_list:
                if stock not in list(account.positions):
                    if len(account.positions) < account.n :
                        number = account.n  - len(account.positions)
                        order_value(stock,account.cash/number)
                    else:
                        order_value(stock,account.cash)
                           
    else:
        pass
#=====================================================================================================
#=====================================================================================================
        
   
   
   


   


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:量化策略 量化交易 Python语言

xxxxx.PNG
需要查看教材的同学可登陆http://quant.10jqka.com.cn/platform/html/strategylib.html#/q/mindgo_59547441_733

使用道具

学习教材

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-3-29 16:23