以下其中一套,如有兴趣学习 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
a499492580 OP 同花顺 MINDGO 量化平台网址: http://quant.10jqka.com.cn/platform/html/study-index.html#/
|