<jupyter_start><jupyter_text>Kolejny etap - zysk i ryzyko nie są sztywno ustalone tylko dane rozkładem Gaussa  Etap III - Zysk i ryzyko mają ruchome średnie, zależne od strategii inwestycyjnejStrategie inwestycyjne wpływają na podejście do ryzyka. Tutaj założymy trzy najprostsze:- Niewzruszona - Osiągnięte zyski i straty nie wpływają na strategię- Chciwa - Im większy zysk, tym większa skłonność do ryzyka- Bezpieczna - Im większy zysk tym mniejsza skłonność do ryzyka1. NiewzruszonaTake Profit posiada rozkład normalny, z wartością średnią - $\mu_{TP}$ i odchyleniem standardowym - $\sigma$. Stop Loss jest ustawiony zależnie od stosunku Zysku do Ryzyka (ZDR), tj. $\mu_{SL} = \frac{\mu_{TP}}{ZDR}$. Wartość odchylenia standardowego jest taka sama2. ChciwaTake<jupyter_code># Testujemy funkcję beta jako nowe źródło TP i SL
# SL/TP_shape(0,1,2,3)
# 1,2 - alpha, beta shape factors in beta distribution
# 3,4 - loc, scale constants in beta distribution
def inwest_beta(budget=370,margin = 140,SL_shape=(1,100,0,1),TP_shape=(1,20,0.1,1),ninwest=100):
    pierwsza = random.choices([-(random.betavariate(SL_shape[0], SL_shape[1])+SL_shape[2])*SL_shape[3]*margin,
                 (random.betavariate(TP_shape[0],TP_shape[1])+TP_shape[2])*TP_shape[3]*margin], k=ninwest)
    budget_inwest = [(0,budget)]
    ind=0
    for p in pierwsza:
        budget += p
        ind += 1
        new = tuple([int(ind),round(budget,2)])
        budget_inwest.append(new)
    binw_beta = np.array(budget_inwest)
    return binw_beta
curves = 10
df_inw_beta = pd.DataFrame(inwest_beta(),columns=["num","result_1"])
for i in range(1,curves):
    it = "result_"+str(i+1)
    inw_i = pd.DataFrame(inwest_beta(), columns=["num", it])
    df_inw_beta = pd.concat([df_inw_beta,inw_i[it]], axis=1)
for h in df_inw_beta.columns[1:]:
    plt.plot(df_inw_beta["num"],df_inw_beta[h], alpha= 1)
# W powyższych przykładach TP jest niezależny od SL, co zwykle nie mam miejsca.
# Uzależnienie TP od SL nastąpi dopiero po określeniu strategii inwestycyjnej.
x_beta = []
alpha = 12
beta = 12
moda = (alpha - 1) / (alpha + beta - 2)
for x in range(1000000):
    x_beta.append(random.betavariate(alpha,beta))
x_beta = pd.DataFrame(x_beta)
x_beta.describe(),print("Moda: {}".format(moda)),x_beta.hist(bins=100)
def integrand(a,b,x):
        B = 1 / special.beta(a,b)
        return B*(x**(a-1))*((1-x)**(b-1))
    
def integrand_norm(a,b,x):
    x_norm = np.linspace(0,1,1000)
    norm = integrate.simps(integrand(a,b,x_norm),x=x_norm)
    return np.array(integrand(a,b,x)/norm)

def frac(min=0,max=1,alpha=2,beta=2,num_pts=10000):
    x_linspace = np.linspace(min,max,num=num_pts)
    numerator = integrate.simps(integrand(alpha,beta,x=x_linspace),x=x_linspace)
    denominator = integrate.simps(integrand(alpha,beta,x=np.linspace(0,1,num=num_pts)),x=np.linspace(0,1,num=num_pts))
    return numerator/denominator
def frac_cumulative(min=0,max=1,alpha=2,beta=2,num_pts=100):
    x_lin = np.linspace(min,max,num=num_pts)
    result = [frac(0,f,alpha,beta) for f in x_lin]
    return np.array(result)
x_norm = np.linspace(0,1,1000)
norm = integrate.simps(integrand(12,12,x_norm),x=x_norm)
norm
x_linspace = np.linspace(0,1,100000000)
plt.plot(x_linspace, integrand(12,12,x_linspace))
#plt.plot(x_linspace,[2 for _ in x_linspace],color='r')
x_linspace = np.linspace(0,1,10000000)
nem = list(zip(x_linspace,integrand(12,12,x_linspace)))
nems = [j[0] for j in nem if abs(0.5-j[1])<0.000001]
nems
x_test = np.linspace(0,1,100000)
plt.plot(x_test,stats.beta.pdf(x_test,1,100,loc=0.05))
a = 80
b = 80
loc_test = 0
scale_test = 1
z = 0.99

interval = stats.beta.interval(z,a,b,loc=loc_test,scale=scale_test)
d_interv = interval[1] - interval[0]

x_test = np.linspace(0,(1+loc_test)*scale_test,100000)
y_test = stats.beta.pdf(x_test,a,b,loc=loc_test, scale=scale_test)
y_max = max(y_test)
z_min = interval[0]-0.05*d_interv
z_max = interval[1]+0.05*d_interv

plt.figure(figsize=(11.326,7))
plt.xlabel("Acceptable profit", size=19)
plt.ylabel("Probability density", size=19)
plt.xticks(size=15)
plt.yticks(size=15)
plt.plot(x_test, y_test)

plt.vlines(interval[0],0,y_max,color='r', linewidth=1.5)
plt.vlines(interval[1],0,y_max,color='r', linewidth=1.5)
plt.hlines(0.5*y_max,interval[0],interval[1],color='g',linewidth=1.5)
plt.axis([z_min,z_max,0,1.05*y_max])
plt.text(z_min+0.5*d_interv,0.52*y_max,"$\Delta = {:.3}$".format(d_interv), size=15)
1.618*7
# Get the intervals for a,b pairs for a,b:[2,1000]
def beta_intervals(cinv=0.999, step=1, num=10, start=2, loc=0, scale=1):
    result = []
    span = range(start,num+1,step)
    for a in span:
        for b in span:
            interval = stats.beta.interval(cinv,a,b,loc=loc,scale=scale)
            d_interv = interval[1] - interval[0]
            result.append(d_interv)
    result = np.array(result)
    return np.reshape(result, (len(span),len(span)))

beta_int = beta_intervals(num=1000)
plt.figure(figsize=(7,7))
fig, ax = plt.subplots()
ax = plt.contourf(beta_int, levels=10)
cbar = fig.colorbar(ax)
plt.title("Distribution intervals")
#plt.xscale("log")
#plt.yscale("log")<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.15767878077373973, 'fraction_numerical': 0.051191871824931616, 'mean_word_length': 5.3275648949320145, 'pattern_counts': {'":': 0, '<': 6, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 2, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '590306', 'license': 'MIT', 'n_tokens_mistral': 2329, 'n_tokens_neox': 2224, 'n_words': 379, 'path': 'Investing_strategy_modelling.ipynb', 'repo_name': 'Arghantyr/Investing_strategy_model', 'size': '5118'}