def cal_best_par(df, n =200): # n为寻找次数, n越大,寻找时间越久,越接近最优值
n1_min,n1_max = 2,30
n2_min,n2_max = 5,70 # n1为为参数,选择其的取值范围
opt_para_list = [] #参数
profit_list = [] #资金收益
sharpe_list =[] #夏普率
for i in range(0,n+1):
n1 = int(random.uniform(n1_min, n1_max))
n2 = int(random.uniform(n2_min, n2_max))
opt_para_list.append([n1,n2])
profit_list.append(kama_ma(df, n1, n2)[1]) # kama_ma为策略函数
sharpe_list.append(kama_ma(df, n1, n2)[0])
return opt_para_list,sharpe_list
这里通过寻找200次找到所有参数下的资金收益和夏普率(可能会有重复值)
x_new = []
y_new = []
x,y= cal_best_par(df)
for i in range(len(x)):
if y[i]>=1.5: # 夏普大于1.5
x_new.append(x[i])
y_new.append(y[i])
if len(x_new)==0:
print('bad')
y_max = max(y_new) # 夏普大于1.5中,年化最高值
x_list = x_new[y_new.index(y_max)] # 夏普大于1.5中,年化最高的一组参数
然后就可以通过限定条件,比如上图中,通过选择夏普大于1.5的所有参数中,年化最高的一组参数。当然了,这里,也可以通过限定其他条件了,例如交易频率大于100的,或者持仓最大值小于1天的,总之,你可以理解为,蒙特卡洛的方法就是在搜寻一堆的参数,每一组参数都得到一个结果,然后选择其中最好的一组就可以了。