Estimation loi stable (mc kulloch) pour un dll pour excel

Soyez le premier à donner votre avis sur cette source.

Vue 13 168 fois - Téléchargée 889 fois

Description

IL s'agit donc d'un code permettant d'estimer une loi qui généralise la loi normale et permet de tenir compte de l'assymétrie, queu de distribution épaisse,...
Le code est conçue de manière a être compilé pour créer un dll pour excel (*.def), le dll et la .xla sont fournit dans le zip prés à l'emploi.
on retrouve l'estimation des 4 paramétres de cette loi: l'équivalent de la moyenne m, de l'écart type s , du coefficient d'asymétrie b et du paramétre de valeur extréme a.
Pour le cas multivarié: la codifférence, la covariation et l'alpha corrélation ainsi que le coefficient regressions linéaire
Un générateur de nombre aléatoir suivant une loi stable a aussi été implémenté à partir de MersenneTwister.
Le fichier texte VBA (*.xla) contient le code source pour "charger" le dll sous excel (il faut modifier l'adresse du dll ex c:\ ) Il suffit de le référencer dans excel et VBA.
Un pdf présente rapidement les lois stable (généralisation en terme de distribution de la loi normale: extension du théorême centrale limite)

Conclusion :


Le code VBA présente une petite singularité, étant donné les difficulté de fair passer un tableau de VBA à un Dll, je n'en passe qu'un à chaque fois. C'est à dire que pour deux série dont l'on veut mesurer la codifférence et qui sont de longueur N, je dimensionne dans VBA un tableau de longeur 2*N avec 0,N-1 la premiere série et en N,2*N la deuxiéme. Le Dll se débrouille tous seul après.
Dernière singularité mais statistique, le calcul du paramétress alpha d'un vecteur stable étant particulièrement "inefficace" dans la littérature (il s'oppose à tous process d'industrialisation, peu fiable en plus,...) j'ai obté pour une simple moyenne pondéré des lpah des séries.

J'ai aussi rajouté un petit fichier texte permettant de "pricer" une option sur un actif suivant une loi log stable de Mac Cullought pour Gauss. Désolé j'ai pas trop le temps de l'implémenter: si cela branche quelqu'un...

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
21
Date d'inscription
jeudi 8 avril 2004
Statut
Membre
Dernière intervention
15 septembre 2009

LPELE, bien écoute tout dépend de ce que tu veux faire. D'après ton lien la loi de Lévy ne prend en compte que moyenne (ou paramètre de localisation) supérieure à 0 ce qui est assez limitatif. J'aurais donc tendance à préférer la loi alpha stable moins contraignante.
Comme çà, apres avoir lu la page wiki rapidement je suis pas emballer par les processus de Levy sa m'a l'air du sous alpha stable contraint (c'est un cas particulier). Je ne connais pas par contre les méthodes d'estimation des processus de Levy, peut être sont ils plus performants (j'ai des doutes).
Personnellement, je resterais sur les lois alpha stable qui sont une généralisation des processus de Lévy.
Messages postés
8
Date d'inscription
vendredi 19 février 2010
Statut
Membre
Dernière intervention
17 mars 2018

Hitcher, c'est pas mal ton code, je cherchais justement un .
un générateur de nombres pseudo-aléatoire qui suit la loi stable pour faire du Monte-Carlo.

Penses tu que ton algorithme est plus performant que celui se trouvant sur http://en.wikipedia.org/wiki/Lévy_distribution
(il transforme un générateur de nombre aléatoire qui suit la loi uniforme- ce que j'ai déjà- en générateur suivant la loi de Lévy, cas particulier de la loi stable)
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Ben voila c'est deja fini et va impec.
Si prob tu postes ton mail et je t'envoie le proj et le xls.

Fichier CPP de SortXls.dll, je compile en mode C (non C++).

#include <windows.h>

int WINAPI DllMain(HINSTANCE hinst, unsigned long reason, void* x)
{
return 1;
}

int dblComp(const void *arg1, const void *arg2)
{
if(*(double*)arg1 > *(double*)arg2) return 1;
if(*(double*)arg1 < *(double*)arg2) return -1;
return 0;
}

// ICI LA FONCTION EXPORTEE, tableau double a trier croissant
// pas trouve plus court comme exemple
void __stdcall bnSortDbl(double *pdbl, int n)
{
if(n < 2) return;
qsort(pdbl, n, sizeof(double), dblComp);
}

----------------------------
Fichier SortXls.def

LIBRARY SortXls
EXPORTS
bnSortDbl @1

----------------------------
Module VB a inserer dans un Excel:

Option Explicit

Declare Sub bnSortDbl Lib "D:\SortXls.dll" (pArray As Double, ByVal nElem As Long)

Sub Test()
Dim dArray(8) As Double, i As Long
dArray(7) = 1.25
dArray(6) = 5.25
dArray(5) = 6.25
dArray(4) = 4.25
dArray(3) = 2.25
dArray(2) = 3.25
dArray(1) = 7.25
dArray(0) = 8.25
bnSortDbl dArray(0), 8
For i = 0 To 7
Debug.Print dArray(i)
Next i
End Sub
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Je vais essayer de trouver un moment pour te faire une dll appelee depuis Excel avec fonction prenant *double et int en params.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
pour obtenir *ptrTab en param dans ta DLL, tu passes bien tab(0) en byref depuis vb ?

Vois que les questions se posent dans le forum, une source doit etre un exemple FONCTIONNANT.
Si pas de maj de la source dans la soiree, je me verrai contraint d'enlever.

ciao...
BruNews, Admin CS, MVP Visual C++

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.