python - Python 优化移动平均线
问题描述
我想创建具有滚动功能和 scipy 优化的移动平均策略,但我的代码没有优化滚动。它给出了我作为第一个 x0 值输入的结果。我在 google 中搜索了它,有一些方法可以创建所有滚动的可能性,但这需要很多时间。有什么方法可以有效优化。这是我的代码,在此先感谢;
import pandas as pd
import os
import numpy as np
from datetime import datetime
import scipy.optimize as opt
#read file
data = pd.read_csv(r'C:\Users\Kaan\USDTRY-2018_06_01-2018_09_07.csv', encoding='utf-8', header=None, index_col=0)
data.columns = ['buy','sell',1,2]
data1 = data[['buy','sell']].head(100000)
# Optimization -------------------------------////////////////////------------------------------------
def objective(x):
x1 = x[0]
x2 = x[1]
x3 = x[2]
x4 = x[3]
data3 = pd.DataFrame(data=data1)
data3['sma1']=data3['buy'].rolling(int(x3)).mean()
data3['sma2']=data3['buy'].rolling(int(x4)).mean()
data3['sma1-sma2'] = np.round(data3['sma1']-data3['sma2'],5)
data3['pos'] = np.where(data3['sma1-sma2'] >= x1, 1, 0)
data3['pos'] = np.where((data3['sma1-sma2'] < -x1) ,-1, data3['pos'])
data3['pos'] = np.where(abs(data3['sma1-sma2']) > x2, 0, data3['pos'])
data3['return'] = np.round(np.log(data3['buy'] / data3['buy'].shift(1)),5)
data3['st'] = data3['pos'].shift(1)*data3['return']
return -1*data3['st'].cumsum().apply(np.exp).tail(1)[0]
def constraints1(x):
return x[3] * x[2] - 0
def constraints2(x):
return x[3] - x[2] - 0
b = (0.0,1000000.0)
bonds = (b,b,b,b)
x0=[0.00205062, 0.19746918, 893, 1990]
print(objective(x0))
con1 = {'type':'ineq','fun':constraints1}
con2 = {'type':'ineq','fun':constraints2}
cons = [con1,con2]
sol = opt.minimize(objective, x0, bounds=bonds, constraints=cons)
print(sol)
解决方案
顺便说一句,在量化策略中使用 EWMA是正常的,因为它可以保留内存。如果您想要一个超快速 EWMA 解决方案,请参阅我关于计算快速 EWMA的其他答案
根据numba
示例,这应该会显着提高您的代码速度
import numpy as np
from numba import guvectorize
@guvectorize(['void(float64[:], intp[:], float64[:])'], '(n),()->(n)')
def move_mean(a, window_arr, out):
window_width = window_arr[0]
asum = 0.0
count = 0
for i in range(window_width):
asum += a[i]
count += 1
out[i] = asum / count
for i in range(window_width, len(a)):
asum += a[i] - a[i - window_width]
out[i] = asum / count
另一种选择是替换guvectorize
为jit
推荐阅读
- android - Kotlin Spinner OnItemSelected 意图
- javascript - 在提交表单时,我收到错误“方法不允许”-Javascript
- google-apps-script - 使用谷歌应用脚本在网络上发布谷歌演示文档
- javascript - 从 API 访问数据
- c# - 在 C# 中,TCP 服务器不会向客户端发送超过 1 个文件
- javascript - 如何循环遍历具有键和关联数组的对象并根据另一个数组中的值存在来过滤数组
- javascript - 如何将函数作为参数传递给其他函数以避免重复代码
- apache-spark - 如何使用 replaceWhere 子句实现以下火花行为
- c - 关于c中的数据对齐
- resize - Xamarin Forms 方向改变了视图大小在网格内没有改变