7 套 Python 编写策略的教材!

2017-09-25 11:27:26 +08:00
 a499492580

以下其中一套,如有兴趣学习 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 只个股。
2080 次点击
所在节点    Python
1 条回复
a499492580
2017-09-25 11:28:05 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/393394

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX