A Not So Simple GOOG Chart


What I am about to post is a simple $GOOG chart created by a python script that I grabbed off Trainee Trader’s site.  While creating a line chart of GOOGs stock price is really basic finance, it does represent something very important to me.  It means that I’m learning and troubleshooting python at a fast pace.

I just started learning python about a week ago with absolutely no knowledge in programming (except for Frotran 77 a long time ago), but I am armed with an engineer’s logic and enthusiam. I’ve worked on about 15 exercises in a training course I’m taking, and have read up on all the neat things python can do.   I installed python 2.6, matplotlib, and the ystockquote module from Cory Golberg on my development machine and configured the correct paths.  Then I then tried to copy and paste TTs google chart python script to see if I could recreate his chart.  I typed it verbatim and fired it up in python hoping to see the chart!

Instead of seeing a nice GOOG chart, it crashed on me!!! Yep, it failed and I had no idea what the error messages were telling me.

Fast forward one week and I’m picking up this language quick.  So I took TTs code again, checked out the  documentation  for the matplotlib module, troubleshot it, and got the damn thing to plot!  Go me!

Of course a sophisticated programmer would laugh at my silly plot, but to me it’s awesomeness.

Update: Here’s the revised python script (txt): GOOGChart2.txt


RCOMM 2010 – First Rapidminer Conference!


Hi all!

I’m almost back!  I’m easing my way back into posting again as work somewhat quiets down.  Thank you so much for your emails and comments while I was away.  I’m still terribly busy with engineering work but I promise I’ll try to answer all your questions and comments over the course of the next week.

On a side and exciting note, I will be giving a talk at the very first Rapidminer Conference 2010 in Germany this September!  The RM Team have put up a tentative schedule at www.rcomm2010.org and its looking to be 4 exciting days of training, talks, and workshops about our favorite, and powerful, open source data modeling suite.

I hope my readers can make it there between September 13th and 16th!  It would be nice to meet you and finally meet the RM team! I hope that my liver doesn’t give out when I there! =)


Parameter Optimization in Rapidminer 5.0


In several of my video tutorials I assign different parameters for my learning model on the fly.” Of course the question any astute reader/viewer should ask is, why did you choose those parameters instead of another combination?”

That’s a great question and the answer is, well I just choose those parameters to illustrate my point for the video.” While this answer is not at all satisfying to the astute reader/viewer, it does lead us to ask the most important question of all, what are the right parameters to choose?”

This can be  answered very well if you were to use Rapidminer’s Parameter Optimization operator in your initial data discovery phase. This operator allows you to choose some or all of the parameters in your experiment and iterate different values for them to meet some specific requirement on your part (i.e. performance).

For example, if you were using the Neural Net operator and didn’t know what to set your learning and momentum parameters to, to get the best classification accuracy, you would use the Parameter Optimization operator to interate different combinations of those parameters to find the best accuracy.

Once the Parameter  Optimization  operator determines those values, you can input  them into your experiment and truly optimize your model for performance! See below for an actual output from a parameter  optimization  model I’m working on. You can see that Rapidminer indicated that momentum of 0.3 and a learning rate of 0.6 was the best parameter settings to maximize the accuracy rate and minimize the classification error.

While is operator is a fantastic feature (they got evolutionary optimizers too!) for us data modelers, its a massive computer resource suck.  I would advise anyone using this operator to have a very powerful server or computer, with oodles of memory, to run your iterations.


FYI, I plan on going over a short parameter optimization example in upcoming webinar.

–> ]]>

Tweeting Sentiment



I finally got my hands on some Twitter data from my collaborative partner and began the process of text mining it. The creation of the Rapidminer model and then its  subsequent execution took all of 10 minutes. That’s the beauty of the Rapidminer system, you can build templates and have processes ready to go! Just add data!

But adding the data is usually the hardest and most time consuming part of text mining, especially getting the right data in the right format! Since we’re working on a proof of concept model for now, my collaborative partner had to crawl Twitter, parse the tweets, and then hand classify 1,500 Twitter posts into Positive, Neutral, and Negative labels! Whew!

Once I got the data I built a 10 fold cross validation model to process train and test the sentiment in Tweets for accuracy. Then I identified the most strongly correlated words to sentiment classification. Our results are definitely promising, we achieved a near 80% classification accuracy and nailed all the correlated words. There were some issues with missclassification of positive sentiment as negative and vice versa which we have to work on but overall this is a great start.

We now know how to fine tune the process/data, and hopefully squeeze out more accuracy between parameter optimization and better crawled data.

Now its back to civil engineering for a while, unless you guys want to hire me full time. 🙂


Draft Presentation Done – Germany Awaits


I’m done with my draft presentation for RCOMM 2010 and hopefully will wrap it up over the weekend and then its to Germany in two weeks.  Its hard to believe but RCOMM 2010 will soon be a reality.  I’m looking forward to meeting the rest of the Rapid-I team and networking with some great minds.

Once I return from Germany I will post three new video tutorials and some Rapid-I goodies for my loyal readers.  One of those videos will be about parameter optimization for sure!

Thanks for sticking with me through my hiatus,  I’m very appreciative of your  understanding!


SEO Tutorials

I’m in the process of merging and updating old posts with fresh insights and content. I dropped the AI part because what it really means is automation in this sense. Building blog traffic is always about writing great content and observing what Google’s AI does to get you to the top of the search results

AI is just an algorithm that’s built on top of the existing data you have. In a sense, you fit an algorithm, to the data instead of fitting the data to the algorithm.

What that means for SEO and your blog traffic is this. You write content and Google and other search engines index it. Based on your blog’s metadata and content it will spit out a ranking in the Search Engine Results Page (SERP). If people find your content valuable and visit/link to it, Google then adjusts your ranking accordingly. So it’s a continuous learning feedback loop. Posting valuable content that’s shared and linked is what gets you to the top of the results page.

This, of course, has a lot of great benefits. If you’re running a blog to make money or a business, then this can generate lots of revenue for you. It could make you famous or change your life (which it did mine), but maintaining a blog is hard work. Google periodically changes its algorithm to thwart spammers, spammers, and blackhat SEO’ers from cluttering up the SERP with junk.

No Black Hat SEO

This goes without saying but doesn’t take the easy way out by buying backlinks or fake traffic, Google will find out one day and you’re site will drop in the rankings. So don’t think of trying any Black Hat SEO tricks. There are tons of places that offer 200 backlinks for $5 or 10,000 unique visitors for $25. They’re really shady and if it’s too good to be true, don’t do it. If Google penalizes you it will take a lot of time and effort to get out of the penalty box.

Write Great Content

It all comes down to this, writing great content. If you want a serious blog that attracts loyal readers and has ‘staying’ power, you have to write detailed and informative content. This is sometimes called evergreen content, meaning that it’s still applicable today even if you wrote it 10 years ago. Your posts need to be over 300 words minimum because anything less will be penalized by Google as just a nonserious blog, at least that’s been my experience. The norm for high-ranking posts on a given topic is somewhere between 2,000 and 5,000 words per post. Once you cross 5,000 you’re in the mini-novel area and only a very few bloggers get to 10,000 words. Those that do consistently rank on the first page of Google.

Imagine writing 10,000 words?

Use Google Analytics

You can use Google Analytics or some other script to monitor your site’s traffic. From that, you can gather a lot of clues on how people use your site. For example, I found that:

  • Tuesday’s are my busiest days.
  • My most popular topics are RapidMiner and Python tutorials
  • My SEO traffic started dropping in January 2020 hitting a low point in April 2020. Now it’s trending back to December 2019 levels

The moral of this story is, you can’t manage anything if you don’t measure it. Measuring is the first way for you to take a hard data approach to fix what’s wrong and build your traffic back up again.

Use Google Adwords

I extract great ranking keyword information from a Google Adwords data dump that I put into an Excel Pivot Chart report. There’s no AI magic behind this and you could do this quite easily yourself. Building this report is a great way to see keyword trends in Google and if your posts and content ‘align’ with it and your readership.

You can edit your content to switch out some words here and there without diluting your content. For example, if you run a travel blog and the word ‘vacation’ has more meaning than ‘trip,’ you should use that word instead of ‘trip’ in your content.

Over time you’ll see things happening on your site you can start asking questions like, “what type of content drives the most traffic, and on what days?” Building an Excel Pivot Table report won’t be able to answer that question but it can answer the question, “what’s my busiest day”, “what’s my optimal post per day quantity”, and “what’s my most popular category.”

Excel Pivot Table

  1. Gather Data. If you use Google Adwords, or another site statistic monitor, download your visitor data. You can choose what ever time frame you like, a good rule of thumb is about 2 months worth of data. You’ll need to get the number of hits and the date of the hits. Next, add this information to an Excel spreadsheet and add the following columns: Weekday, Number of Posts, and Category.
  2. Transform the Data

    Go back between the dates of your data download and fill in the columns for Weekday, make sure to match the date with the right weekday. Next, fill in the Number of Posts column with, you guessed it, the number of posts you did that day.

  3. Create a Category. When you get to the step of data mining your traffic, you’ll want to know what content drives your traffic and on what days. Adding a key of categories will help you accomplish that. I entered the number “1” if the post that day was about Forex, “2” if it was for stocks, etc. You get the point. If you posted more than one post on any given day and it was about more than one topic, you can add a second or third category column. You get as detailed as you want, its really up to you.
  4. Build the Excel Pivot Table. Once you have all your information, you can build the table. Go to Data > Pivot Table and follow the instructions. You can place the table in your existing worksheet or a new one (I usually go for a new worksheet). Select your data range to include the Weekday, # of Visitors, Posts Per Day, and Category.
  5. Once you did that you’ll see your new worksheet with a little floating menu system. You can drag and drop the fields into your new table. Drag the # of Visitors into the Drop Data Items area, drag the Weekday field into the Drop Column Fields area, drag Posts per Day to the Drop Row Fields area, and lastly drag the Category field to the Drop Page Fields area.

  6. Format the Table. Use Excel’s auto format function in the Pivot Table wizard to select the style of table you’d like to see. When your all done, your spreadsheet should look something like this below. Click on the image to download the actual Excel spreadsheet.

Small SEO Tools

There are a lot of free SEO tools out there that you can use too to do some analysis of your website. The best one is called Small SEO Tools. It’s not an integrated site like Moz or some other SEO checkup platform, but it can get the job done.

Tweak your Robots.txt file

In an effort to help search engines index my site better, I installed a robots.txt file. The reason why I did this will become clear in a minute. When you run a blog, search engines will parse your site and index it with a lot of duplicate data and posts. Duplicate data and posts can have a negative effect whereas the spider might think that your blog is a spam blog (splog). In the long run, this can cause lower rankings.

Why the spiders think that way is pretty logical, at least how I think they work! If you write a blog post, and it’s current, it will be on your main index page (1 copy). At least two more copies will reside in your category and archive sections. Essentially you’ll have three copies of the same post if the spider parses your site that day!

As soon as your post drops off the front page it will end up in your category and archive sections; you’ll still have two copies of the same post! The best solution is to tell the spider NOT to index one of those sections! It’s that simple!

I found a version of an optimized WordPress robots.txt file and discussion here. I then modified it to my needs and installed it in the root directory. So far it seems to be working but only time will tell how effective it will be. From what I’ve read, using a robots.txt file is a long-running experiment and you have to tweak it over time to maximize its effectiveness.

Switching Your CMS HURTS YOU!

It’s no secret that I’ve switched CMS’s so many times that it makes my head and my reader’s heads spin.  I’ve switched CMS’s many times as I struggled with WordPress, Expression Engine, Text Pattern, and Blot. Every time I did that I lost SEO.

I made a big migration to Jekyll and loved the static type of CMS’s ever since. Fast forward to today and I’ve pretty much settled on Pelican. Why? It’s a static CMS and its python powered. It does a great job of streamlining the YAML front end of a post and it’s fast to regenerate. The best part? I use rsync to upload new posts to my server and I use the S3 upload to make a backup of my site on Amazon. 

Yet, there’s ONE big problem that I’ve noticed. 100’s of my inbound links are all now dead and that messes with my SEO ranking. 

The solution is to create RewriteRules in my .htaccess file and here are some friendly tips on how to do it.

Moving away from WordPress

The biggest inbound link killer on my WordPress site was when I switched my permalink slug.  I went from a classic format of  ‘/year/month/day/my-post’ to the simpler one ‘/my-post.’  WordPress handles this change if you do it in WordPress. If you migrate out of WordPress, well all hell will break loose.

The simple fix is to add the following regular expression to your .htaccess file:

RewriteRule /[0-9] /[0-9] /[0-9] /(.*) /$1 [L,R=301] 

What this does is select any /year/month/day/my-post formatted URL and returns /my-post!  Awesome, but what about those pesky /_wp-content/uploads directory?  There are tons of images I put into my blog posts and now all those inserts don’t work.

The solution for me was to download the /wp-content folder and rename the folder as /_wp-content. I did this because I was using Blot.Im at the time and if I didn’t add the _, it would generate 100’s of images as blog posts.

RewriteRule /wp-content/uploads/(.*) /_wp-content/uploads/$1 [L,R=301] 

Of course, you don’t have to do this. You can move the /wp-content folder to its final destination and have all the links resolved. 

Moving away from Expression Engine

Oh, Expression Engine (EE) how I love and loathe thee. EE is a serious CMS. You can do a lot with it if you spend the time to architect it out. It’s powerful but complex. It’s too powerful for running a small blog like mine, but I liked it when I used it. 

The thing with EE is that it creates /blog/entry/my-post permalinks. the /blog/ part is the name of the channel and it could be anything you like. It could be /radio/entry/my-post or /store/entry/my-post. For the extended time my blog ran EE, several inbound links went to /blog/entry/my-post.

To solve this problem I created the following rule:

RewriteRule /blog/entry/(.*) /$1 [L,R=301] 

Now EE also had a URL for each category and that created havoc too. WordPress uses this method too and since I use Pelican now, the categories have become tags, or rather ‘tag.’

The solution was this:

RewriteRule /category/(.*) /tag/$1.html [L,R=301] 

Moving away from Blot.Im

Blot.Im is a favorite of mine. It’s simple to use and it’s making improvements with every update. Still, it’s not as feature-rich enough for my taste. I’m sure one day it will be. 

Blot uses ‘tagged’ instead of ‘tags’ and to solution to that is doing:

RewriteRule /tagged/(.*) /tag/$1.html [L,R=301] 

When Blogging first came out no one knew how the URL of your post would affect SEO. Hell, SEO wasn’t even a thing back then. Over time that’s changed and it’s become a big thing to think about as you build your content. I wrote about evergreen content before and you should always write content that will remain fresh for years to play the long SEO game. That doesn’t mean you can’t update it, no! You should frequently update your content with new and relevant information as it’s warranted, but let’s focus on the content and the url (permalink) first.

I write a lot of tutorials and if I want to start ranking for them I should think of the main keyword or keywords that describe my tutorials page. For example, I’ve written a lot of tutorials on RapidMiner and Python. So my main keywords will be ‘rapidminer’ and ‘tutorials.’ I’ve built my content page with loads of tutorials on one page and set the permalink to rapidminer-tutorials. Why? When someone goes to Google and they want to serach for RapidMiner Tutorials, they’ll write into the search box “rapidminer tutorials.” If my website ranks, then my permalink will have a search query in it! This tends to make the searcher click on your site!

Combining a well-thought-out permalink with evergreen content will have long-term benefits for your SEO!

Use Tags or Categories

I use Tags in my posts but I don’t choose them at random. I have a methodical process to create and use them because I think of them as trailblazing road signs for my readers. The theme I use autogenerates ‘Tag Pages’ and lists every page with an associated tag. If I make too many tags then I generate too many pages with short content. That gives me an SEO strikeout.

Before I tag any post I look at my list of predefined tags that I use. My list is pretty narrow but uses tags like:

  • SEO Strategy
  • Tutorials
  • RapidMiner
  • Python

Those tags are pretty powerful keywords and if there’s a page that lists all content related to ‘Python’ then I get a new page for Google to Index with the word [python](/tags/python/) in the Permalink (see my previous discussion above)!

Now, you don’t have to use tags but you can use categories so it’s really up to you and your site. Just make sure you have a handy way to change your tags or categories if you have to. It’s really hard to manually update each post with a new tag or category if you haven’t thought it through!

End Notes

This post is not done, I have way more to write about this topic because it’s always changing. If you liked this post update, please share it or drop me a comment on Twitter.

Calculating Historical Volatility


 Hi there!   This is one my most popular posts and I would love it if you became an RSS Reader!

The inspiration for my S&P500 Volatility Timing model came from rereading portions of Mandelbrot’s book, The (Mis)Behavior of Markets, and trolling around the Internet for Nassim Taleb’s research work on risk. I think both guys push the envelope on truly understanding unseen risk and those pesky financial asteroids. Since my model is currently being developed, I thought it would be worth my while to truly learn and understand how historical volatility (HV) is calculated. I first searched the Internet for any free data downloads of HV but came across several pay for data download sites.

One of them, iVolatility.com, seemed to have comprehensive data but it was expensive. One year’s worth of HV for one asset price would’ve cost me $5! So what does any engineering type person do in the face of expensive solutions? He (or she) build’s their own cheaper solution. I decided to calculate HV on my own after reading about it on wikipedia. Now, I’m submitting this analysis for peer review as I’m treading in unfamiliar waters. Please feel free to correct me if my computations or understanding of the material is wrong.

Wikipedia defines HV as:

The annualized volatility σ is the standard deviation σ of the instrument’s logarithmic returns in a year.


The generalized volatility σT for time horizon T in years is expressed as:

sigma_T = sigma sqrt{T}sigma_T = sigma sqrt{T}.

Note: There’s a flaw in the Wikipedia’s formula logic after the generalized volatility formula above as pointed out by C++ Trader (thanks for the catch). Please see the related links below for more information on the correct calculation of HV.

Note that the formula used to annualize returns is not deterministic, but is an extrapolation valid for a random walk process whose steps have finite variance.

So the first step is to calculate the S&P500′s logarithmic returns for a year. I’ll be using the weekly time series and I’ll analyze it in a handy Excel spreadsheet here: HV Example.xls

Once again I’ll turn to wikipedia for an explanation of logarithmic returns:

Academics use in their research natural log return called logarithmic return or continuously compounded return. The continuously compounded return is asymmetric thus clearly indicating that positive and negative percent returns are not equal. A 10% return results in 9.53% continuously compounded return while a -10% results in -10.53%. This clearly indicates that the investment will result in a dollar amount loss corresponding to the difference between the absolute values of the two numbers: 1% (this is an approximate equality).

  • Vi is the initial investment value
  • Vf is the final investment value

ROI_{Log} = lnleft(frac{V_f}{V_i}right)ROI_{Log} = lnleft(frac{V_f}{V_i}right).

  • ROILog > 0 is profit
  • ROILog < 0 is a loss
  • Doubling occurs when ROI_{Log}=ln(2)=69.3%ROI_{Log}=ln(2)=69.3%
  • Total loss occurs when ROI_{Log}to-inftyROI_{Log}to-infty.

This should be straightforward and I will calculate the weekly ROI for the S&P500. Why? Well I’m interested in calculating weekly HV so my Vi will be the week(1)’s closing price and Vf will be week(2)’s closing price. For the next iteration Vi will be the week(2)’s closing price and Vf will be week(3)’s closing price and so forth.

Next I created an Excel Macro that would calculate the natural log and simultaneously calculate the HV for 10, 20, and 30 days using the standard deviation of the daily logarithmic returns multiplied by 252 (see related links below).

There you have it, your very own weekly HV! Feel free to download the Excel macro and play with it. By all means, please critique my analysis and let me know if my logic is flawed! The more I learn about this, the more my ATS takes shape!

Update: The Excel Macro matches the output from iVolatility.com for the 10, 20, and 30 day HVs. Check!



Build an ETF Trend System in Excel


Today I wanted to share with you a part of the algorithmic back end to my ETF Trend System. Note, I said part, I’m not giving away all my secrets. It’s written completely in Excel, incredibly simple, and is a macro that you can import. The system works by using something called linear regression slope.

What’s that?

The easiest way to understand what linear regression slope is, is to think back to your basic statistics class. Linear regression is the best fit” line between a bunch of data points. A line is defined by the formula: y = mx+b, where y is your data point’s position on the y-axis, m is the slope, x is your data point’s position on the x-axis, and b is the slope intercept. What this ETF Trend following system does is place a best fit” line across several price data points (8, 13, and 26 weeks) and then calculate the slope of the line. If the slope is positive, you have an upward trending ETF. Conversely, if the slope is negative then you have a downward tending slope.

As the ETF trades in the markets, the price goes up, down, and sometimes consolidates inside a trend. When that happens the linear regression slope begins to flatten” out, meaning the slope becomes more horizontal. When combined with two or more periods, like an 8, 13, and 26 week period, you can see the overall short-term, medium-term, and long-term trends in a particular ETF. This makes for a great indicator that warns you of either a change in trend or a dip buying opportunity.

Ready to try it out for yourself? Just follow these easy steps and you’ll be ETF Trend following in no time. First you have to make sure you have Excel 2003 or a later version installed and access to ETF data.

Step 1: Get two years of ETF data. You’ll need your favorite ETF and two years of weekly closing data. Make sure you include the date, open, high, low, and closing prices. You can cheat, and follow along with my example by downloading this XLS: GSPC ETF Trend Example

In the example contained in this lesson, I use the S&P500 weekly data but you can substitute that with any ETF or index you’d like to follow

Step 2: Copy the macro code below and paste it into your Excel Visual Basic Editor. You can find this editor by going to Tools > Macros > Visual Basic Editor.


′ LinReg Macro
′ Macro recorded 3/8/2007 by Thomas Ott

Clear Data
Calc ETF Trends
ActiveCell.FormulaR1C1 = 8 Week”
ActiveCell.FormulaR1C1 = 13 Week”
ActiveCell.FormulaR1C1 = 26 Week”
ActiveCell.FormulaR1C1 = =SLOPE(R[-7]C[-2]:RC[-2],R[-7]C[-6]:RC[-6])”
Selection.AutoFill Destination:=Range(“G9:G54”), Type:=xlFillDefault
ActiveCell.FormulaR1C1 = =SLOPE(R[-12]C[-3]:RC[-3],R[-12]C[-7]:RC[-7])”
Selection.AutoFill Destination:=Range(“H14:H54”), Type:=xlFillDefault
ActiveCell.FormulaR1C1 = =SLOPE(R[-25]C[-4]:RC[-4],R[-25]C[-8]:RC[-8])”
Selection.AutoFill Destination:=Range(“I27:I54”), Type:=xlFillDefault
Format Columns
Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlLess,
Selection.FormatConditions(1).Font.ColorIndex = 3
Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlGreater,

Selection.FormatConditions(2).Font.ColorIndex = 50
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Selection.NumberFormat = 0.000000”
Selection.NumberFormat = 0.00000”
Selection.NumberFormat = 0.0000”
Selection.NumberFormat = 0.000”
Percent Change Function
ActiveCell.FormulaR1C1 = % Change”
ActiveWindow.SmallScroll Down:=18
ActiveCell.FormulaR1C1 = =(RC[-5]-R[-51]C[-5])/R[-51]C[-5]”
ActiveWindow.SmallScroll Down:=6
Selection.Style = Percent”
Selection.NumberFormat = 0.0%”
Selection.NumberFormat = 0.00%”
Selection.AutoFill Destination:=Range(“J53:J54”), Type:=xlFillDefault
End Sub

Step 3: Save the file and then activate the macro by clicking Run. You should see that the macro created four new columns and color coded the slopes. It should look something like this XLS: GSPC ETF Trend Example 2

Step 4: This step is optional but I highly recommend you do this. You should build a chart from that 8, 13, and 26 week slopes. This will help you identify the peaks and valleys in the ETFs (or index’s) trend. See our last XLS example: GSPC ETF Trend Example 3

There you have it! A very simple and fun way for you to build a basic ETF trend system. Please feel free to modify the macro, or add to it as you see fit. If you have any questions or comments, please feel free to contact me.


Blog Traffic Analysis Using Data Mining


Yes, you read correctly. You can data mine your blog’s traffic using a simple web statistics data collector like Google Adwords. I’m doing it right now for Neural Market Trends and I’m finding out some very interesting information.

I found out that:

  • Tuesday’s are my busiest days.
  • The optimal amount of posts per day should be 2.
  • The most popular post category happens to be my posts about Forex and YALE.

A lot of the above information I gleaned from a Google Adwords data dump that I put into an Excel Pivot Chart report. There’s no neural net magic behind that and you could do this quite easily yourself. Its when I built a neural net and mined the data that I discovered some unique relationships. These relationships should help me tweak my content to better serve my readers.

One of the things I learned from this little exercise is that I have a selective group of readers on Saturdays. Welcome! 🙂


%d bloggers like this: