Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to calculate the trendline for stock price

I am trying to calculate and draw the trendlines for stock prices. I did some searches and thought for a whole day, there is no a really good idea on how to do.

I have daily price history and want to find the cross point between trendline and price line.

Could you provide some ideas or guidances?

Thank you so much!!!

Trendline Sample

like image 635
Carl Zheng Avatar asked May 03 '17 20:05

Carl Zheng


People also ask

How do you calculate the trendline value?

To calculate the trend line for the graph of a linear relationship, find the slope-intercept form of the line, y = mx + b, where x is the independent variable, y is the dependent variable, m is the slope of the line, and b is the y-intercept.


2 Answers

import pandas as pd
import quandl as qdl
from scipy.stats import linregress

# get AAPL 10 years data

data = qdl.get("WIKI/AAPL", start_date="2007-01-01", end_date="2017-05-01")

data0 = data.copy()
data0['date_id'] = ((data0.index.date - data0.index.date.min())).astype('timedelta64[D]')
data0['date_id'] = data0['date_id'].dt.days + 1

# high trend line

data1 = data0.copy()

while len(data1)>3:

    reg = linregress(
                    x=data1['date_id'],
                    y=data1['Adj. High'],
                    )
    data1 = data1.loc[data1['Adj. High'] > reg[0] * data1['date_id'] + reg[1]]

reg = linregress(
                    x=data1['date_id'],
                    y=data1['Adj. High'],
                    )

data0['high_trend'] = reg[0] * data0['date_id'] + reg[1]

# low trend line

data1 = data0.copy()

while len(data1)>3:

    reg = linregress(
                    x=data1['date_id'],
                    y=data1['Adj. Low'],
                    )
    data1 = data1.loc[data1['Adj. Low'] < reg[0] * data1['date_id'] + reg[1]]

reg = linregress(
                    x=data1['date_id'],
                    y=data1['Adj. Low'],
                    )

data0['low_trend'] = reg[0] * data0['date_id'] + reg[1]

# plot

data0['Adj. Close'].plot()
data0['high_trend'].plot()
data0['low_trend'].plot()

enter image description here

like image 150
heyu91 Avatar answered Oct 13 '22 00:10

heyu91


Some ideas & guidances:

Based on your statement (cit.:)
I did some searches and thought for a whole day, there is no a really good idea on how to do.

I can make you sure, there is no universally good idea, how to solve this, but this should not make you nervous. Generations of CTAs have spent their whole lives on doing this to their individual horizons of the best efforts they could have spent on mastering this, so at least, we can learn on what they have left us as a path to follow.

Trend is more an OPINION than a somewhat calculus-based line

1) DEFINE a Trend:
As an initial surprise, one ought consider a trend to be rather an exosystem-driven ( extrinsic ) feature, which is more related to an opinion, than to a TimeSeries Data ( observable ) history.

In other words, once one realises, that the information about a trend is simply not present internally in the TimeSeries dataset, the things will start to clear up significantly.

2) given one believes strong enough into her/his Trend-identification methods,
one can but EXTEND such Trend-indication, as a line-of-belief, into FUTURE ( a conjecture )

3) The MARKET & only The Market VALIDATES ( or ignores ) such one's "accepted"-belief.

4) SHARED beliefs RE-CONFIRM such a line-of-belief as a majority respected Trend-indication ( measured by Market risk exposed equity, not by a popular vote, the less by crowd-shouted or CTAs' self-promoting squeeks )


Does it ever work?

The USDCAD example screen above( zoom-out into a new window for a full-scale indepth view ) reflects all these, plus adds a few instances of FUNDAMENTAL EVENT, that were introduced "across" the technically drafted ( quantitatively supported ) principal attractors, showing a part of a real life of the flow of the river called an FX-trading.

like image 29
user3666197 Avatar answered Oct 13 '22 01:10

user3666197