コード例 #1
0
def trainModelGMM(X, lengths, states, num_gaus):

    model = GMMHMM(n_components=states, n_mix=num_gaus,n_iter=1000,verbose=True).fit(X,lengths)

    print('Mixture Models + HMM')
    print(model.predict(X))
    print(model.monitor_.converged)
    print(model.monitor_)
    print(model.score(X, lengths))
コード例 #2
0
ファイル: rul_pred.py プロジェクト: VenkateshMohan3434/hmm
def hmm_train(features):

    gmmhmm = GMMHMM(n_components=30, n_mix=8)
    gmmhmm.startprob_ = np.array([
        1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0
    ])
    l = np.identity(30) * 0.95
    for i in range(l.shape[0] - 1):
        l[i, i + 1] = 0.05
    l[-1, -1] = 1
    gmmhmm.transmat_ = l
    gmmhmm.fit(features)
    preds = gmmhmm.predict(features)
    print(preds)
コード例 #3
0
# Data Acquisition

X = np.column_stack([[0.1, 0.2, 0.3, 0.1], [0.3, 0.4, 0.7, 0.1],
                     [0.1, 0.2, 0.3, 0.5], [0.5, 0.6, 0.3, 0.5],
                     [0.1, 0.3, 0.3, 0.3]])

###############################################################################
# Run Gaussian HMM
print("fitting to HMM and decoding ...", end="")

# Make an HMM instance and execute fit
model = GMMHMM(n_components=4, n_mix=4, covariance_type="diag",
               n_iter=1000).fit(X)

# Predict the optimal sequence of internal hidden state
hidden_states = model.predict(X)
print(hidden_states)
print("done")

###############################################################################
# Print trained parameters and plot
print("Transition matrix")
print(model.transmat_)
print()

print("Means and vars of each hidden state")
for i in range(model.n_components):
    print("{0}th hidden state".format(i))
    print("mean = ", model.means_[i])
    print("var = ", np.diag(model.covars_[i]))
    print()
コード例 #4
0
def getTMHS(X):
    model = GMMHMM(n_components=3, covariance_type="diag", n_iter=1000).fit(X)
    hidden_states = model.predict(X)
    transmat = model.transmat_
    return hidden_states, transmat
コード例 #5
0
class HiddenMarkovModel(BaseModel):
    def __init__(self):

        # Create some assets:
        assetsList = [
            Asset('WS30', 'traditional', 'historical'),  # Index US
            Asset('XAUUSD', 'traditional', 'historical'),  # Commodity
            Asset('GDAXIm', 'traditional', 'historical'),  # Index EUR
            Asset('EURUSD', 'traditional', 'historical'),  # Major
            Asset('GBPJPY', 'traditional', 'historical')
        ]  # Minor

        # Initialize the ResearchStudy class:
        super().__init__('HiddenMarkovModel', assetsList)

        # Make a random seed to reproduce results:
        np.random.seed(33)

        # Print to see if working:
        #logger.warning(self.PORTFOLIO._portfolioDict['WS30'])

    def _defineModelParameters(self):

        # Define the model:
        #self.model = GaussianHMM(n_components=2,
        #                         covariance_type="full",
        #                         n_iter=200,
        #                         verbose=True)
        self.model = GMMHMM(n_components=2,
                            covariance_type="full",
                            n_iter=20,
                            verbose=True)

    def _monitorConvergence(self):

        # Print:
        logger.warning(f"Model Converged: {self.model.monitor_.converged}")

    def _monitorHistory(self):

        # Print:
        logger.warning(f"Model History: {self.model.monitor_.history}")

    def _fitTheModel(self, saveDirectory):

        # Loop the portfolio dict:
        for eachAssetName, eachAssetDataFrame in self.PORTFOLIO._portfolioDict.items(
        ):

            # Re-initialize the parameters:
            self._defineModelParameters()

            # Fit the model:
            # Get the returns into a 2D array > Actually, it is (X,) > We should conver to (X,1)
            RETURNS_RESHAPED = np.column_stack([eachAssetDataFrame["Returns"]])
            self.model.fit(RETURNS_RESHAPED)
            logger.warning(
                f"Model Score for asset <{eachAssetName}>: {self.model.score(RETURNS_RESHAPED)}"
            )

            # Check convergence and history:
            self._monitorConvergence()
            self._monitorHistory()

            # Predict the hidden states based on the returns:
            HIDDEN_STATES = self.model.predict(RETURNS_RESHAPED)
            #logger.warning(HIDDEN_STATES)

            # Save the model:
            if saveDirectory:
                self._saveModel(assetModelName=eachAssetName,
                                saveDirectory=saveDirectory)

            # Create the new column in the dataframe:
            eachAssetDataFrame['HiddenStates'] = HIDDEN_STATES

    def _saveDataFrames(self, saveDirectory):

        # Save each dataframe:
        for eachAssetName, eachAssetDataFrame in self.PORTFOLIO._portfolioDict.items(
        ):

            logger.warning(
                f'[{self._saveDataFrames.__name__}] - Looping for asset <{eachAssetName}>...'
            )
            eachAssetDataFrame.to_csv(saveDirectory +
                                      f'/{eachAssetName}_DF.csv')

    def _saveModel(self, assetModelName, saveDirectory):

        # Save the model:
        with open(saveDirectory + f'/HMM_{assetModelName}.pickle',
                  'wb') as pickle_file:
            pickle.dump(self.model, pickle_file)

    def _loadModel(self, assetModelName, loadDirectory):

        # Load the model:
        with open(loadDirectory + f'/HMM_{assetModelName}.pickle',
                  'rb') as pickle_file:
            self.model = pickle.load(pickle_file)

    def _plotModelOutput(self, saveDirectory='', showIt=False):

        # Plot:
        for eachAssetName, eachAssetDataFrame in self.PORTFOLIO._portfolioDict.items(
        ):

            logger.warning(
                f'[{self._plotModelOutput.__name__}] - Looping for asset <{eachAssetName}>...'
            )

            # We will just get part of the dataframe for the plot:
            eachAssetDataFrame_Little = eachAssetDataFrame[:200].copy()
            eachAssetDataFrame_Little['date'] = range(
                1,
                len(eachAssetDataFrame_Little) + 1)

            # Create the figure:
            f1, ax = plt.subplots(3, figsize=(10, 5))

            # Create the colormap:
            colormap = cm.get_cmap('rainbow')

            # Create the plots:
            ax[0].scatter(eachAssetDataFrame_Little.date,
                          eachAssetDataFrame_Little.close,
                          c=eachAssetDataFrame_Little.HiddenStates,
                          cmap=colormap,
                          label='Hidden States',
                          s=80)
            ax[0].set_xlabel('Hidden States',
                             horizontalalignment='center',
                             verticalalignment='center',
                             fontsize=12,
                             labelpad=20)
            ax[0].set_ylabel('Observations',
                             horizontalalignment='center',
                             verticalalignment='center',
                             fontsize=12,
                             labelpad=20)
            ax[0].legend(loc='best')

            ax[1].plot(eachAssetDataFrame_Little.date,
                       eachAssetDataFrame_Little.close,
                       label='Close Price')
            ax[1].set_xlabel('Observations',
                             horizontalalignment='center',
                             verticalalignment='center',
                             fontsize=12,
                             labelpad=20)
            ax[1].set_ylabel('Close Price',
                             horizontalalignment='center',
                             verticalalignment='center',
                             fontsize=12,
                             labelpad=20)
            ax[1].legend(loc='best')

            ax[2].plot(eachAssetDataFrame_Little.date,
                       eachAssetDataFrame_Little.Returns,
                       label='Returns')
            ax[2].set_xlabel('Observations',
                             horizontalalignment='center',
                             verticalalignment='center',
                             fontsize=12,
                             labelpad=20)
            ax[2].set_ylabel('Returns',
                             horizontalalignment='center',
                             verticalalignment='center',
                             fontsize=12,
                             labelpad=20)
            ax[2].legend(loc='best')

            plt.grid(linestyle='dotted')
            plt.subplots_adjust(left=0.09,
                                bottom=0.20,
                                right=0.94,
                                top=0.90,
                                wspace=0.2,
                                hspace=0)
            f1.canvas.set_window_title(
                f'Hidden Markov Model + more data plot for asset <{eachAssetName}>'
            )
            #f1.tight_layout()

            # In PNG:
            plt.savefig(saveDirectory + f'/HMM_{eachAssetName}.png')

            # Show it:
            if showIt:
                plt.show()