V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
a499492580
V2EX  ›  Python

7 套 Python 编写策略的教材!

  •  1
     
  •   a499492580 · 2017-09-25 11:27:26 +08:00 · 2067 次点击
    这是一个创建于 2417 天前的主题,其中的信息可能已经有所发展或是发生改变。

    以下其中一套,如有兴趣学习 python 语言的同学,可到 MINDGO 量化平台进行学习

    #====================================================================================================
    #在编写策略时,我们首先需要大致确定一下我们编写过程需要用到的几个 Python 包,比如 numpy.pandas.datetime,您
    #需要根据您的需求,在策略的最上方进行导包操作。
    from datetime import timedelta, date
    #导入 datetime 相关包
    import pandas as pd
    #导入 pandas 包,用于数据分析。
    #====================================================================================================
    #====================================================================================================
    #首先我们需要一个策略初始化函数,其功能相当于开户。
    def initialize(account):
    #def 是 Python 语言创建函数的标志,initialize 是函数名称,这里是初始化函数,( account )是账户信息对象,也就是
    #该初始化函数中,只有初始一些账户信息。并且该函数只运行一次,相当于开户只需要一次就可以了。
        account.n = 15 
        #设置 n=15,并将其放到账户信息中,主要为了控制持股数量,控制到 15 个及以内。
        account.trade_date = range(1,13,1)
        #设置交易频率,并将其放在账户信息中,range ( a,b,c )函数是产生一个数列,从 a 到( b-1 ),其中间隔 c。这里的
        #rang(1,13,1)也就代表是 1 到 12 的数列
        run_monthly(trade,date_rule=-1)
        #按月运行函数 run_monthly ( a,b ),其中里面有两个参数,a 是运行对象,这里是 trade 函数(详见 34 行代码),
        #b 是运行时间,这里是每个月倒数第一个交易日。
    #====================================================================================================
    #====================================================================================================
    #其次我们需要构建一个交易系统,使得整个策略能运行起来!
    def trade(account, data):
    #我们创建一个取名为 trade 的函数,用于交易,其中设置 account 参数,我们就可以到别的函数中的 account 对象中的信息
    #用到这里来,另外我们还有 data 参数,用于计算数据。
        date = get_datetime()
        #用来获取当前回测时间的函数,直接存在 date 中。
        months = get_datetime().month
        #将回测时间中的月份取出来,存在 months 中。
        if months in account.trade_date:
        #if  判断函数,这里是判断月份是否是我们初始条件中设置的 1-12 月,如果是,那么则交易,如果不是则跳过
        #其次我们可以发现,account 参数由于 trade 和 initialize 都有,因此其对象中的数据我们就可以自由使用。
            pb_list = stocks_pb(account,data)
            #我们将 stocks_pb(account,data)函数的选股结果导入 pb_list 对象
            stock_list = list(set(pb_list))
            #我们需要将 pb_list 对象的格式进行转化,使得运行不出错,直接用 list(set(x))即可。其中 set()是创建集合
            #这里是创建股票集合,list()用来创建列表,这里是创建股票列表。
            if len(account.positions) > 0:
            #if 判断函数,len()是取长度数值,account.positions 是账户持仓信息,len(account.positions)也就是
            #当前持仓股票的数量,如果大于 0,则进行下一步。
                for stock in list(account.positions):
                #for x in y 是循环函数,从 y 中逐一取出来设为 x,这里的 y 是持仓个股列表。x 是 stock,将个股取出,
                #stock 中存放取出的个股,执行下一步,如果一个个股执行完毕,执行下一个个股,直到账户中所有持仓
                #个股全部被执行后,跳出循环。
                    if stock not in stock_list:
                    #if 判断函数,判断选股股票是否在选股函数列表,不在则运行下一步
                        order_target(stock, 0)
                        #order_target 下单函数,stock 是买卖的股,0 是目前持仓,也就是清仓。
            if len(stock_list) > 0:
            #if 判断函数,判断选股列表中股票数量是否大于 0
                for stock in stock_list:
                #for x in y 循环函数,从股票列表中逐一取出个股
                    if stock not in list(account.positions):
                    #if 判断函数,用于判断个股是否在个股持仓列表中。
                        if len(account.positions) < account.n :
                        #if 判断函数,用于判断持仓个股数,是否小于我们初始化设置的条件 15 个。
                            number = account.n  - len(account.positions)
                            #如果不超出,那么计算,我们还能买的个股数量
                            order_value(stock,account.cash/number)
                            #下单函数,执行买入,买入的金额为可用现金 /可买个股数
                        else: 
                            order_value(stock,account.cash)
                        #else 是 if 函数的衍生,如果个股数量等于或超过最大持仓,那么我们将剩下的资金全部买入
                               
        else:
        #这里的 else 是之前的月份的判断。如果月份不符合则执行 else
            pass
            #pass 是跳过
    #====================================================================================================
    #====================================================================================================
    #我们需要创建一个函数,其作用是选择我们股票,因子是 pb 市净率,来让我们的交易系统有股票可以买卖
    def stocks_pb(account,data):
    #我们创建一个取名为 stocks_pb 的函数,用于选股,其中设置 account 参数,我们就可以到别的函数中的 account 对象
    #中的信息用到这里来,另外我们还有 data 参数,用于计算数据。
        last_date = get_last_datetime().strftime('%Y%m%d')
        #get_last_datetime()函数用来获取回测的前一天的日期,后面的 strftime('%Y%m%d')是用来转化成年月日的格式。
        pb = get_fundamentals(query(valuation.symbol,valuation.pb
                            ).filter(valuation.pb > 0,
                            ).order_by(valuation.pb.asc()
                            ),date = last_date)
        #get_fundamentals 是获取财务数据的函数,query(x)是获取对象,这里是股票和 pb,filter(y)是用来筛选条件,这
    #里是 pb>0,order_by(z)用来排序,将选择后的个股排序,这里是 pb 从小到大,date 是日期,这里是回测前一日。
    #其中 sec()是从小到大排序。
        return list(pb['valuation_symbol'][:15])
        #return 用来输出函数的执行结果。这里是我们选择出来的股票列表的前 15 只个股。
    
    1 条回复    2017-09-25 11:28:05 +08:00
    a499492580
        1
    a499492580  
    OP
       2017-09-25 11:28:05 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5761 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 09:07 · PVG 17:07 · LAX 02:07 · JFK 05:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.