avatarJolie A. Doggett

Free AI web copilot to create summaries, insights and extended knowledge, download it at here

6469

Abstract

market dynamics. This is where feature engineering becomes invaluable. By transforming and synthesizing the raw data using established technical indicators, we can provide the model with enriched insights that could explain underlying market patterns and trends. Such enriched data can significantly improve the model’s ability to anticipate future price movements.</p><p id="07ea">For this forecast, we will utilize a couple of technical indicators for our feature engineering like RSI, MACD, Bollinger Bands, Parabolic SAR, and Stochastic Oscillator. Additionally, we introduce lag features to capture temporal dependencies, ensuring our model benefits from both current and historical contexts.</p><p id="f61d"><b>Let’s calculate the features we will utilize in this forecast</b></p><div id="d4ed"><pre><span class="hljs-comment"># Compute RSI</span> df[<span class="hljs-string">'momentum_rsi'</span>] = RSIIndicator(close=df[<span class="hljs-string">'Close'</span>]).rsi()

<span class="hljs-comment"># Compute MACD</span> macd = MACD(close=df[<span class="hljs-string">'Close'</span>]) df[<span class="hljs-string">'trend_macd'</span>] = macd.macd() df[<span class="hljs-string">'trend_macd_signal'</span>] = macd.macd_signal() df[<span class="hljs-string">'trend_macd_diff'</span>] = macd.macd_diff()

<span class="hljs-comment"># Compute Bollinger Bands</span> bollinger = BollingerBands(close=df[<span class="hljs-string">'Close'</span>]) df[<span class="hljs-string">'volatility_bbm'</span>] = bollinger.bollinger_mavg() df[<span class="hljs-string">'volatility_bbl'</span>] = bollinger.bollinger_lband() df[<span class="hljs-string">'volatility_bbh'</span>] = bollinger.bollinger_hband()

<span class="hljs-comment"># Compute Parabolic SAR</span> psar = PSARIndicator(high=df[<span class="hljs-string">'High'</span>], low=df[<span class="hljs-string">'Low'</span>], close=df[<span class="hljs-string">'Close'</span>]) <span class="hljs-comment"># Assuming you have 'High' and 'Low' columns in your df</span> df[<span class="hljs-string">'trend_psar'</span>] = psar.psar()

<span class="hljs-comment"># Compute Stochastic Oscillator</span> stochastic = StochasticOscillator(high=df[<span class="hljs-string">'High'</span>], low=df[<span class="hljs-string">'Low'</span>], close=df[<span class="hljs-string">'Close'</span>]) <span class="hljs-comment"># Assuming you have 'High' and 'Low' columns</span> df[<span class="hljs-string">'momentum_stoch'</span>] = stochastic.stoch() df[<span class="hljs-string">'momentum_stoch_signal'</span>] = stochastic.stoch_signal()

<span class="hljs-comment"># Create Lag Features</span> df[<span class="hljs-string">'Close_Lag1'</span>] = df[<span class="hljs-string">'Close'</span>].shift(<span class="hljs-number">1</span>)

<span class="hljs-comment"># Drop NaN values introduced due to lag features and indicators</span> df = df.dropna()

<span class="hljs-comment"># Define features and target</span> X = df[[<span class="hljs-string">'momentum_rsi'</span>, <span class="hljs-string">'trend_macd'</span>, <span class="hljs-string">'trend_macd_signal'</span>, <span class="hljs-string">'trend_macd_diff'</span>, <span class="hljs-string">'volatility_bbm'</span>, <span class="hljs-string">'volatility_bbl'</span>, <span class="hljs-string">'volatility_bbh'</span>, <span class="hljs-string">'trend_psar'</span>, <span class="hljs-string">'momentum_stoch'</span>, <span class="hljs-string">'momentum_stoch_signal'</span>, <span class="hljs-string">'Close_Lag1'</span>]] y = df[<span class="hljs-string">'Close'</span>]</pre></div><p id="712f">The above code is organizing the dataset <code>df</code> into input features and a target variable for our model. The input features, captured under <code>X</code>, consist of various the features we calculated on and previously defined. The target variable, denoted by <code>y</code>, is the <code>Close</code> column, representing the daily closing price of EUR/USD, which our model aims to predict based on the provided features.</p><p id="bdfb"><b>Model Initialization and Training</b></p><div id="a7d2"><pre><span class="hljs-comment"># Initialize the model</span> model = xgb.XGBRegressor( learning_rate=<span class="hljs-number">0.75</span>, n_estimators=<span class="hljs-number">200</span>, max_depth=<span class="hljs-number">5</span>, subsample=<span class="hljs-number">0.9</span>, colsample_bytree=<span class="hljs-number">0.8</span>, colsample_bylevel=<span class="hljs-number">0.8</span>, gamma=<span class="hljs-number">0</span>, min_child_weight=<span class="hljs-number">1</span> )

<span class="hljs-comment"># Train the model</span> model.fit(X_train, y_train)</pre></div><p id="7ce9">Continuing from the previously discussed data preparation, this section of code dives into the model initialization and training phases using XGBoost. The <code>xgb.XGBRegressor()</code> initializes a regression model with specified hyperparameters to optimize the forecast. Key parameters include a learning rate of <code>0.75</code>, which determines the step size at each iteration while optimizing, <code>200</code> estimators or trees, and a maximum depth of <code>5</code> for each tree, among others. These hyperparameters play a role in controlling the model’s complexity and fit to the data.</p><p id="4e91">After initializing, the model is trained on the <code>X_train</code> and <code>y_train</code> datasets using the <code>fit</code> method. This step allows the model to learn the underlying patterns from the training data, preparing it to make future predictions on unseen data.</p><p id="95cf"><b>Performance Evaluation and Testing</b></p><div id="a823"><pre><span class="hljs-comment"># Predict on the test set</span> y_pred = model.predict(X_test)

<span class="hljs-comment"># Calculate performance metrics</span> mae = mean_absolute_error(y_test, y_pred) mse = mean_squared_error(y_test, y_pred) rmse = np.sqrt(mse)

<span class="hljs-built_in">print</span>(<span class="hljs-string">f"Mean Absolute Error: <span class="hljs-subst">{mae}</span>"</span>) <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Mean Squared Error: <span class="hljs-subst">{mse}</span>"</span>) <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Root Mean Squared Error: <span class="hljs-subst">{rmse}</span>"</span>)

y_train_pred = model.predict(X_train)</pre></div><p id="8c56">After training the

Options

model on the historical data we evaluate its performance on unseen or test data. Using the <code>predict</code> method of the trained model, predictions (<code>y_pred</code>) are generated for the test dataset <code>X_test</code>. Subsequently, to assess the accuracy and reliability of these predictions, various performance metrics are computed:</p><ul><li><b>The Mean Absolute Error (MAE)</b> provides an average magnitude of errors between predicted and actual values.</li><li><b>The Mean Squared Error (MSE) </b>squares these errors to emphasize larger discrepancies.</li><li><b>Root Mean Squared Error (RMSE) </b>is the square root of MSE, providing error in the same units as the original data.</li></ul><p id="c92b">These metrics are then printed for clear visibility. We concludes by also predicting on the training set (<code>X_train</code>) with <code>y_train_pred</code>, to further analyze and compare the model’s performance on both training and test datasets.</p><p id="44c0">The following output displays the performance metricswhich assess the accuracy of our model’s predictions:</p><div id="6743"><pre><span class="hljs-attribute">Mean</span> Absolute Error: <span class="hljs-number">0</span>.<span class="hljs-number">009141215039947168</span> <span class="hljs-attribute">Mean</span> Squared Error: <span class="hljs-number">0</span>.<span class="hljs-number">000303615460154008</span> <span class="hljs-attribute">Root</span> Mean Squared Error: <span class="hljs-number">0</span>.<span class="hljs-number">017424564848340058</span></pre></div><ul><li><b>Mean Absolute Error (MAE): </b>At 0.0091, it shows the model’s average absolute deviation from the actual values.</li><li><b>Mean Squared Error (MSE):</b> With a value of 0.0003036, it indicates the average squared error, emphasizing larger mistakes.</li><li><b>Root Mean Squared Error (RMSE):</b> At 0.0174, it provides the average error in the original unit, illustrating the typical magnitude of error.</li></ul><p id="7500">The relatively low values across these metrics suggest that the model has a good degree of accuracy in its predictions. The model appears to be reliably forecasting the target variable, depicted with minimal deviations in the forecasted data when compared to the actual data.</p><p id="be3b"><b>Data Visualization</b></p><div id="2b49"><pre><span class="hljs-comment"># Create a new DataFrame for visualization</span> viz_df = pd.DataFrame({<span class="hljs-string">'True'</span>: y_test, <span class="hljs-string">'Predicted'</span>: y_pred})

<span class="hljs-comment"># Concatenate the training data for a complete view</span> viz_df_train = pd.DataFrame({<span class="hljs-string">'True'</span>: y_train, <span class="hljs-string">'Predicted'</span>: y_train_pred}) viz_df = pd.concat([viz_df_train, viz_df])

<span class="hljs-comment"># Plot the results</span> plt.figure(figsize=(<span class="hljs-number">14</span>, <span class="hljs-number">7</span>)) plt.plot(viz_df[<span class="hljs-string">'True'</span>], label=<span class="hljs-string">'True'</span>, color=<span class="hljs-string">'blue'</span>) plt.plot(viz_df[<span class="hljs-string">'Predicted'</span>], label=<span class="hljs-string">'Predicted'</span>, color=<span class="hljs-string">'red'</span>, alpha=<span class="hljs-number">0.7</span>) plt.title(<span class="hljs-string">'EUR/USD Forecast: True vs Predicted'</span>) plt.legend() plt.grid(<span class="hljs-literal">True</span>) plt.show()</pre></div><figure id="ce5c"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*cLlTTCFRMZqUBQIUBeya0g.png"><figcaption></figcaption></figure><p id="62e5">The visual representation of the EUR/USD currency pair’s forecasted versus actual values offers an insightful glimpse into the model’s capabilities. The close alignment between the blue <code>True</code> line and the red <code>Predicted</code> line for most of the chart affirms the model’s strong predictive proficiency, especially given the low Mean Absolute Error (MAE) of 0.0091. The few areas where deviations occur resonate with the Root Mean Squared Error (RMSE) of 0.0174, indicating the average magnitude of error.</p><p id="ba85">Notably, the small segment towards the right end, where predictions seem to diverge slightly, underscores the challenges of exact currency forecasting. Nevertheless, the model, as depicted in the graph and corroborated by the performance metrics, has shown remarkable accuracy in capturing the nuances of the EUR/USD exchange rate’s movements.</p><h1 id="fe27">Conclusion</h1><p id="3036">In conclusion, this exploration into Forex forecasting has underscored the critical interplay between data preprocessing, feature engineering, and model selection. Through this model we found that XGBoost in predicting the EUR/USD currency pair stands out, demonstrating the algorithm’s robustness and adaptability. Finally, the precision showcased by our model reinforces XGBoost’s reputation as an efficient tool to forecast financial data.</p><p id="0141">Read more of my stories here:</p><div id="c60c" class="link-block"> <a href="https://algocraft.xyz/eur-usd-forecasting-simplified-an-lstm-users-guide-337ccdda6158"> <div> <div> <h2>EUR/USD Forecasting Simplified: an LSTM User’s Guide</h2> <div><h3>LSTM, or Long Short-Term Memory, is a specialized type of Recurrent Neural Network (RNN) designed to recognize patterns…</h3></div> <div><p>algocraft.xyz</p></div> </div> <div> <div style="background-image: url(https://miro.readmedium.com/v2/resize:fit:320/1*EUIE-cUkt3x2AqBX5nUotA.jpeg)"></div> </div> </div> </a> </div><div id="a6a6" class="link-block"> <a href="https://algocraft.xyz/how-to-get-131-return-with-mean-reversion-trading-strategy-from-stock-selection-to-backtesting-c623870adf31"> <div> <div> <h2>How to Get a 131% Return with Mean Reversion Trading Strategy: From Stock Selection to Backtesting</h2> <div><h3>undefined</h3></div> <div><p>undefined</p></div> </div> <div> <div style="background-image: url(https://miro.readmedium.com/v2/resize:fit:320/0*o95y-D4ETf1Geqx3)"></div> </div> </div> </a> </div></article></body>

How to Beat Writer’s Block and Press ‘Publish’

Seven tips and tricks to overcome writer’s block and put your story out there

Have you ever felt like words were stuck in your brain? We may be able to help. Photo: Getty Images

For a recording of our Creator Workshop, “7 Great Ideas for Your Next Story: How to Beat Writer’s Block and Press Publish,” head here.

What is writer’s block?

Have you ever felt creatively constipated, like words were sitting on the edge of your brain but wouldn’t come out? Do you start to panic when you put pen to paper or when you open a new Word document, feeling overly anxious about saying the right thing in the right way? Or worse, do you feel like you have nothing to say at all? Like your brain is completely empty, thoughtless, bored, and uninspired?

Then congratulations! You know what writer’s block feels like.

Relatable.

The term “writer’s block” was coined in the 1940s by a psychiatrist named Edmund Bergler who was studying writers who suffered from “neurotic inhibitions of their productivity.” He realized that they weren’t lazy or even lacking ideas; they were anxious. They were literally psyching themselves out of the act of writing.

If you’ve felt the same way, fret not! You can overcome your anxiety if you remember the following seven simple things:

1. Be yourself

One of the biggest ways writers psych themselves out is by comparing their writing to someone else’s. It’s cool to admire other people’s work and even want to emulate their success. However, if you’re trying too hard to be like someone else, you forget what your voice sounds like, and you get stuck. Authenticity is key.

2. Eliminate distractions

Another source of writing anxiety is our own inner critic. We tell ourselves that what we’ve written sounds stupid or that we shouldn’t even bother writing because it will sound stupid. Silence that inner critic by finding a quiet place to write. Or play some music without lyrics to drown out your inner critic while still leaving space for your own words.

3. Switch it up

Maybe you’ve put words on paper but none of them seem to make any sense to you. Editing is your best friend! Try rearranging your paragraphs or stanzas or lines to see if they flow better. Or even delete some parts. Don’t get too attached to a sentence, a paragraph, or even an idea—which brings me to my next piece of advice…

4. Don’t force it

If it isn’t flowing, don’t force it. Sometimes you may be having a hard time writing because you’re not really passionate or clear about the point you’re trying to make. It’s okay to change your mind and change your topic to something that flows a little better.

5. Remember your North Star

As an editor, I often tell writers that if they get lost in their writing to remember their North Star. Always keep in mind the point you’re trying to make, who you’re writing for, what they already know, and what they need to know. Beyond that, remember your reason for writing at all, whether it’s to express yourself, to teach people something, or just for fun.

6. Don’t write

Sometimes the best way to get over writer’s block is to take a break. Our brains need rest days sometimes. Step away from the computer before you throw it through a wall and do something else. Inspiration can strike at the most random of times. Maybe if you do some mundane tasks and allow your brain to get empty for a while, there will be more room in there for new ideas.

7. Relax

If you write something that isn’t so great, it’s not the end of the world. Sometimes your piece will knock it out of the park and go viral and get all the engagement you want. Sometimes it won’t. But it’s all good because you wrote something, and you should be proud of that! Also, just because you don’t think something is good doesn’t mean it’s bad. Keep writing; practice makes perfect.

Let’s get to writing!

Ways to get going

If you’re ready to start flexing your writing muscle, I’ve come up with some exercises you can do to get loose, get the words flowing, and get some drafts started.

Exercise 1: One word

Think of a word and start a brain dump of things that word makes you think about. It doesn’t have to have a rhyme or reason, it’s just to get the gears in your mind grinding and your imagination activated. Take a look at the following words: pain… freedom… beauty… peace… health. What do they make you think of? There’s no right or wrong way to do this. Don’t think too hard, and don’t be too hard on yourself. Just let it flow!

Exercise 2: Picture perfect

Similar to the previous exercise, take a look at the world around you. What do you see, and what does that evoke in your mind? Remember, inspiration can strike anywhere at any time. Take a look at the image below and see where your most random thoughts take you.

Photo: Getty Images

Exercise 3: Write about yourself

Sometimes a prompt can help you get started. We at Medium publish creative writing prompts every Monday through Write Here, a new writer community on Creators Hub.

A good place to start when prompting yourself to write is to write about, well, yourself. Finish this sentence: “I’m here because _____.” Then write another sentence after that. Tell your readers about your journey, whether that be a journey in your car or a journey through life.

Exercise 4: Conflicting thoughts

The best source of writing sometimes is someone else’s work. Someone may share an opinion we don’t necessarily agree with, or we may find ourselves feeling seen by another’s person’s writing and feeling called to respond with our own perspective.

Write a response to the following sentence: “Hard work and discipline are the only ways to be successful.” Do you agree or disagree? How has that sentiment shown up in your own life? Let it out.

Exercise 5: Who’s the expert?

When you’re first starting to break out of a writing slump, it’s helpful to write about things you care about. Think about your passions, the things you know like the back of your hand. It can be a TV show, a book, a recipe, quantum physics, whatever! Take a moment to share your expertise with the world.

Exercise 6: Write a letter

Letter-writing is a fun and easy way to practice writing in your own voice and to practice writing to a specific audience. Write a letter to yourself, a friend, or a celebrity who recently pissed you off. What do they need to hear and how do you want to say it?

Exercise 7: Finish a draft

Maybe by now you’re ready to go back to a story you’ve already started. Remember: Editing is your friend. Try switching your first paragraph to your conclusion. Maybe insert a personal anecdote (like the one you practiced earlier) in your introduction. Remember your reason for writing and see if you can take your draft to another level.

If you’re looking for more prompts to light that creative spark, be sure to check out Write Here, a new Medium community for weekly writing prompts. Happy writing!

Jolie A. Doggett is a senior editor of multicultural content at Medium and a senior editor for ZORA, a Medium publication for, by, and about women of color. She is also the creator and editor of Write Here, a Medium community for writers.

Unblocked21
Writehere
Writing Tips
Writing Prompts
Recommended from ReadMedium