Как сделать следующий код более устойчивым по отношению к периоду в Python? - PullRequest
0 голосов
/ 22 октября 2018

Ради интереса я написал код, который имитирует какой-то действительно базовый сценарий фондового рынка для класса.Хотя фондовый рынок действительно непредсказуем, как будет выглядеть вторая и первая производная, когда кто-то захочет купить или продать.Это не настоящая цель, это всего лишь воображаемый эксперимент по улучшению моих навыков.

Проблема в том, что способ выбора координат х для предположения, где производная может быть = 0, использует произвольные целые числа, а не на основепериод уравнения фондового рынка (или период производной).Например, я говорю, попробуйте х = 1,2,3,4 и т. Д.но производная акции может пересекать 0 несколько раз между 0-1,1-2,2-3,3-4,

Как я могу улучшить "x2 = arange (0, xmax, 1)" /"для х в х2:" / "думаю = х2 [х]", чтобы сделать более обобщенный случай?Цель состоит в том, чтобы иметь возможность подать этот код любому циклическому уравнению и найти истинное время покупки и продажи.

from sympy import *
x_sym=symbols('x')
init_printing(use_unicode=True)
y_sym_stock = cos(x)**sin(x_sym)+sin(x_sym)**2+sin(x_sym)**3+10
y_sym_deriv = diff(y_sym_stock,x_sym,1)
#the derivatives has been found as an equation of symbols and needs to be converted to functions
y_deriv = lambdify(x_sym, y_sym_deriv) 
y_stock = lambdify(x_sym,y_sym_stock)

import matplotlib.pyplot
from matplotlib.pyplot import *
figure()
xmax = 20
x1=arange(0,xmax,0.1)
zero=0*x1
stock=y_stock(x1)
deriv=y_deriv(x1)
xlim(0,xmax)
ylim(-3,15)
xlabel('Days')
ylabel('Stock Price ($)')
plot(x1,deriv, c='r', label='Derivative')
plot(x1,stock, c='b', label='Stock Market')
plot(x1,zero, c='black')
fill_between(x1,deriv,0,where=deriv>0, facecolor='green')
fill_between(x1,deriv,0,where=deriv<0, facecolor='red')
legend(['Derivative','Stock Market'],loc='best')
title ('Stock Price & Derivative') 
show()

from scipy.optimize import fsolve
y_sym_2deriv = diff(y_sym_stock,x_sym,2)
y_2deriv = lambdify(x_sym, y_sym_2deriv) 
buys = set()
sells = set()
x2=arange(0,xmax,1)
for x in x2:
   guess = x2[x]
   soln = fsolve(y_deriv, guess)
   if y_2deriv(soln) > 0 and soln >= 0 and numpy.round(y_deriv(soln)) == 0 and soln <= xmax:
       buys.add(round(soln[0],2))
for x in x2:
   guess = x2[x]
   soln = fsolve(y_deriv, guess)
   if y_2deriv(soln) < 0 and soln > min(buys) and numpy.round(y_deriv(soln)) == 0 and soln <= xmax:
       sells.add(round(soln[0],2))

print('Buy at the following times:',sorted(buys))
print('Sell at the following times:',sorted(sells))

enter image description here

Покупать по следующемувремена: [4.71, 11.0, 17.28]

Продавать в следующие времена: [7.85, 14.14]

...